部署Flask应用到服务器,需要python环境,uwsgi服务,nginx反向代理服务。
CentOS7的默认源里没有nginx,需要先下载epel-release,再yum安装nginx
yum install epel-release
yum install nginx
离线安装方法不在此说明......
describe | command |
---|---|
启动 | nginx |
查看版本 | nginx -v |
停止 | nginx -s -stop |
退出服务 | nginx -s quit |
重载服务 | nginx -s reload(重载配置文件,不中止服务) |
强制停止 | pkill -9 nginx |
验证配置文件 | nginx -t |
使用配置文件 | nginx -c "配置文件名" |
检查配置文件是否可用 | nginx -t -c "配置文件名" |
使用帮助 | nginx -h |
查看nginx是否自启动
systemctl is-enabled nginx
设置nginx自启动(如果是实机服务器nginx方式,就设置自启动;如果用docker部署nginx container,则不要让实机nginx自启动,避免不必要的问题产生)
systemctl enable nginx
启动nginx
systemctl start nginx
如果没有报错的话,可以执行netstat -lntp
查看服务端口占用情况,能够看到nginx已启动,监听80端口。
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5958/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2960/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3541/master
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::80 :::* LISTEN 5958/nginx: master
tcp6 0 0 :::22 :::* LISTEN 2960/sshd
tcp6 0 0 :::23 :::* LISTEN 1/systemd
tcp6 0 0 ::1:25 :::* LISTEN 3541/master
打开浏览器输入服务器的IP地址,或服务器输入curl 127.0.0.1,会返回nginx欢迎页面。
默认配置文件nginx.conf存放在**/etc/nginx/**路径下,里面还有其它的一些配置文件。
nginx.conf配置文件有非常灵活的配置方法,比如设置静态文件服务器、正向代理、反向代理、透明代理、负载均衡、一机多webapp(虚拟主机)、https代理等,此处不展开。
nginx.conf配置文件http部分中包含server代码段,如果有需要,可以单独配置包含server配置的配置文件,存放到/etc/nginx/conf.d/路径下,然后将nginx.conf中server的部分全部注释掉,nginx加载配置文件时,会加载/etc/nginx/conf.d/中的所有.conf配置文件。
[nginx.conf中的解释]
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
单独创建一个server_local.conf,存放到/etc/nginx/conf.d/路径下。
在里面写入以下内容(去掉注释内容)
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
charset utf-8;
# 项目的路径下存储access log和error log,方便查看
access_log /home/your_project/logs/access.log;
error_log /home/your_project/logs/error.log;
location / {
# 使用uwsgi
include uwsgi_params;
# 指定uwsgi的代理地址(这里要跟uwsgi.ini的socket配置一致)。
# 也可以使用.sock文件方式设置
uwsgi_pass 127.0.0.1:8001;
# 指定python路径,这里可以给python的虚拟环境/xxx/venv,也可以给实机环境
uwsgi_param UWSGI_PYHOME /usr/local/anaconda3/bin;
# 设置项目的绝对路径,不想把项目文件放在/usr/share/nginx/html下,那么在这里可以指定任何路径
uwsgi_param UWSGI_CHDIR /home/your_project;
# uwsgi的运行脚本:实例名称(就是上面项目的绝对路径下有个manage.py,里面有app.run())
uwsgi_param UWSGI_SCRIPT manage:app;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
验证nginx.conf是否可用
[root@localhost nginx]# nginx -t -c /etc/nginx/nginx.conf
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重启动nginx服务,让配置文件生效
systemctl restart nginx
这个安装就很简单了(离线安装方法不在此说明)
pip install uwsgi
安装完成后,编写uwsgi.ini文件,存放在项目目录下,与manage.py放在一起。
ini配置很丰富,不过如果在nginx_server.conf配置过的参数,这里其实可以省略掉,或者反过来。
[uwsgi]
# 允许主进程存在
master = true
# 指定项目运行文件
wsgi-file = manage.py
# 指定项目的Flask实例名
callable = app
# 地址:端口号,socket方式,这里必须跟nginx中配置的一致
socket = 127.0.0.1:8001
# 处理器个数
processes = 1
# 线程个数
threads = 2
# 设定buffer size,默认4k
buffer-size = 32768
# 指定log输出
logto = /root/nginx/logs/uwsgi.log
## 其它参数:
# chdir = /home/your_project/ : 修改路径到你的项目的路径下
# pythonpath = /home/your_project/venv : 指定python的路径,nginx中配置了的话,这里就不需要再配
# log-maxsize = 10000 :以固定的文件大小(单位KB),切割日志文件。 例如:log-maxsize = 10000 就是10M一个日志文件。
# pidfile = /xxx/uwsgi.pid : 指定pid文件的位置,记录主进程的pid号。
# vacuum = true : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)
# stats = 127.0.0.1:9191 : 设置统计端口
# disable-logging = true : 不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中。如果不开启这项,那么你的日志中会大量出现这种记录:
## [pid: 347|app: 0|req: 106/367] 117.116.122.172 () {52 vars in 961 bytes} [Thu Jul 7 19:20:56 2016] POST /post => generated 65 bytes in 6 msecs (HTTP/1.1 200) 2 headers in 88 bytes (1 switches on core 0)
启动uwsgi(启动一下看看输出log有没有什么报错信息)
uwsgi --http :8000 --ini uwsgi.ini -d ./uwsgi.log --pidfile=uwsgi.pid
当前路径下生成uwsgi.log和uwsgi.pid,打开浏览器输入ip:8000,查看uwsgi.log的输出,没问题的话,执行uwsgi --stop uwsgi.pid
关闭调试uwsgi。
注:本机调试时必须用http协议启动,用socket协议启动的话,会有block size错误信息。
后台启动(配置了logto的情况下)
uwsgi --ini uwsgi.ini --pidfile=uwsgi.pid &
关闭uwsgi
uwsgi --stop uwsgi.pid
[或]
sudo pkill -f uwsgi -9
设置uwsgi开机自启动的两种方法
1.(没试过)将uwsgi配置成一个systemctl service(centOS7已经取消rc.local)
在/etc/init.d/下新建三个sh脚本
uWSGI服务启动脚本文件"uwsgi-start.sh":
#!/bin/sh
/home/your_project/venv/bin/uwsgi --ini /home/your_project/uwsgi.ini --pidfile=/home/your_project/uwsgi.pid &
uWSGI服务重启脚本文件"uwsgi-restart.sh":
#!/bin/sh
/home/your_project/venv/bin/uwsgi --restart /home/your_project/uwsgi.pid
uWSGI服务停止脚本文件"uwsgi-stop.sh":
#!/bin/sh
/home/your_project/venv/bin/uwsgi --stop /home/your_project/uwsgi.pid
再创建uwsgi.service
vim /usr/lib/systemd/system/uwsgi.service
# 将以下内容粘贴进去
[Unit]
Description=uwsgi
After=network.target
[Service]
Type=forking
PIDFile=/home/your_project/uwsgi.pid
ExecStart=/etc/init.d/uwsgi
ExecRestart=/etc/init.d/uwsgi -s restart
ExecStop=/etc/init.d/uwsgi -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
设置systemctl管理启动uwsgi.service
systemctl enable uwsgi.service
systemctl start uwsgi.service
如果提示"Failed to execute operation: Access denied",输入"systemctl daemon-reexec"可解决。
(真的没试过)
2.使用supervisor管理uwsgi的启动
Supervisor可以同时启动多个应用,最重要的是,当某个应用Crash的时候,可以自动重启该应用,保证可用性。
安装supervisor
yum install supervisor
Supervisor 的全局的配置文件位置:/etc/supervisor/supervisor.conf
添加一个新的.conf 文件放在/etc/supervisor/conf.d/
新建立一个用于启动 flask 项目的 uwsgi 的 supervisor program配置 (命名为:your_project_uwsgi_supervisor.conf),粘贴进去下面的信息:
[program:your_project]
# 启动命令入口
command=/home/your_project/venv/bin/uwsgi /home/your_project/uwsgi.ini
# 命令程序所在目录
directory=/home/your_project
# 运行命令的用户名
user=root
numprocs=1
autostart=true
autorestart=true
# 日志地址
stdout_logfile=/home/your_project/logs/uwsgi_supervisor.log
启动服务
sudo service supervisor start
终止服务
sudo service supervisor stop
如果使用虚拟环境,注意上面nginx配置的uwsgi_param UWSGI_PYHOME修改成虚拟环境路径
安装virtualenv(CentOS7自带的是python2.7,默认/usr/bin/virtualenv也是2.7版本的,如果是使用python3开发的话,必须重新安装virtualenv)
pip install virtualenv
进入项目目录,在目录下键入
virtualenv venv
venv是要创建的虚拟环境文件夹的名字。
[root@localhost ]# virtualenv venv
Using base prefix '/usr/local/anaconda3'
New python executable in /home/your_project/venv/bin/python
Installing setuptools, pip, wheel...
done.
激活虚拟环境source venv/bin/activate
,激活后,提示符前会有(venv),退出虚拟环境使用deactivate
[root@localhost ]# source venv/bin/activate
(venv) [root@localhost ]#
在虚拟环境中安装项目依赖python模块,可以使用开发环境导出的requirements.txt,导入文件后,用pip install -r requirements.txt
安装。