flask+docker + nginx + uwsgi环境部署
前面三篇介绍了全栈系统里面后台和前端、移动端:
后台篇:Flask搭建后台
前端篇:Vue2.0搭建PC前端
移动端篇:H5+搭建移动端应用
项目线上地址:项目访问链接,账号:general 密码:general
今天讲述项目部署:docker + nginx + uwsgi,部署项目线上运行环境。
1. 安装配置docker环境
1.1 创建容器
sudo docker run -ti --privileged -p 80:80 -p 8888:8888 -p 888:888 -p 5000:5000 --restart=always -d --name flask_app centos
- docker里面软件安装由宝塔管理,所以需要开发80、888、8888端口,5000是测试端口
- -p后面是需要添加的端口
- flask_app是容器name
- centos是镜像名称
安装配置docker详情参考另一篇博文:安装配置docker
2. 安装python
(1)、安装python3依赖
sudo yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
(2)、下载python3.7.2
sudo yum install wget
sudo wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
(3)、解包
sudo tar -zxf Python-3.7.2.tgz
编译安装Python3.7.2需要先安装
yum -y install libffi-devel
(4)、编译安装python
sudo yum install gcc gcc-c++ -y
sudo ./configure --enable-shared --prefix=/usr/python
yum install make
sudo make
make install
ls /usr/local/python3/bin # 可以看到python3.6都已安装好。
(5)、更改python链接
#默认安装python版本是2.7的情况
sudo ln -s /usr/python/bin/python3 /usr/bin/python3
sudo ln -s /usr/python/lib/libpython3.7m.so.1.0 /usr/lib64/libpython3.7m.so.1.0
#默认安装python版本是3.6的情况
sudo ln -s /usr/python/bin/python3 /usr/bin/python #不执行就找不到python命令,导致用到改命令的地方会报错。(如启动宝塔会报错:/etc/init/bt strat)
sudo ln -s /usr/python/bin/python3 /usr/bin/python3
3. 安装mysql、nginx、phpadmin
3.1 安装宝塔
方便项目运维管理,我们先安装宝塔软件:
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
安装完成后:
用宝塔很容易安装mysql、nginx、phpadmin。
3. 安装uwsgi
3.1 安装
python3 -m pip install uwsgi #安装命令
ln -s /usr/python/bin/uwsgi /usr/bin/uwsgi #创建快捷方式
3.2 创建uwsgi启动配置文件
创建uwsgi-flaskdemo.ini文件,内容如下:
[uwsgi]
# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:6005
# python 调用的模块
module = app
# python 启动程序文件
wsgi-file = /home/FlaskDemo/app.py
# python app
callable = app
# 处理器数
processes = 4
# 线程数
threads = 2
# 设置url地址最大长度, 默认长度是4096
buffer-size = 40960
http-websockets = 1
gevent = 1000
async = 30
# 守护进程
daemonize = /home/FlaskDemo/logs/server.log
# 单个日志文件最大容量
log-maxsize = 102400
uwsgi更多配置项:
master = true #启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。
chdir = /web/www/mysite #在app加载前切换到当前目录, 指定运行目录
module = mysite.wsgi # 加载一个WSGI模块,这里加载mysite/wsgi.py这个模块
py-autoreload=1 #监控python模块mtime来触发重载 (只在开发时使用)
lazy-apps=true #在每个worker而不是master中加载应用
socket = /test/myapp.sock #指定socket文件,也可以指定为127.0.0.1:9000,这样就会监听到网络套接字
processes = 2 #启动2个工作进程,生成指定数目的worker/进程
buffer-size = 32768 #设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。
daemonize = /var/log/myapp_uwsgi.log # 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
log-maxsize = 5000000 #设置最大日志文件大小
disable-logging = true #禁用请求日志记录
vacuum = true #当服务器退出的时候自动删除unix socket文件和pid文件。
listen = 120 #设置socket的监听队列大小(默认:100)
pidfile = /var/run/uwsgi.pid #指定pid文件
enable-threads = true #允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程
reload-mercy = 8 #设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)
max-requests = 5000 #为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。你可以使用这个选项来默默地对抗内存泄漏
limit-as = 256 #通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。
harakiri = 60 #一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)
3.3 uwsgi常用命令
#启动 uwsgi
uwsgi --http-socket :6005 --http-websockets --wsgi-file app.py --callable app --master --processes 4 --threads 2 --stats 127.0.0.1:9191
#停止 uwsgi
pkill -f uwsgi -9
4. 创建nginx配置文件
由于用宝塔安装的软件,默认安装目录是:/www/server,我们先查看一下nginx的配置文件,
cat /www/server/nginx/conf/nginx.conf
user www www;
worker_processes auto;
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
multi_accept on;
}
http
{
include mime.types;
#include luawaf.conf;
include proxy.conf;
default_type application/octet-stream;
server_names_hash_bucket_size 512;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server_tokens off;
access_log off;
server
{
listen 888;
server_name phpmyadmin;
index index.html index.htm index.php;
root /www/server/phpmyadmin;
#error_page 404 /404.html;
include enable-php.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
access_log /www/wwwlogs/access.log;
}
include /www/server/panel/vhost/nginx/*.conf;
}
看到配置文件里面末尾:include /www/server/panel/vhost/nginx/*.conf;,说明我们在/www/server/panel/vhost/nginx目录里创建xxxx.conf文件,重启nginx,就会加载。下面我们创建文件vi /www/server/panel/vhost/nginx/flaskdemo.conf,文件内容如下:
server {
listen 80;
server_name xxx.xxx.xxx.xxx; # 公网地址,这里要写自己服务器的IP
location / {
include uwsgi_params; # 导入uwsgi配置
uwsgi_pass 127.0.0.1:6005; # 需要和uwsgi里的地址一致,才能转发到uwsgi上
uwsgi_param UWSGI_PYHOME /usr/python/bin; # 指向虚拟环境目录
uwsgi_param UWSGI_CHDIR /home/FlaskDemo; # 项目根目录
uwsgi_param UWSGI_SCRIPT app:app; # 启动的主程序
}
access_log /www/wwwlogs/access.log;
}
创建好文件保存后,重启nginx,/etc/init.d/nginx restart
Stoping nginx... done
Starting nginx... done
查看端口情况,netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3647/nginx: master
tcp 0 0 127.0.0.1:6005 0.0.0.0:* LISTEN 1904/uwsgi
tcp 0 0 0.0.0.0:888 0.0.0.0:* LISTEN 3647/nginx: master
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 3647/nginx: master
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1397/redis-server 1
tcp6 0 0 :::3306 :::* LISTEN 687/mysqld
看到127.0.0.1:6005就说明nginx配置成功了,接下来启动uwsgi
5. 启动uwsgi
uwsgi uwsgi-flaskdemo.ini &
[1] 3694
[aaa@qq.com FlaskDemo]# [uWSGI] getting INI configuration from uwsgi-flaskdemo.ini
下面查看访问页面:http://xxx.xxx.xxx.xxx(自己服务器的IP),如图:
出现上述登录页面,就说明项目配置成功了。
6. 后记
本文讲解了flask+docker + nginx + uwsgi环境部署,下一章讲解https部署。
推荐阅读
-
详解Django+Uwsgi+Nginx 实现生产环境部署
-
Django uwsgi Nginx 的生产环境部署详解
-
SLAM+语音机器人DIY系列:(八)高阶拓展——2.centos7下部署Django(nginx+uwsgi+django+python3)
-
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
-
用uWSGI和Nginx部署Flask项目的方法示例
-
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
-
Django+Uwsgi+Nginx如何实现生产环境部署
-
nginx+uwsgi部署django项目
-
Centos部署django服务nginx+uwsgi的方法
-
如何基于nginx+uWSGI+django+virtualenv+supervisor部署发布web项目