以前部署了一个django测试项目,使用django自带的manage的socket服务,经过nginx转发完成的。看这里html
如今以为能够上生产环境了。因此决定使用nginx+uwsgi的方式进行部署:python
环境:centos(7.3) python(3.6) django(1.11) uwsgi (2.0) nginx(1.12)nginx
先安装uwsgidjango
由于我使用的python3,因此先安装了pip也是python3版本的。并命名为pip3了vim
pip3 install uwsgicentos
等待安装完成。app
安装完毕后whereis uwsgi显示安装位置:socket
uwsgi: /etc/uwsgi.ini /usr/local/bin/uwsgi测试
/etc/uwsgi.ini是配置文件ui
直接修改配置文件为:
[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