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
[root@260436f25ac9 FlaskDemo]# [uWSGI] getting INI configuration from uwsgi-flaskdemo.ini       

下面查看访问页面:http://xxx.xxx.xxx.xxx(自己服务器的IP),如图:
在这里插入图片描述
出现上述登录页面,就说明项目配置成功了。

6. 后记

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

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁爸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值