Django + Uwsgi +Nginx生产环境部署
python manage.py runserver 0.0.0.0:80 ,一定不要用这个轻量级Server作为你的生产环境下的Server,因为它只能用于开发自测阶段。它既没有安全审计功能,而且又是单线程的。
生产坏境部署当然是Docker+Uwsgi+Nginx。
准备条件:
一个完整的项目文件。
1.安装uwsgi
uwsgi是python的一个模块,安装uwsgi只需简单的pip命令就可以了,pip3 install uwsgi
2.启动项目
uwsgi --http :80 --chdir /path/to/project --home=/path/to/env --module project.wsgi
--home 指定virtualenv 路径,如果没有可以去掉。project.wsgi 指的是 project/wsgi.py 文件
3. ini 配置文件启动
[uwsgi] socket = :8000 # http = :8000 chdir = /path/to/project wsgi-file = project/wsgi.py processes = 4 # 与服务器cpu数相同即可 threads = 2
这里我要讲一下http 和socket的区别:
http:nginx 和 uwsgi 中间走的是 http 协议,文本。
socket:nginx 和 uwsgi 中间走的是 wsgi 协议,二进制
性能的话是socket更优,但是如果是前后端分离的场景,我们就需要采用http了。
修改nginx default.conf
server { listen 80; server_name localhost; charset utf-8; client_max_body_size 75M; location /media { alias /path/to/project/media/; } location /static { alias /path/to/project/static/; } location = /favicon.ico { rewrite (.*) /static/images/favicon.ico; } location / { # proxy_pass http://127.0.0.1:8000; include uwsgi_params; uwsgi_pass 127.0.0.1:8000; } }
uwsgi 常用配置参数
chdir=/xxx/xxx # 指定项目目录 home=/xxx/xxx # 指定虚拟环境变量 wsgi-file=xxx # 指定加载WSGI文件 socket=xxx # 指定uwsgi的客户端将要连接的socket的路径(使用UNIX socket的情况)或者地址(使用网络地址的情况)。 callable=xxx # uWSGI加载的模块中哪个变量将被调用 master=true # 指定启动主进程 processes=4 # 设置工作进程的数量 threads=2 # 设置每个工作进程的线程数 vacuum=true # 当服务器退出时自动删除unix socket文件和pid文件 logfile-chmod=644 # 指定日志文件的权限 daemonize=%(chdir)/xxx.log # 进程在后台运行,并将日志打印到指定文件 pidfile=%(chdir)/xxx.pid # 在失去权限前,将主进程pid写到指定的文件 uid=xxx # uWSGI服务器运行时的用户id gid=xxx # uWSGI服务器运行时的用户组id procname-prefix-spaced=xxx # 指定工作进程名称的前缀
Dockerfile环节:
FROM python:3.6
ENV TZ "Asia/Shanghai" # 设置时区
RUN pip3 install -r /root/requirement.txt -i https://pypi.doubanio.com/simple/ \
&& pip3 install uwsgi \
&& pip3 install https://codeload.github.com/sshwsfc/xadmin/zip/django2
CMD uwsgi /code/uwsgi.ini