之前部署了一个django测试项目,使用django自带的manage的socket服务,通过nginx转发完成的。看这里
现在觉得可以上生产环境了。所以决定使用nginx+uwsgi的方式进行部署:
环境:centos(7.3) python(3.6) django(1.11) uwsgi (2.0) nginx(1.12)
先安装uwsgi
因为我使用的python3,所以先安装了pip也是python3版本的。并命名为pip3了
pip3 install uwsgi
等待安装完成。
安装完毕后whereis uwsgi显示安装位置:
uwsgi: /etc/uwsgi.ini /usr/local/bin/uwsgi
/etc/uwsgi.ini是配置文件
直接修改配置文件为:
[uwsgi] socket = 127.0.0.1:3031 #socket使用的端口 chdir = /aliecs_django#项目路径 wsgi-file = /aliecs_django/aliecs_django/wsgi.py#项目wsgi.py文件位置,可以是相对路径 processes = 2#进程数量,可以设定为同CPU核心数量 threads = 2#每个进程开启线程的数量 stats = 127.0.0.1:9191#uwsgi的状态端口
然后可以直接使用
uwsgi --ini /etc/uwsgi.ini
就可以启动了
不过这样的话还不太方便。所以配置一个systemd服务:
vim /usr/lib/systemd/system/uwsgi.service
[Unit] Description=uWSGI Emperor After=syslog.target [Service] ExecStart=/usr/local/bin/uwsgi --ini /etc/uwsgi.ini # Requires systemd version 211 or newer RuntimeDirectory=uwsgi Restart=always KillSignal=SIGQUIT Type=notify StandardError=syslog NotifyAccess=all [Install] WantedBy=multi-user.target
systecmctl enable uwsgi
添加到开机启动
最后修改NGINX配置:
原先是直接使用转发的
location / { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
现在修改为:
location / { include uwsgi_params; uwsgi_pass 127.0.0.1:3031; }
顺利部署完毕
后记:其实部署的时候发现了一个诡异的问题,
在settings.py
INSTALLED_APPS = [
'utils',]
自己导入了一个utils的apps然后发现这个app不能被导入
困扰了我很久,最终竟然发现是因为utils目录下缺少__init__.py文件造成的
在python的模块中,如果导入的是包(目录)那么这个包(目录)下必须有__init__.py文件
参考资料:uwsgi: http://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html
nginx: http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html
systemd: http://uwsgi-docs.readthedocs.io/en/latest/Systemd.html