nginx uwsgi配置教程
配置uwsgi代理
概述
WSGI协议
此协议是Python语言的专利,它定义了Web服务程序和HTTP服务器之间通信的普遍适用的接口,是python web框架的通用规范。常见的Python Web框架都实现了这个协议:如 Django, Flask, web.py, web2py, Tornado, Google App Engine, Pyramid等等。
WSGI是一个Python专有的web协议。
web协议的发展历程是(Python): CGI > FCGI > WSGI > uwsgi
nginx从0.8.4开始内置支持uwsgi协议。
通信请求过程
1. 安装python3环境
安装python3
yum -y install https://centos7.iuscommunity.org/ius-release.rpm
yum makecache
yum install -y python36u python36u-pip python36u-devel
安装uwsgi、django
pip3 install uwsgi
pip3 install django
2. 启动uwsgi
配置文件
# >>> vim /etc/uwsgi.ini
[uwsgi]
socket = 127.0.0.1:9999 # uwsgi监听端口
#cddir = /opt/app/code6/demo
workers = 2 # 启用uwsgi进程数
max-requests = 1000
buffer-size = 30000
pidfile = /var/run/uwsgi/uwsgi.pid # 服务pid文件位置
daemonize = /var/log/uwsgi.log # uwsgi日志目录
多站模式配置文件
如果有多个django站点使用下面的配置:
# >>> vim /etc/uwsgi.ini
[uwsgi]
socket = 127.0.0.1:9999 # uwsgi监听端口
#cddir = /opt/app/code6/demo
master = true //主进程
vhost = true //多站模式
no-site = true //多站模式时不设置入口模块和文件
workers = 2 //子进程数
reload-mercy = 10
vacuum = true //退出、重启时清理文件
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi.pid # 服务pid文件位置
daemonize = /var/log/uwsgi.log # uwsgi日志目录
多站点配置模式案例
[uwsgi]
socket = 127.0.0.1:9999
master = true
vhost = true
workers = 4
reload-mercy = 10
vacuum = true
max-requests = 2048
buffer-size = 30000
pidfile = /var/run/uwsgi.pid
daemonize= /var/log/uwsgi.log
创建uwsgi用户
# 创建用户
useradd uwsgi
# 给与pid文件位置写入权限
mkdir /var/run/uwsgi
chown -R uwsgi /var/run/uwsgi
# 给与uwsgi日志写入权限
touch /var/log/uwsgi.log
chown uwsgi /var/log/uwsgi.log
启动uwsgi
su - uwsgi
uwsgi --ini /etc/uwsgi.ini
# 关闭uwsgi
uwsgi --stop uwsgi.pid
# 重启uwsgi
uwsgi --reload uwsgi.pid
查看状态
pip install uwsgitop
uwsgitop uwsgi/uwsgi.status
3. 启动nginx
配置nginx
# >>> vim conf.d/uwsgiproxy_test.conf
server {
listen 80;
server_name donfe.com www.dongfe.com;
# 域名重定向
if ( $host != 'www.dongfe.com') {
rewrite ^/(.*)$ http://www.dongfe.com/$1 permanent;
}
# 动态请求交给uwsgi
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9999;
uwsgi_param UWSGI_SCRIPT demo.wsgi; # wsgi.py位置(./demo/wsgi.py)
uwsgi_param UWSGI_CHDIR /usr/share/nginx/demo; # django工程目录
index index.html index.htm;
client_max_body_size 35m;
}
# 静态文件配置
location /static {
autoindex on;
alias /usr/share/nginx/demo/static;
}
启动nginx
# 检查配置文件
nginx -tc /etc/nginx/nginx.conf
# 重载nginx
nginx -s reload -c /etc/nginx/nginx.conf
nginx虚拟主机配置示例
# vim /etc/nginx/conf.d/virtualhost.conf
# 神鸡代理
server {
listen 80;
server_name www.shenjidaili.com shenjidaili.com;
# 域名重定向
if ( $host != 'www.shenjidaili.com') {
rewrite ^/(.*)$ http://www.shenjidaili.com/$1 permanent;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9999;
uwsgi_param UWSGI_SCRIPT shenjidaili.wsgi;
uwsgi_param UWSGI_CHDIR /var/www/shenjidaili;
client_max_body_size 35m;
}
# 静态文件处理
location /static {
autoindex on;
alias /var/www/shenjidaili/static;
}
location /media {
autoindex on;
alias /var/www/shenjidaili/media;
}
}
server {
listen 80;
server_name www.xiladaili.com xiladaili.com;
# 域名重定向
if ( $host != 'www.xiladaili.com') {
rewrite ^/(.*)$ http://www.xiladaili.com/$1 permanent;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9999;
uwsgi_param UWSGI_SCRIPT xiladaili.wsgi;
uwsgi_param UWSGI_CHDIR /var/www/xiladaili;
client_max_body_size 35m;
}
# 静态文件处理
location /static {
autoindex on;
alias /var/www/xiladaili/static;
}
location /media {
autoindex on;
alias /var/www/xiladaili/media;
}
}
# 泥马代理
server {
listen 80;
server_name www.nimadaili.com nimadaili.com;
# 域名重定向
if ( $host != 'www.nimadaili.com') {
rewrite ^/(.*)$ http://www.nimadaili.com/$1 permanent;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9999;
uwsgi_param UWSGI_SCRIPT nimadaili.wsgi;
uwsgi_param UWSGI_CHDIR /var/www/nimadaili;
client_max_body_size 35m;
}
# 静态文件重定向
location /static {
autoindex on;
alias /var/www/nimadaili/static;
}
location /media {
autoindex on;
alias /var/www/nimadaili/media;
}
}
# 贝熊熊
server {
listen 80;
server_name www.beixiongxiong.com beixiongxiong.com;
# 域名重定向
if ( $host != 'www.beixiongxiong.com') {
rewrite ^/(.*)$ http://www.beixiongxiong.com/$1 permanent;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9999;
uwsgi_param UWSGI_SCRIPT beixiongxiong.wsgi;
uwsgi_param UWSGI_CHDIR /var/www/beixiongxiong;
client_max_body_size 35m;
}
# 静态文件重定向
location /static {
autoindex on;
alias /var/www/beixiongxiong/static;
}
location /media {
autoindex on;
alias /var/www/beixiongxiong/media;
}
}
# 猎鹰排名
server {
listen 80;
server_name seo.lieyinglianmeng.com;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9999;
uwsgi_param UWSGI_SCRIPT search_web.wsgi;
uwsgi_param UWSGI_CHDIR /var/www/seo;
client_max_body_size 35m;
}
# 静态文件重定向
location /static {
autoindex on;
alias /var/www/seo/static;
}
location /media {
autoindex on;
alias /var/www/seo/media;
}
}
# 项目管理
server {
listen 80;
server_name project.lieyingwangan.com;
root /var/www/zentaopms/www;
index index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# 拾点金
server {
listen 80;
server_name vip.shidianjin.com;
# 域名重定向
if ( $host != 'vip.shidianjin.com') {
rewrite ^/(.*)$ http://vip.shidianjin.com/$1 permanent;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9999;
uwsgi_param UWSGI_SCRIPT shidianjin.wsgi;
uwsgi_param UWSGI_CHDIR /var/www/shidianjin;
client_max_body_size 35m;
}
# 静态文件重定向
location /static {
autoindex on;
alias /var/www/shidianjin/static;
}
location /media {
autoindex on;
alias /var/www/shidianjin/media;
}
}
django配置
**django关闭Dubug,**就相当于是生产环境了,Django官网上指出如果是django框架一旦作为生产环境,那么它的静态文件访问接口就不应该从Django框架中走了,应该有独立的web环境,首推nginx;在nginx中就要单独做访问/static/目录的路由。
STATICFILES_DIRS与STATIC_ROOT:
STATICFILES_DIRS 列表中的目录是开发时创建的静态目录。
STATIC_ROOT 是Django框架放到生产环境中的唯一的一个静态目录
而当你设置DEBUG=False时,就必须在Django框架前端部署nginx或者其他web服务器来提供静态访问入口
其他问题
django版本过新时,需要更新sqlite
django2.2支持的最低sqlite版本为3.8.3,而centos系统的sqlite版本为3.7 sqlite3 --version
cd ~
wget -O sqlite-autoconf.tar.gz https://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz
tar zxvf sqlite-autoconf.tar.gz
cd sqlite-autoconf-3280000
./configure --prefix=/usr/local
make && make install
cd .. && rm -rf sqlite-autoconf.tar.gz sqlite-autoconf-3280000 # 删除下载包和解压包
/usr/local/bin/sqlite3 --version # 检查新版是否安装成功
mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
sqlite3 --version # 查看当前全局sqlite3的版本
# 设置开机自启动执行,可以将下面的export语句写入 ~/.bashrc 文件中,如果如果你想立即生效,可以执行source 〜/.bashrc 将在每次启动终端时执行
export LD_LIBRARY_PATH="/usr/local/lib" # 将路径传递给共享库
# 检查Python的SQLite3版本
python3
import sqlite3
sqlite3.sqlite_version
exit
方法二:下降django版本
pip3 install django==2.1.8
uwsgi程序可能会找不到python三方库
比如在访问时找不到'django'模块
解决办法1:
在uwsgi.ini配置文件中加入python目录
# >>> vim /etc/uwsgi.ini
[uwsgi]
python-path = /usr/local/lib64/python3.6/site-packages
python-path = /usr/local/lib/python3.6/site-packages
# "python-path" 与 "pythonpath" 关键字相同
解决办法2:
通过在wsgi.py里面打印sys.path发现是因为path里面并没有包含该安装的site-packages的路径,因此在wsgi.py添加如下语句
在django项目的wsgi.py文件中加入:
sys.path.append('/usr/local/lib64/python3.6/site-packages')
sys.path.append('/usr/local/lib/python3.6/site-packages')