使用Gunicorn部署项目

Gunicorn 是一个由纯Python实现的UNIX类操作系统平台下WSGI服务,它非常容易部署和使用,而且没有别的依赖

我使用的是nginx+gunicorn进行部署,如果你愿意,你用可以只使用Gunicorn

另外,这个方法只适用于linux系统下

安装Gunicorn

  1. pip install gunicorn

运行gunicorn

你可以单纯使用命令 ``nohup gunicorn deeru.wsgi & `` 运行,但这样一旦gunicorn意外停止,你的网站就无法访问。官方介绍了Gaffer、Runit、Supervisor等多种工具帮助你以守护进程的方式运行,详见:http://docs.gunicorn.org/en/stable/deploy.html#monitoring

这里使用的是 Systemd 的方式运行

  • 新建 /etc/systemd/system/gunicorn.service:
  1. [Unit]
  2. Description=gunicorn daemon
  3. Requires=gunicorn.socket
  4. After=network.target
  5.  
  6. [Service]
  7. PIDFile=/run/gunicorn/pid
  8.  
  9. # 改为你自己的用户
  10. User=someuser
  11. Group=someuser
  12.  
  13. RuntimeDirectory=gunicorn
  14.  
  15. # DeerU路径
  16. WorkingDirectory=/home/xxx/DeerU
  17.  
  18. # 如果是用了虚拟环境,需要用虚拟环境中gunicorn的绝对路径 '/home/xx/deeru_env/bin/gunicorn'
  19.  
  20. # workers单核cpu建议不超过2
  21.  
  22. # 其他参数参照gunicorn文档
  23.  
  24. # 我socket来进行nginx与gunicorn之间的的通信,你也可以改为tcp方式--bind 127.0.0.1:9001 ,这里不再叙述tcp通信方式的配置
  25.  
  26. ExecStart=/home/xx/deeru_env/bin/gunicorn --workers 2 --pid /run/gunicorn/pid --bind unix:/run/gunicorn/socket deeru.wsgi
  27.  
  28. ExecReload=/bin/kill -s HUP $MAINPID
  29. ExecStop=/bin/kill -s TERM $MAINPID
  30. PrivateTmp=true
  31.  
  32. [Install]
  33. WantedBy=multi-user.target
  • 新建 /etc/systemd/system/gunicorn.socket:
  1. [Unit]
  2. Description=gunicorn socket
  3.  
  4. [Socket]
  5. ListenStream=/run/gunicorn/socket
  6.  
  7. [Install]
  8. WantedBy=sockets.target
  • 新建 /etc/tmpfiles.d/gunicorn.conf:
  1. d /run/gunicorn 0755 someuser somegroup -
  • 设置开机启动并开始gunicorn services:
  1. systemctl enable gunicorn.socket
  2.  
  3. systemctl start gunicorn.socket
  • 修改nginx配置:
  1. ...
  2.  
  3. http {
  4.  
  5. ...
  6.  
  7. upstream app_server {
  8. server unix:/tmp/gunicorn.sock fail_timeout=0;
  9.  
  10. # TCP 方式改为
  11. # server 192.168.0.7:8000 fail_timeout=0;
  12. }
  13.  
  14.  
  15.  
  16. server {
  17.  
  18. ...
  19.  
  20. listen 80;
  21.  
  22. location / {
  23.  
  24. try_files $uri @proxy_to_app;
  25. }
  26.  
  27. location @proxy_to_app {
  28. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  29. proxy_set_header X-Forwarded-Proto $scheme;
  30. proxy_set_header Host $http_host;
  31. # we don't want nginx trying to do something clever with
  32. # redirects, we set the Host: header above already.
  33. proxy_redirect off;
  34. proxy_pass http://app_server;
  35. }
  36.  
  37. # 静态文件
  38. location ~ ^/(static|media)/ {
  39. root /home/xxx/project/DeerU;
  40. add_header Access-Control-Allow-Origin *;
  41. expires 864000;
  42. }
  43.  
  44. }
  45. }
  • 重启nginx:
  1. nginx -s reload