# 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.png

# 1.2 什么是 uWSGI

uWSGI 实现了 WSGI、http 等数据交换协议。简单来说:我们将项目通过 uwsgi 方式运行,就可以直接对外提供服务,而无需依托于 Nginx。

2.png

# 1.3 uWSGI 结合 nginx

通常情况下 Python 中的 Django 框架或 Flask 框架可以通过 Uwsgi 方式对外提供服务。为什么还需要 Nginx

  • 1. 安全:后端服务直接以 http 对外提供访问,往往会暴露后端的真实服务,如果使用 nginx 可以隐藏后端的服务,并且 nginx 能够实现安全限制、Rewrite、HTTPS 等功能(这些都是 uwsgi 无法实现的。)
  • 2. 效率:nginx 可以直接处理静态资源,然后将动态内容通过 uWSGI 协议转发给后端 Django,实现动静分离,提供更好的请求与响应。

3.png

# 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 浏览器访问测试

1.png

# 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;
	}
}
# 3.6 浏览器访问博客项目

1.jpg

此文章已被阅读次数:正在加载...更新于

请我喝[茶]~( ̄▽ ̄)~*

Xu Yong 微信支付

微信支付

Xu Yong 支付宝

支付宝