在前面的章节中我们使用 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 restart
2. 快速停止或关闭Nginx:nginx -s stop
3. 正常停止或关闭Nginx:nginx -s quit
4. 配置文件修改重装载命令:nginx -s reload
1.1linux下查找nginx里的nginx.conf文件地址方法
nginx -t
ps aux | grep [n]ginx
nginx启动服务提示98: Address already in use错误的解决
sudo nginx -s stop
nginx: [error] invalid PID number "" in "/usr/local/webserver/nginx/logs/nginx.pid"
nginx -c /usr/local/nginx/conf/nginx.conf
nginx -s reload
nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in use)
1.先使用ps -e | grep nginx查看是否已经启动了nginx
2.如果没有的话则按照提示,查看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.py
uwsgi --http :8000 --wsgi-file test.py
test.py
import sys
from django.core.wsgi import get_wsgi_application
# test.py
def 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=8000
socket = 127.0.0.1:9090
master = true
#//主进程
vhost = true
# //多站模式
no-site = true
# //多站模式时不设置入口模块和文件
workers = 2
#//子进程数
reload-mercy = 10
vacuum = true
# //退出、重启时清理文件
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /home/agesite/uwsgi9090.pid
# //pid文件,用于下面的脚本启动、停止该进程
daemonize=/home/agesite/agesite.log
pythonpath=/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 file
wsgi-file =src/wsgi.py
# maximum number of worker processes
processes = 100
#thread numbers startched in each worker process
threads = 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 exit
vacuum = true
#不记录request日志,只记录错误日志
disable-logging = true
#将日志打印到syslog上
#log-syslog = true
# 后台运行,并输出日志
daemonize = /home/opadm/log/uwsgi.log
stats=./uwsgi.status
2.2.2 uwsgi.ini
最终uwsgi.ini
[uwsgi]
http=:8100
socket = :8200
##master = true
#//主进程
# vhost = true
# //多站模式
# no-site = true
# //多站模式时不设置入口模块和文件
# 最大的工作进程数
# processes = 2
# #在每个进程中的最大线程数
# threads = 2
# workers = 2
#//子进程数
#reload-mercy = 2
vacuum = true
# //退出、重启时清理文件
#max-requests = 1000
#limit-as = 512
#buffer-size = 30000
pidfile = /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.py
chmod-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_params
uwsgi_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;