欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

flask+docker + nginx + uwsgi环境部署

程序员文章站 2022-07-12 17:15:09
...

前面三篇介绍了全栈系统里面后台和前端、移动端:
后台篇: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

安装完成后:
flask+docker + nginx + uwsgi环境部署
flask+docker + nginx + uwsgi环境部署
用宝塔很容易安装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),如图:
flask+docker + nginx + uwsgi环境部署
出现上述登录页面,就说明项目配置成功了。

6. 后记

本文讲解了flask+docker + nginx + uwsgi环境部署,下一章讲解https部署。