前面三篇介绍了全栈系统里面后台和前端、移动端: 后台篇:Flask搭建后台 前端篇:Vue2.0搭建PC前端 移动端篇:H5+搭建移动端应用 项目线上地址:项目访问链接,账号:general 密码:general
今天讲述项目部署:docker + nginx + uwsgi,部署项目线上运行环境。
安装配置docker详情参考另一篇博文:安装配置docker
(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方便项目运维管理,我们先安装宝塔软件:
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh安装完成后: 用宝塔很容易安装mysql、nginx、phpadmin。
创建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 = 102400uwsgi更多配置项:
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超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)#启动 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由于用宝塔安装的软件,默认安装目录是:/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
uwsgi uwsgi-flaskdemo.ini &
[1] 3694 [root@260436f25ac9 FlaskDemo]# [uWSGI] getting INI configuration from uwsgi-flaskdemo.ini下面查看访问页面:http://xxx.xxx.xxx.xxx(自己服务器的IP),如图: 出现上述登录页面,就说明项目配置成功了。
本文讲解了flask+docker + nginx + uwsgi环境部署,下一章讲解https部署。
