在前面的章节中我们使用 python manage.py runserver 来运行服务器。这只适用测试环境中使用。
正式发布的服务,我们需要一个可以稳定而持续的服务器,比如apache, Nginx, lighttpd等,本文将以 Nginx 为例。
遇见三个问题:
- django,splite3 环境安装 ,与检测 , 2.nginx 部署server 3.uwsgi 与 nginx 相关联 ,缺少在指定uwsgi_params 错误日志文件,问题定位
总结:
部署流程:
- 上传项目Django
- 部署nginx
- 部署uwsgi
cat /usr/local/nginx/logs/error.log
0.django
0.1.python manage.py migrate
检测环境
项目结构├── agesite│ ├── asgi.py│ ├── __init__.py│ ├── __pycache__│ ├── settings.py│ ├── urls.py│ └── wsgi.py├── blog│ ├── core│ ├── gender.py│ ├── getting_young.py│ ├── __pycache__│ ├── star.py│ └── view.py├── client_django.py├── data│ └── celeba_hq_npy├── db.sqlite3├── manage.py├── mime.types├── mypackages.txt├── nginx.conf├── requirements.txt├── scripts│ ├── debug_uwsgi.sh│ ├── env.sh│ ├── nginx.sh│ ├── read.md│ ├── run.sh│ └── uwsgi.sh├── static│ └── admin├── test.py├── util│ ├── __init__.py│ └── logger.py├── uwsgi9090.ini├── uwsgi_params├── weights│ ├── net_G.onnx│ ├── .onnx│ ├── .onnx│ └── wing2.onnx└── wsgi.py
0.2 error
问题:django.db.utils.NotSupportedError: URIs not supported描述:原始cat /usr/local/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py |grep True'True. It will be overridden with False. Use the 'kwargs.update({'check_same_thread': False, 'uri': True})修改:cat /usr/local/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py |grep True'True. It will be overridden with False. Use the '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. 首先利用配置文件启动nginx。命令: nginx -c /usr/local/nginx/conf/nginx.conf重启服务: service nginx restart2. 快速停止或关闭Nginx:nginx -s stop3. 正常停止或关闭Nginx:nginx -s quit4. 配置文件修改重装载命令:nginx -s reload
1.1linux下查找nginx里的nginx.conf文件地址方法
nginx -tps aux | grep [n]ginxnginx启动服务提示98: Address already in use错误的解决sudo nginx -s stopnginx: [error] invalid PID number "" in "/usr/local/webserver/nginx/logs/nginx.pid"nginx -c /usr/local/nginx/conf/nginx.confnginx -s reloadnginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in use)1.先使用ps -e | grep nginx查看是否已经启动了nginx2.如果没有的话则按照提示,查看0.0.0.0:80端口谁占用了,使用netstat -ltunp命令,可以看到;logs/usr/local/nginx/logs
1.2 nginx.conf
#user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;client_max_body_size 10m;#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 8300; # 修改端口号server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}}server {listen 8000;server_name 127.0.0.1;#115.29.XXX.XXX;location / {include uwsgi_params;uwsgi_pass 0.0.0.0:8200; #//必须和uwsgi中的设置一致#proxy_set_header Host $host;uwsgi_param UWSGI_SCRIPT agesite.wsgi; #//入口文件,即wsgi.py相对于项目根目录的位置,“.”相当于一层目录uwsgi_param UWSGI_CHDIR /home/agesite; # //项目根目录index index.html index.htm;#client_max_body_size 35m;}location /static/ {alias /home/agesite/static; #静态资源路径}}include vhost/*.conf;}
1.3 error
nginx: [emerg] open() "/home/agesite/mime.types" failed (2: No such file or directory) in /home/agesite/nginx.conf:18解决方法:创建文件 /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
2.0 uwsgi
2.1 启动/重启/停止
uWSGI 通过 xxx.ini 启动后会在相同目录下生成一个 xxx.pid 的文件,里面只有一行内容是 uWSGI 的主进程的进程号。
#### 启动:
uwsgi —ini xxx.ini
#### 重启:
uwsgi —reload xxx.pid
#### 停止:
uwsgi —stop xxx.pid
2.2 doc
2.2.1 uwsgi 测试
uwsgi --http :8000 --wsgi-file wsgi.pyuwsgi --http :8000 --wsgi-file test.pytest.pyimport sysfrom django.core.wsgi import get_wsgi_application# test.pydef application(env, start_response):start_response('200 OK', [('Content-Type','text/html')])return [ bytes("Hello World " + sys.executable +sys.version, encoding = "utf8")]
2.2.1.0 参数
[uwsgi]http=8000socket = 127.0.0.1:9090master = true#//主进程vhost = true# //多站模式no-site = true# //多站模式时不设置入口模块和文件workers = 2#//子进程数reload-mercy = 10vacuum = true# //退出、重启时清理文件max-requests = 1000limit-as = 512buffer-size = 30000pidfile = /home/agesite/uwsgi9090.pid# //pid文件,用于下面的脚本启动、停止该进程daemonize=/home/agesite/agesite.logpythonpath=/usr/local/bin/python3.6#/usr/local/lib/python3.6#项目目录 (后端项目目录)chdir=/home/agesite#项目中wsgi.py文件的目录,相对于项目目录wsgi-file=wsgi.py
2.2.2.1 uwsgi 参数
[uwsgi]# 对外提供 http 服务的端口http = :8000#the local unix socket file than commnuincate to Nginx 用于和 nginx 进行数据交互的端口socket = 127.0.0.1:8001# the base directory (full path) django 程序的主目录chdir =/home/opadm/mms_webserver/src# Django's wsgi filewsgi-file =src/wsgi.py# maximum number of worker processesprocesses = 100#thread numbers startched in each worker processthreads = 10#一个高阶的cheap模式,在启动的时候只会分配n个工作进程,并使用自适应算法启动新的进程cheaper = 10#在经过sec秒的不活跃状态的进程会被销毁(进入了cheap模式),并最少保留cheaper指定的进程数idle = 3600#monitor uwsgi status 通过该端口可以监控 uwsgi 的负载情况stats = 127.0.0.1:9000#设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃harakiri = 60#当一个请求被harakiri杀掉会,会输出一条日志harakiri-verbose = true#开启内存使用情况报告memory-report = true#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)reload-mercy = 10#设置工作进程使用虚拟内存超过N MB就回收重启reload-on-as= 1024#自动给进程命名auto-procname = true#为进程指定前缀procname-prefix-spaced = xc-mms#设置工作进程每处理N个进程就会被回收重启max-requests=500000#设置工作进程使用物理内存超过N MB就回收重启reload-on-rss=100#设置socket超时时间,默认4秒socket-timeout=10#限制http请求体的大小(Bytes)limit-post=4096# clear environment on exitvacuum = true#不记录request日志,只记录错误日志disable-logging = true#将日志打印到syslog上#log-syslog = true# 后台运行,并输出日志daemonize = /home/opadm/log/uwsgi.logstats=./uwsgi.status
2.2.2 uwsgi.ini
最终uwsgi.ini
[uwsgi]http=:8100socket = :8200##master = true#//主进程# vhost = true# //多站模式# no-site = true# //多站模式时不设置入口模块和文件# 最大的工作进程数# processes = 2# #在每个进程中的最大线程数# threads = 2# workers = 2#//子进程数#reload-mercy = 2vacuum = true# //退出、重启时清理文件#max-requests = 1000#limit-as = 512#buffer-size = 30000pidfile = /home/agesite/uwsgi9090.pid# //pid文件,用于下面的脚本启动、停止该进程daemonize=/home/agesite/agesite.log#pythonpath=/usr/local/lib/python3.6/site-packages/#/usr/local/bin/python3.6#/usr/local/lib/python3.6#项目目录 (后端项目目录)chdir=/home/agesite#项目中wsgi.py文件的目录,相对于项目目录wsgi-file=wsgi.pychmod-socket = 666
2.2.3 error
描述:Traceback (most recent call last):File "/usr/local/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 141, in __call__request = self.request_class(environ)File "/usr/local/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 82, in __init__self.method = environ['REQUEST_METHOD'].upper()KeyError: 'REQUEST_METHOD'解决方法:uwsgi_params 文件 与nginx.conf 同目录,在指定uwsgi_params 添加 以下内容# ubuntu file:///etc/nginx/uwsgi_paramsuwsgi_param QUERY_STRING $query_string;uwsgi_param REQUEST_METHOD $request_method;uwsgi_param CONTENT_TYPE $content_type;uwsgi_param CONTENT_LENGTH $content_length;uwsgi_param REQUEST_URI $request_uri;uwsgi_param PATH_INFO $document_uri;uwsgi_param DOCUMENT_ROOT $document_root;uwsgi_param SERVER_PROTOCOL $server_protocol;uwsgi_param REQUEST_SCHEME $scheme;uwsgi_param HTTPS $https if_not_empty;uwsgi_param REMOTE_ADDR $remote_addr;uwsgi_param REMOTE_PORT $remote_port;uwsgi_param SERVER_PORT $server_port;uwsgi_param SERVER_NAME $server_name;
