在前面的章节中我们使用 python manage.py runserver 来运行服务器。这只适用测试环境中使用。
正式发布的服务,我们需要一个可以稳定而持续的服务器,比如apache, Nginx, lighttpd等,本文将以 Nginx 为例。

遇见三个问题:

  1. django,splite3 环境安装 ,与检测 , 2.nginx 部署server 3.uwsgi 与 nginx 相关联 ,缺少在指定uwsgi_params 错误日志文件,问题定位

总结:

部署流程:

  1. 上传项目Django
  2. 部署nginx
  3. 部署uwsgi

  1. cat /usr/local/nginx/logs/error.log

0.django

0.1.python manage.py migrate

检测环境

  1. 项目结构
  2. ├── agesite
  3. ├── asgi.py
  4. ├── __init__.py
  5. ├── __pycache__
  6. ├── settings.py
  7. ├── urls.py
  8. └── wsgi.py
  9. ├── blog
  10. ├── core
  11. ├── gender.py
  12. ├── getting_young.py
  13. ├── __pycache__
  14. ├── star.py
  15. └── view.py
  16. ├── client_django.py
  17. ├── data
  18. └── celeba_hq_npy
  19. ├── db.sqlite3
  20. ├── manage.py
  21. ├── mime.types
  22. ├── mypackages.txt
  23. ├── nginx.conf
  24. ├── requirements.txt
  25. ├── scripts
  26. ├── debug_uwsgi.sh
  27. ├── env.sh
  28. ├── nginx.sh
  29. ├── read.md
  30. ├── run.sh
  31. └── uwsgi.sh
  32. ├── static
  33. └── admin
  34. ├── test.py
  35. ├── util
  36. ├── __init__.py
  37. └── logger.py
  38. ├── uwsgi9090.ini
  39. ├── uwsgi_params
  40. ├── weights
  41. ├── net_G.onnx
  42. ├── .onnx
  43. ├── .onnx
  44. └── wing2.onnx
  45. └── wsgi.py

0.2 error

  1. 问题:django.db.utils.NotSupportedError: URIs not supported
  2. 描述:原始
  3. cat /usr/local/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py |grep True
  4. 'True. It will be overridden with False. Use the '
  5. kwargs.update({'check_same_thread': False, 'uri': True})
  6. 修改:
  7. cat /usr/local/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py |grep True
  8. 'True. It will be overridden with False. Use the '
  9. kwargs.update({'check_same_thread': False, 'uri': False})

1. nginx

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强。

它具有反向代理服务器的所有特点,并且配置简单,支持对大于1kb的文件进行压缩,静态文件缓存,可以大大提高访问效率。Nginx接受来自客户端的Http请求发送给uWSGI,uWSGI处理请求并将关键信息传递给web应用(django,flask等),应用返回Response经由uWSGI发送给Nginx,Nginx再发送给客户端。
————————————————

原文链接:https://blog.csdn.net/shu_8708/article/details/79068581

1.0 nginx

centos yum install nginx

1.1 重启/停止/关闭

  1. 1. 首先利用配置文件启动nginx
  2. 命令: nginx -c /usr/local/nginx/conf/nginx.conf
  3. 重启服务: service nginx restart
  4. 2. 快速停止或关闭Nginxnginx -s stop
  5. 3. 正常停止或关闭Nginxnginx -s quit
  6. 4. 配置文件修改重装载命令:nginx -s reload

1.1linux下查找nginx里的nginx.conf文件地址方法

  1. nginx -t
  2. ps aux | grep [n]ginx
  3. nginx启动服务提示98: Address already in use错误的解决
  4. sudo nginx -s stop
  5. nginx: [error] invalid PID number "" in "/usr/local/webserver/nginx/logs/nginx.pid"
  6. nginx -c /usr/local/nginx/conf/nginx.conf
  7. nginx -s reload
  8. nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in use)
  9. 1.先使用ps -e | grep nginx查看是否已经启动了nginx
  10. 2.如果没有的话则按照提示,查看0.0.0.0:80端口谁占用了,使用netstat -ltunp命令,可以看到
  11. logs
  12. /usr/local/nginx/logs

1.2 nginx.conf

  1. #user nobody;
  2. worker_processes 1;
  3. #error_log logs/error.log;
  4. #error_log logs/error.log notice;
  5. #error_log logs/error.log info;
  6. #pid logs/nginx.pid;
  7. events {
  8. worker_connections 1024;
  9. }
  10. http {
  11. include mime.types;
  12. default_type application/octet-stream;
  13. client_max_body_size 10m;
  14. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  15. # '$status $body_bytes_sent "$http_referer" '
  16. # '"$http_user_agent" "$http_x_forwarded_for"';
  17. #access_log logs/access.log main;
  18. sendfile on;
  19. #tcp_nopush on;
  20. #keepalive_timeout 0;
  21. keepalive_timeout 65;
  22. #gzip on;
  23. server {
  24. listen 8300; # 修改端口号
  25. server_name localhost;
  26. #charset koi8-r;
  27. #access_log logs/host.access.log main;
  28. location / {
  29. root html;
  30. index index.html index.htm;
  31. }
  32. }
  33. server {
  34. listen 8000;
  35. server_name 127.0.0.1;
  36. #115.29.XXX.XXX;
  37. location / {
  38. include uwsgi_params;
  39. uwsgi_pass 0.0.0.0:8200; #//必须和uwsgi中的设置一致
  40. #proxy_set_header Host $host;
  41. uwsgi_param UWSGI_SCRIPT agesite.wsgi; #//入口文件,即wsgi.py相对于项目根目录的位置,“.”相当于一层目录
  42. uwsgi_param UWSGI_CHDIR /home/agesite; # //项目根目录
  43. index index.html index.htm;
  44. #client_max_body_size 35m;
  45. }
  46. location /static/ {
  47. alias /home/agesite/static; #静态资源路径
  48. }
  49. }
  50. include vhost/*.conf;
  51. }

1.3 error

  1. nginx: [emerg] open() "/home/agesite/mime.types" failed (2: No such file or directory) in /home/agesite/nginx.conf:18
  2. 解决方法:创建文件 /home/agesite/mime.types

nginx: [error] invalid PID number “” in “/usr/local/nginx/logs/nginx.pid”

[root@AY14060515464627034cZ home]# service nginx stop
Stopping nginx: [ OK ]
[root@AY14060515464627034cZ home]# service nginx start
Starting nginx: [ OK ]

https://code.ziqiangxuetang.com/django/django-nginx-deploy.html

2.uwsgi 配置详解

https://www.cnblogs.com/wspblog/p/8575101.html
uWSGI、WSGI和uwsgi
720785-20180315175024706-1983173921.jpg

2.0 uwsgi

pip3 install uwsgi —upgrade

2.1 启动/重启/停止

uWSGI 通过 xxx.ini 启动后会在相同目录下生成一个 xxx.pid 的文件,里面只有一行内容是 uWSGI 的主进程的进程号。
#### 启动:
uwsgi —ini xxx.ini
#### 重启:
uwsgi —reload xxx.pid
#### 停止:
uwsgi —stop xxx.pid

2.2 doc

uwsgi doc

2.2.1 uwsgi 测试

  1. uwsgi --http :8000 --wsgi-file wsgi.py
  2. uwsgi --http :8000 --wsgi-file test.py
  3. test.py
  4. import sys
  5. from django.core.wsgi import get_wsgi_application
  6. # test.py
  7. def application(env, start_response):
  8. start_response('200 OK', [('Content-Type','text/html')])
  9. return [ bytes("Hello World " + sys.executable +sys.version, encoding = "utf8")]

2.2.1.0 参数

  1. [uwsgi]
  2. http=8000
  3. socket = 127.0.0.1:9090
  4. master = true
  5. #//主进程
  6. vhost = true
  7. # //多站模式
  8. no-site = true
  9. # //多站模式时不设置入口模块和文件
  10. workers = 2
  11. #//子进程数
  12. reload-mercy = 10
  13. vacuum = true
  14. # //退出、重启时清理文件
  15. max-requests = 1000
  16. limit-as = 512
  17. buffer-size = 30000
  18. pidfile = /home/agesite/uwsgi9090.pid
  19. # //pid文件,用于下面的脚本启动、停止该进程
  20. daemonize=/home/agesite/agesite.log
  21. pythonpath=/usr/local/bin/python3.6
  22. #/usr/local/lib/python3.6
  23. #项目目录 (后端项目目录)
  24. chdir=/home/agesite
  25. #项目中wsgi.py文件的目录,相对于项目目录
  26. wsgi-file=wsgi.py

2.2.2.1 uwsgi 参数

  1. [uwsgi]
  2. # 对外提供 http 服务的端口
  3. http = :8000
  4. #the local unix socket file than commnuincate to Nginx 用于和 nginx 进行数据交互的端口
  5. socket = 127.0.0.1:8001
  6. # the base directory (full path) django 程序的主目录
  7. chdir =/home/opadm/mms_webserver/src
  8. # Django's wsgi file
  9. wsgi-file =src/wsgi.py
  10. # maximum number of worker processes
  11. processes = 100
  12. #thread numbers startched in each worker process
  13. threads = 10
  14. #一个高阶的cheap模式,在启动的时候只会分配n个工作进程,并使用自适应算法启动新的进程
  15. cheaper = 10
  16. #在经过sec秒的不活跃状态的进程会被销毁(进入了cheap模式),并最少保留cheaper指定的进程数
  17. idle = 3600
  18. #monitor uwsgi status 通过该端口可以监控 uwsgi 的负载情况
  19. stats = 127.0.0.1:9000
  20. #设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
  21. harakiri = 60
  22. #当一个请求被harakiri杀掉会,会输出一条日志
  23. harakiri-verbose = true
  24. #开启内存使用情况报告
  25. memory-report = true
  26. #设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
  27. reload-mercy = 10
  28. #设置工作进程使用虚拟内存超过N MB就回收重启
  29. reload-on-as= 1024
  30. #自动给进程命名
  31. auto-procname = true
  32. #为进程指定前缀
  33. procname-prefix-spaced = xc-mms
  34. #设置工作进程每处理N个进程就会被回收重启
  35. max-requests=500000
  36. #设置工作进程使用物理内存超过N MB就回收重启
  37. reload-on-rss=100
  38. #设置socket超时时间,默认4秒
  39. socket-timeout=10
  40. #限制http请求体的大小(Bytes)
  41. limit-post=4096
  42. # clear environment on exit
  43. vacuum = true
  44. #不记录request日志,只记录错误日志
  45. disable-logging = true
  46. #将日志打印到syslog上
  47. #log-syslog = true
  48. # 后台运行,并输出日志
  49. daemonize = /home/opadm/log/uwsgi.log
  50. stats=./uwsgi.status

2.2.2 uwsgi.ini

最终uwsgi.ini

  1. [uwsgi]
  2. http=:8100
  3. socket = :8200
  4. ##master = true
  5. #//主进程
  6. # vhost = true
  7. # //多站模式
  8. # no-site = true
  9. # //多站模式时不设置入口模块和文件
  10. # 最大的工作进程数
  11. # processes = 2
  12. # #在每个进程中的最大线程数
  13. # threads = 2
  14. # workers = 2
  15. #//子进程数
  16. #reload-mercy = 2
  17. vacuum = true
  18. # //退出、重启时清理文件
  19. #max-requests = 1000
  20. #limit-as = 512
  21. #buffer-size = 30000
  22. pidfile = /home/agesite/uwsgi9090.pid
  23. # //pid文件,用于下面的脚本启动、停止该进程
  24. daemonize=/home/agesite/agesite.log
  25. #pythonpath=/usr/local/lib/python3.6/site-packages/
  26. #/usr/local/bin/python3.6
  27. #/usr/local/lib/python3.6
  28. #项目目录 (后端项目目录)
  29. chdir=/home/agesite
  30. #项目中wsgi.py文件的目录,相对于项目目录
  31. wsgi-file=wsgi.py
  32. chmod-socket = 666

2.2.3 error

  1. 描述:Traceback (most recent call last):
  2. File "/usr/local/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 141, in __call__
  3. request = self.request_class(environ)
  4. File "/usr/local/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 82, in __init__
  5. self.method = environ['REQUEST_METHOD'].upper()
  6. KeyError: 'REQUEST_METHOD'
  7. 解决方法:uwsgi_params 文件 nginx.conf 同目录,在指定uwsgi_params 添加 以下内容
  8. # ubuntu file:///etc/nginx/uwsgi_params
  9. uwsgi_param QUERY_STRING $query_string;
  10. uwsgi_param REQUEST_METHOD $request_method;
  11. uwsgi_param CONTENT_TYPE $content_type;
  12. uwsgi_param CONTENT_LENGTH $content_length;
  13. uwsgi_param REQUEST_URI $request_uri;
  14. uwsgi_param PATH_INFO $document_uri;
  15. uwsgi_param DOCUMENT_ROOT $document_root;
  16. uwsgi_param SERVER_PROTOCOL $server_protocol;
  17. uwsgi_param REQUEST_SCHEME $scheme;
  18. uwsgi_param HTTPS $https if_not_empty;
  19. uwsgi_param REMOTE_ADDR $remote_addr;
  20. uwsgi_param REMOTE_PORT $remote_port;
  21. uwsgi_param SERVER_PORT $server_port;
  22. uwsgi_param SERVER_NAME $server_name;

参考

https://www.cnblogs.com/yebaofang/p/12171260.html