一、背景学习
1.概念
WSGI:(Web Server Gateway Interface)服务器网关接口,是一种通信协议规范
uwsgi:是一种传输协议规范,是一种约定。
uWSGI:是实现了uwsgi和WSGI、http等协议的Web服务器。
我们现在需要记住,WSGI和uwsgi协议沟通的双方分别是wsgi server (比如uWSGI) 要和 wsgi application(比如django、flask ),实际上uWSGI作为python程序的web服务器和java程序的web应用服务器的tomcat一样,关于详细解释可以查看下面文章。
其中Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换
http://t.csdn.cn/USzO8
2、项目调用流程分析uWSGI+nginx+Django
1)首先客户端向服务器发送请求,请求资源
2)Nginx作为直接对外的服务接口,接受客户端发送过来的请求,会进行捷报、分析:
如果是静态文件请求,就根据配置的静态文件路径,返回请求的资源。
如果是动态请求,nginx就通过配置文件,将请求传递给uWSGI服务,uWSGI将接受到的包进行处理,并转发给web应用(如django);web应用根据返回值进行打包,转发给uWSGI
3)uWSGI接收到响应,转发给Nginx,nginx最终将返回值返回给客户端(如浏览器、app)
二、环境搭建
1、python环境搭建
可以查看此处链接,这里有python环境搭建,还有Django项目上传和解压,后续uWSGI+nginx配置文件的项目路径都是基于此Django的路径,所以前期必须确保这步搭建正确。
https://blog.csdn.net/qq_32304985/article/details/129114778
2、mysql搭建
可以查看此处链接
添加链接描述
3、nginx安装
yum方式安装nginx
yum -y install nginx
查看nginx版本
nginx -v
nginx命令
systemctl status nginx ## 查看nginx状态
systemctl start nginx ## 开启nginx服务
systemctl stp nginx ## 关闭nginx服务
上述绿色代表nginx启动成功
4、uWSGI安装
## 1.安装uwsgi,正常python3已默认安装uwsgi
pip3 install uwsgi
## 2.安装后马上建立软链接
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
## 3.创建软链接后,执行下面命令查看uwsgi版本
uwsgi --version
5、uWSGI配置
这部分项目路径用到了第二部分环境搭建的django项目路径
(1)在django项目settings.py所在目录,使用vim新文件,如uwsgi.ini文件,直接复制粘贴如下内容,根据自身django项目进行修改
[uwsgi]
#服务启动端口,也可以指定为127.0.0.1:9000,这样就会监听到网络套接字
socket = 127.0.0.1:8091
# 项目的全路径
chdir = /var/www/mybankmanager-master/BankManageSystem/
# Django中wsgifile 项目中wsgi的位置
wsgi-file = BankManageSystem/wsgi.py
# Django中虚拟环境绝对路径
virtualenv=/var/www/mybankmanager-master/BankVirtualenv
#进程相关设置
# 进程数
processes = 4
#线程数
#threads = 2
#设置socket的监听队列大小(默认:100)
listen = 120
#指定静态文件绝对路径
#static-map = /var/www/mybankmanager-master/Static_Root
#主进程启动
master = true
#指定pid文件
pidfile = /var/www/mybankmanager-master/uwsgi.pid
#启用线程
enable-threads = True
#设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。
buffer-size = 32768
#设置后台运行
daemonize = /var/log/myappUwsgi.log
# 退出时清除虚拟环境
vacuum =True
(2)修改成功后保存如下图
(3)收集静态文件(如果前面已收集可不用执行)
python manage.py collectstatic
(4)启动uWSGI,查看日志
## 在当前目录启动
uwsgi --ini uwsgi.ini
## 启动之后查看进程
ps -ef | grep uwsgi
上图代表启动成功
6、nginx配置
这部分项目路径用到了第二部分环境搭建的django项目路径
(1)修改配置文件
vim /etc/nginx/nginx.conf
直接全部覆盖文件内容
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
server {
listen 8092; ##外网请求端口,即监听端口
server_name 127.0.0.1:8092; ##外网请求域名,无域名设置127.0.0.1:8092
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8091; ##nginx转发内网的端口,必须和uWSGI设置socket端口一致
uwsgi_param UWSGI_SCRIPT BankManageSystem.wsgi; ##wsgi.py文件相对路径
uwsgi_param UWSGI_CHDIR /var/www/mybankmanager-master/; ##项目绝对路径
}
location /static/ {
alias /var/www/mybankmanager-master/Static_Root/; ##静态文件绝对路径
}
}
}
(2)保存且重启nginx
systemctl restart nginx
若执行命令后,无任何提示,即启动成功,可通过如下命令查看状态
systemctl status nginx ## 查看nginx状态
(3)启动报错处理
若启动报错如“[emerg] 12559#12559: bind() to 0.0.0.0:8092 failed (13: Permission denied)”
此提示是权限操作文件,首先看下nginx的启动用户有没有对文件的操作权限, 如果权限有了还是报这个错误selinux 是否关闭了, 关闭之后再次启动nginx 就可以了,亲测有效。
使用:getenforce命令
一般会返回三种状态:
1,Enforcing (记录警告且阻止可疑行为)
2,Permissive (代表仅记录安全警告但不阻止可疑行为)
3,Disabled (禁用状态)
首先执行:若返回Enforcing ,则先临时进行修改
临时修改执行命令:setenforce 0设置Permissive 模式,setenforce 1设置Enforcing 模式
若重新启动nginx成功,则进行永久修改,将
SELINUX=enforcing改为SELINUX=disabled,报错后重启系统,SELinux状态更新为Disabled 。
vi /etc/sysconfig/selinux
重启系统,使用getenforce命令,查看SELinux状态更新为Disabled 。
7、重启uWSGI,访问成功
(1)必须修改Django项目的配置文件 settings.py。
ALLOWED_HOSTS = [‘*’]
(2)进入项目路径执行如下命令
##查看进程
ps -ef | grep uwsgi
##启动服务
uwsgi --ini uwsgi.ini