部署nginx+uwsgi+flask

部署nginx+uwsgi+flask

服务器配置

Centos7.6

python3.7

nginx 1.12

项目文件

项目文件最好放在一个权限较低的目录,当然,配置好权限也是可以的

将flask项目通过ftp或者git上传到/home/project

uwsgi

虚拟环境

什么是虚拟环境?

virtualenv - 廖雪峰

简而言之就是将当前项目需要用到的一些第三方库分开存储,不直接放置到系统目录,这样可以保证环境的独立性和稳定性,系统目录中的库升级不会影响到项目。

新建虚拟环境

1
2
3
4
5
6
7
8
9
# 安装
pip3 install virtualenv
# 进入项目目录
cd /home/project
# 更改目录所有者
sudo chown -R yourUserName:yourUserName 项目路径/
cd 项目路径/
# 新建虚拟环境,保存当前项目所需依赖
sudo virtualenv venv

进入虚拟环境

1
source venv/bin/activate

安装依赖

1
2
3
4
5
# 虚拟环境中就不要用sudo了,不然又是调用系统目录的pip了
# 在虚拟环境中安装项目所需依赖
pip install -r requirements.txt
# 在虚拟环境中安装 uwsgi 和 uwsgi的状态监控器
pip install uwsgi uwsgitop

编写uwsgi配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
vim uwsgi.ini
[uwsgi]
# python 启动程序文件 app.run所在的文件名
wsgi-file =

# python 程序内用以启动的变量名 app
callable = app

# 进程数
processes = 5

# 线程数
threads = 2

#主进程
master=true

# 指向网站目录
chdir=/home/project/项目路径/

# socket文件,配置nginx时候使用
# 也可以写出ip:port端口模式
# 比如 127.0.0.1:5001
# 端口模式的话nginx也要一个端口,就挺啰嗦的
socket=%(chdir)/uwsgi/uwsgi.sock
chmod-socket=666
#http模式,不需要配合nginx即可单独使用
#但是nginx是c编写的,解析http请求的效率要高很多
#建议使用socket加nginx的模式
#http=0.0.0.0:5001

# status文件,可以查看uwsgi的运行状态
stats=%(chdir)/uwsgi/uwsgi.status
# pid文件,通过该文件可以控制uwsgi的重启和停止
pidfile=%(chdir)/uwsgi/uwsgi.pid
# 日志文件,通过该文件查看uwsgi后台运行的日志
daemonize=%(chdir)/uwsgi/uwsgi.log
logfile-chmod=644

# uid=
# gid=
# uwsgi的进程名称前缀
# procname-prefix-spaced=mysite

# py文件修改自动加载,生成环境不建议开启
#py-autoreload=true

buffer-size = 32768

启停uwsgi

1
2
3
4
5
6
7
# 虚拟环境运行
# 启动
uwsgi --ini uwsgi.ini
# 重启
uwsgi --reload uwsgi.pid
# 关闭
uwsgi --stop uwsgi.pid

服务监控

  • 读取uwsgi实时状态,json字符串形式
1
2
# 虚拟环境运行
uwsgi --connect-and-read uwsgi/uwsgi.status
  • uwsgitop
1
2
# 虚拟环境运行
uwsgitop uwsgi/uwsgi.status

退出虚拟环境

1
deactivate

nginx

安装

编译安装或者用包管理安装都是可以的,满足项目需求就可以

1
yum install nginx

配置文件目录:/etc/nginx

配置文件: /etc/nginx/nginx.conf

站点文件源文件:/etc/nginx/sites-available

站点文件激活文件夹:/etc/nginx/sites-enabled

说明:

  • centos yum安装的nginx是没用下面俩个站点目录的,手动创建,然后在nginx.conf中include/etc/nginx/sites-enabled/*
  • 将站点文件源文件写在sites-available目录,添加软链接到sites-enabled,如若要关闭站点,只需要将 sites-enabled目录下的软链接删除即可

日志目录:/var/log/nginx/

配置站点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
cd /etc/nginx/sites-available/
sudo vim 项目名称.conf

server {
# 有域名就配置server_name为域名,端口监听80
# 监听端口
listen 5001;
server_name localhost;

access_log /var/log/project_name/project_name_access.log;
error_log /var/log/project_name/project_name_error.log

index index.html;
#动态请求
location / {
include uwsgi_params;
uwsgi_pass unix:///home/project/项目名称/uwsgi/uwsgi.sock;
}
}

#创建软链接
sudo ln -s /etc/nginx/sites-available/项目名称.conf /etc/nginx/sites-enabled/项目名称.conf

#检验配置文件
sudo nginx -t
sudo systemctl restart nginx.service

最后

访问站点是否可以访问

排查问题参考

  • 云服务器确认端口是否开启可访问
  • 服务器本地是否可访问
    • curl http://127.0.0.1:port
    • 有响应检查服务器端口,无响应检查nginx
  • ip:port是否可访问
    • 有响应,但是只是出现nginx,检查uwsgi
    • 无响应,检查服务器端口,然后再检查nginx
  • 注意权限问题引发的日志或者程序拒绝服务500等错误码