Nginx+uWSGI+Django 实现动静分离

Django 自带的Socket Server 性能较差 真实的生产环境中不会使用这样的wsgi 

为解决这一问题 首先使用性能较优的uWSGI+Django 部署

1.安装

  pip3 install uwsgi

  使用豆瓣源 pip3 install -i https://pypi.doubanio.com/simple/ uwsgi

  在centos7安装时如果提示 SSLError("Can't connect to HTTPS URL because the SSL module is not available.

  建议检查  rpm -aq|grep openssl 是否缺少 openssl-devel包

  安装 yum install openssl-devel -y

  使用find / -name 'python*' 找到当初下载安装文件的目录

  执行make

  执行make altinstall

  不用重写配置文件 因为setup中包含了自动寻找sll的方法 这里使用的时3.6.5 之前的版本可能会需要修改配置文件

  Successfully installed uwsgi-2.0.17.1

 

2.启动 

2.1直接启动

进入到项目目录中 (是部署的项目目录 不是uwsgi安装目录)

uwsgi --http 192.168.31.93:8080 --file nb_CRM/wsgi.py --static-map=/static=static

 

 

2.2使用配置文件启动

在项目文件夹所在的同级目录创建script目录用来保存ini文件

uwsgi --ini uwsgi.ini

停止

uwsgi --stop uswgi.pid

重新载入配制文件

uwsgi --reload uwsgi.pid

[uwsgi]
#项目目录
chdir=/opt/nb_CRM/
#启动uwsgi的用户名和用户组
uid=root
gid=root
#指定项目的application
module=nb_CRM.wsgi:application
#指定sock的文件路径
socket=/opt/script/uwsgi.sock
#启用主进程
master=true
#进程个数
workers=5
#pid文件路径
pidfile=/opt/script/uwsgi.pid
#自动移除unix Socket和pid文件 当服务停止的时候
vacuum=true
#序列化接收的内容
thunder-lock=true
#启用线程
enable-threads=true
#设置自动中断时间
harakiri=30
#设置缓冲
post-buffering=4096
#设置日志目录
daemonize=/opt/script/uwsgi.log
#指定ip端口
http=192.168.31.93:8080
#指定静态文件
static-map=/static=/opt/nb_CRM/static

 

 

因为uwsgi处理动态请求(form表单 动态渲染html mysql亲求)较强 而静态较弱 所以将静态请求(html css 图片)交由Nginx来处理

 

安装Nginx

配置yum源

vim /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

安装

yum -y install nginx

启动 nginx 

/etc/init.d/nginx start

在centos 7 下安装的nginx启动命令

启动命令    service nginx start (当 /etc/init.d/nginx不存在时)

停止命令    service nginx stop

重启命令    service nginx restart

给nginx添加配置文件

cd /etc/nginx/conf.d

当提示80端口被占用 nginx启动失败的时候 

sudo fuser -k 80/tcp 干掉占用端口的进程

配置文件

cd /etc/nginx/conf.d/

 

server{
        listen:80;
        server_name:192.168.31.93;
        access_log /var/log/nginx/access.log main;#启用nginx访问日志
        charset utf-8;
        gzip on;#启用压缩
        gzip_types text/html application/x-javascript text/css application/xml;#支持的压缩格式
        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
        location / {
        include uwsgi_params;#导入和uswgi的通信模块
        uwsgi_connect_timeout 30;
        uwsgi_pass unix:/opt/script/uwsgi.sock;
        }
}

   如果cat /var/log/nginx/error.log 提示connect() to unix:/opt/script/uwsgi.sock failed (13: Permission denied) while connecting to upstream

 首先给权限nginx可以访问 .sock 如果不行给目录chown 用户和用户组 

  再不行看是否被SELINUX阻止

以下方法 可以直接禁用规则 但是会有安全隐患 还是建议有空的时候配置好访问规则https://linuxtoy.org/archives/selinux-introduction.html

SELinux 可以阻止程序访问未被授权的目录 缓解 0 day漏洞的攻击

vi /etc/selinux/config

#SELINUX=enforcing #注释掉

#SELINUXTYPE=targeted #注释掉

SELINUX=disabled #增加

:wq! #保存退出

setenforce 0 #使配置立即生效

 

posted @ 2018-11-15 23:48  涤月  阅读(542)  评论(0)    收藏  举报