# Nginx 代理 - Uwsgi 实践
# 1. Uwsgi 代理基本概述
# 1.1 什么是 wsgi
- WSGI,全称 Web Server Gateway Interface 是为 Python 语言定义的 Web 服务器 和 Web 应用程序之间的一种简单通用的接口。
- WSGI 的官方定义,the Python Web ServerGateway Interface。从名字就可以看出来,这是一个 Gateway 网关。那么网关的作用就是在协议之间进行转换。
- 也就是说,WSGI 就像是一座桥梁,一边连着 web 服务器,另一边连着 web 应用程序。
# 1.2 什么是 uWSGI
uWSGI 实现了 WSGI、http 等数据交换协议。简单来说:我们将项目通过 uwsgi 方式运行,就可以直接对外提供服务,而无需依托于 Nginx。
# 1.3 uWSGI 结合 nginx
通常情况下 Python 中的 Django 框架或 Flask 框架可以通过 Uwsgi 方式对外提供服务。为什么还需要 Nginx
- 1. 安全:后端服务直接以 http 对外提供访问,往往会暴露后端的真实服务,如果使用 nginx 可以隐藏后端的服务,并且 nginx 能够实现安全限制、Rewrite、HTTPS 等功能(这些都是 uwsgi 无法实现的。)
- 2. 效率:nginx 可以直接处理静态资源,然后将动态内容通过 uWSGI 协议转发给后端 Django,实现动静分离,提供更好的请求与响应。
# 2. Uwsgi 代理配置场景
- 步骤一、安装 python3 的环境
- 步骤二、安装 Django 框架以及 uwsgi
- 步骤三、配置 Django 工程
- 步骤四、配置 uWSGI、配置 Nginx
# 2.1 安装 Python3
[root@web01 ~]# yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel \ | |
sqlite-devel gcc gcc-c++ openssl-develzlib zlib-devel python3 python3-devel -y |
# 2.2 安装 Django
# 安装 Django 框架和 uwsgi | |
[root@web02 ~]# pip3 install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip | |
[root@web02 ~]# pip3 install -i https://mirrors.aliyun.com/pypi/simple/ django==2.1.8 | |
[root@web02 ~]# pip3 install -i https://mirrors.aliyun.com/pypi/simple/ uwsgi |
# 2.3 创建 Django 项目
# 使用 Django 新建工程,运行如下指令 | |
[root@web02 ~]# cd /opt | |
[root@web02 opt]# django-admin.py startproject demosite | |
[root@web02 opt]# cd demosite | |
[root@web02 demosite]# python3 manage.py runserver 0.0.0.0:8002 |
# 2.4 访问 Django 项目
在浏览器内输入 http://IP:8002 正常会提示 The install worked successfully! Congratulations!
如果出现 ALLOWED_HOSTS 报错,修改如下配置即可;
[root@web02 demosite]# vim demosite/settings.py | |
ALLOWED_HOSTS = ['*'] |
# 2.5 配置 Uwsgi 运行项目
# 配置 Django 工程以由 uwsgi 方式运行 | |
[root@web02 demosite]# cat /opt/demosite/uwsgi.ini | |
[uwsgi] | |
#uwsgi 监听的端口 | |
socket = 127.0.0.1:9999 | |
#uwsgi 启动进程数 | |
workers = 2 | |
#最大接收的请求数 | |
max-requests = 1000 | |
#buffer 缓冲区大小 | |
buffer-size = 30000 | |
#进程 pid 存放路径 | |
pidfile = /run/uwsgi.pid | |
#uwsgi 日志存储路径 | |
daemonize = /var/log/uwsgi.log |
# 2.6 配置 Nginx 代理 Uwsgi
# 通过 uwsgi 方式启动 django 项目,默认监听 127.0.0.1 | |
[root@web02 demosite]# uwsgi --ini /opt/demosite/uwsgi.ini | |
[root@web02 demosite]# netstat -lntp|grep 9999 | |
tcp 0 0 127.0.0.1:9999 0.0.0.0:* LISTEN 3825/uwsgi | |
# 配置 Nginx,使用 Nginx 代理 uwsgi 应用 | |
[root@web02 demosite]# cat /etc/nginx/conf.d/py.hmallleasing.com.conf | |
server { | |
listen 80; | |
server_name py.hmallleasing.com; | |
client_max_body_size 100M; | |
location / { | |
index index.html; #默认返回页面 | |
uwsgi_pass 127.0.0.1:9999; | |
uwsgi_param UWSGI_CHDIR /opt/demosite; #工程所在的路径 | |
uwsgi_param UWSGI_SCRIPT demosite.wsgi; #demosite/wsgi 接口文件 | |
include uwsgi_params; | |
} | |
} | |
[root@web02 demosite]# nginx -t | |
[root@web02 demosite]# systemctl restart nginx |
# 2.7 浏览器访问测试
# 3.Uwsgi 代理项目实践
使用 NginxUWSGI 代理方式部署 Python 的 Django 项目
1. 安装 python3 环境;
2. 安装 Django 环境;
3. 下载博客系统、安装博客系统所需要的模块;
4. 配置博客链接的数据库、在数据上创建对应的库名;
5. 导入博客的数据内容;
6. 收集所有的静态资源文件到统一的一个目录中;
7. 配置 uwsgi 运行
8. 配置 Nginx 反向代理 uwsgi
# 3.1 下载 Django 博客系统
# 3.1 下载 Django 博客系统
#1. 下载博客系统项目并解压 | |
[root@web01 ~]# mkdir -p /code && cd /code | |
[root@web01 code]# unzip pythonav.zip | |
#2. 安装该项目所需的依赖包软件 | |
[root@web01 ~]# pip3 install -i https://pypi.doubanio.com/simple/ -r /code/pythonav/requirements.txt |
# 3.2 导入 Django 项目数据库
#1、下载 MySQL 官方扩展源 | |
[root@db01 ~]# rpm -ivh http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql57-community-release-el7-10.noarch.rpm | |
#2、安装 mysql5.7,文件过大可能会导致下载缓慢 | |
[root@db01 ~]# yum install mysql-community-server -y | |
#3、启动并加入开机自动启动 | |
[root@db01 ~]# systemctl start mysqld && systemctl enable mysqld | |
#4、查看端口是否启动 | |
[root@db01 ~]# netstat -lntp|grep 3306 | |
tcp6 0 0 :::3306 :::* LISTEN 1911/mysqld | |
#5、由于 mysql5.7 默认配置密码,需要过滤 temporary password 关键字查看对应登陆数据库密码 | |
[root@db01 ~]# grep 'temporary password' /var/log/mysqld.log | |
#6、登录 mysql 数据库 [password 中填写上一步过滤的密码] | |
[root@db01 ~]# mysql -uroot -p$(awk '/temporary password/{print $NF}' /var/log/mysqld.log) | |
#7、重新修改数据库密码 | |
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Superman*2025'; | |
#8、添加 app 用户 | |
mysql> grant all on *.* to 'app'@'192.168.1.%' identified by 'Superman*2025'; | |
#9、允许 root 用户在任何地方进行远程登录,并具有所有库任何操作权限,具体操作如下 | |
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Superman*2025' WITH GRANT OPTION; | |
mysql> FLUSH PRIVILEGES; | |
#10、创建数据库 | |
mysql> create database pythonav; | |
#11. 配置项目连接数据库信息 | |
[root@web01 pythonav]# vim /code/BBS/BBS/settings.py | |
DATABASES = { | |
'default': { | |
'ENGINE': 'django.db.backends.mysql', | |
'NAME': 'pythonav', | |
'HOST': "127.0.0.1", | |
'USER': 'root', | |
'PASSWORD': 'Superman*2025', | |
'PORT': 3306, | |
} | |
} | |
#12. 初始化数据库 | |
[root@web01 pythonav]# python3 manage.py makemigrations | |
[root@web01 pythonav]# python3 manage.py migrate | |
#13. 创建超级管理员用户 | |
[root@web01 pythonav]# python3 manage.py | |
createsuperuser | |
Username (leave blank to use 'root'): oldxu | |
Email address: 552408925@qq.com | |
Password: #输入密码 Superman*2025 | |
Password (again): #确认密码 Superman*2025 | |
Superuser created successfully. |
# 3.3 收集 Django 静态文件
# 收集静态资源至指定位置存储 | |
[root@web01 pythonav]# python3 manage.py collectstatic |
# 3.4 配置 Uwsgi 运行项目
#1. 配置 Uwsgi 启动 Django 项目 | |
[root@web01 pythonav]# cat pythonav_uwsgi.ini | |
[uwsgi] | |
#uwsgi 监听的端口 | |
socket = 127.0.0.1:8811 | |
#指定项目所在路径 | |
chdir = /code/pythonav/ | |
#指定项目入口文件 | |
wsgi-file = pythonav/wsgi.py | |
#uwsgi 启动的进程数量与线程数量 | |
processes = 4 | |
threads = 10 | |
#最大接收的请求数 | |
max-requests = 1000 | |
#buffer 缓冲区大小 | |
buffer-size = 30000 | |
#进程 pid 存放路径 | |
pidfile = /run/uwsgi-pythonav.pid | |
#uwsgi 日志存储路径 | |
daemonize = /var/log/uwsgi-pythonav.log | |
#2. 启动 uwsgi | |
[root@web01 ~]# uwsgi --ini /code/pythonav/pythonav_uwsgi.ini |
# 3.5 配置 Nginx 代理 Uwsgi
# 配置 Nginx Uwsgi 反向代理 | |
[root@web01 pythonav]# cat /etc/nginx/conf.d/av.hmallleasing.com.conf | |
server { | |
listen 80; | |
server_name av.hmallleasing.com; | |
client_max_body_size 100M; | |
location /static { | |
alias /opt/pythonav/static; | |
#root /opt/pythonav; | |
} | |
location / { | |
uwsgi_pass 127.0.0.1:8811; | |
include uwsgi_params; | |
} | |
} |