整体处理流程

  1. 1. 首先确认uwsgi的配置 虚拟环境 修改为socket接口;项目穿层;
  2. 2. supervisor部分确认启动命令即可
  3. 3. Nginx 部分书写转发 添加uwsgi配置以及端口;
  4. 4. Nginx 修改配置 添加静态文件目录及转发;
  5. 5. 修改settings配置,同时指定静态文件目录,执行迁移
  6. 6. supervisor控制工具重启Django项目,无需调试其他进程或者端口。
  7. 7. 备注:访问端口(入口)由Nginx控制,socket仅提供与Nginxuwsgi的交互

示意图

Nginx supervisor uwsgi MySQL - 图1

细节处理

  1. 1. 先从后端搞起,uwsgi + django
  2. 1. 本地打包上传至服务器,xftp,并且输出requirements.txt文件;
  3. 2. 解压缩,检查python环境配置[自编译];
  4. 3. 在主项目同级目录下新建虚拟环境 python3 -m venv envb;
  5. 4. 升级pip3, 安装全部依赖,若有错误使用 python manage.py runserver调试错误;
  6. 5. 检查MySQL数据库配置,表库数据是否一致,与Django项目连接是否正常;
  7. 6. 启动虚拟环境,检查环境变量,书写UWSGI文件,特别注意文件路径:主项目第一层,第二层以及uwsgi文件所属,指定虚拟环境位置;
  8. 7. 设置supervisor 指定工作进程数量 核数 * 2 + 1 , 指定uwsgi启动以及虚拟环境启动的命令;
  9. 8. 注意每个阶段的横向调试,三个部件,端口占用检查;
  10. 2. 注意事项
  11. 1. 重要的包 pymysql mysqlclient
  12. 2. UWSGI & supervisor是关联启动项目,因此杀死进程时,需要先杀死spuervisor 然后杀死UWSGI
  13. 3. 补充 kill 是基于 pid 杀死进程,如kill 3389; pkill 是基于进程名字;
  14. 4. 三个路径很重要 虚拟环境的启动路径,uwsgi.ini文件的位置,manage.py文件所在的位置;分别用于ev, start, test
  15. /tmp/Blog/Blog2/uwsgi.ini /tmp/Blog/envb/bin/ source activate /tmp/Blog/Blog2/manage.py
  16. /etc/supervisord.conf
  17. 5. Blog项目占用 20001端口;
  18. 6. uwsgi启动命令 /tmp/Blog/envb/bin/uwsgi --ini /tmp/Blog/Blog2/uwsgi.ini;该路径由supervisor工具进行托管;
  19. 5. uwgi文件中 使用 socket =0.0.0.0:8000端口与Nginx联动

测试启动

  1. supervisord -c /etc/supervisord.conf
  2. Unlinking stale socket /tmp/supervisor.sock
  3. supervisorctl -c /etc/supervisord.conf
  4. Blog RUNNING pid 11465, uptime 0:00:24
  5. supervisor> status
  6. Blog RUNNING pid 11465, uptime 0:00:32
  7. supervisor> \q
  8. *** Unknown syntax: \q
  9. supervisor> exit()

新增 Nginx 的配置

原有配置备份

  1. server {
  2. listen 10001;
  3. server_name localhost;
  4. charset utf-8;
  5. location / {
  6. proxy_pass http://s25real_server;
  7. }
  8. }

修改后的配置

  1. server {
  2. listen 10001;
  3. server_name localhost;
  4. charset utf-8;
  5. location / {
  6. uwsgi_pass 0.0.0.0:20001;
  7. include uwsgi_params;
  8. }
  9. }

重启 Nginx 配置并且重启项目

  1. nginx -t
  2. nginx -s reload
  3. supervisorctl -c /etc/supervisord.conf
  4. >restart Blog

阶段性效果

Nginx supervisor uwsgi MySQL - 图2

特别说明

  1. UWSGINginx 的交互集中通过sokcet 0.0.0.0:20001完成,之后由 Nginx 指定 10001端口代理UWSGI的服务;

未使用Nginx 静态资源代理前的访问速度

Nginx supervisor uwsgi MySQL - 图3

激活项目虚拟环境并且收集静态文件到指定目录

  1. cd /tmp/Blog/envb/bin/
  2. source activate
  3. cd /tmp/Blog/Blog2/whereabouts
  4. vim settings.py
  5. # 修改如下
  6. 用于部署的静态文件(绝对路径),可以通过python manage.py collectstatic收集
  7. simpleui依赖的配置项
  8. STATIC_ROOT = '/bstatic/'
  9. 执行命令
  10. python manage.py collectstatic

拷贝提示以及检查文件是否拷贝成功

  1. Found another file with the destination path 'summernote/lang/summernote-uz-UZ.min.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
  2. Found another file with the destination path 'summernote/lang/summernote-en-US.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
  3. Found another file with the destination path 'summernote/lang/summernote-pt-PT.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
  4. 2220 static files copied to '/bstatic'.

在Nginx中配置静态资源

  1. server {
  2. listen 10001;
  3. server_name localhost;
  4. charset utf-8;
  5. location / {
  6. uwsgi_pass 0.0.0.0:20001;
  7. include uwsgi_params;
  8. }
  9. location /static {
  10. alias /bstatic;
  11. }

补充设置对媒体文件的穿透

  1. location /media {
  2. autoindex on;
  3. alias /tmp/Blog/Blog2/media/;
  4. }

老师笔记

nginx+uWSGI+django+virtualenv+supervisor发布web服务器 - py鱼 - 博客园 (cnblogs.com)