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 django2. 启动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.status3. 启动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.confnginx虚拟主机配置示例
# 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')