这里带来的nginx+uwsgi部署方式是考虑到兼顾flask的并发,能给项目带来更好的体验。
具体部署图示如下:
首先需要的是之前文章里面提的环境搭建,这是前提,具体可以点击链接跳转查看:
centos7 部署应用相关配置
安装uWSGI
安装前需要安装一些依赖包,输入如下命令:
yum -y install gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel GeoIP gd libXpm libxslt sqlite-devel
然后:
进入虚拟环境里:
pip install uwsgi
然后新建一个uwsgi.ini配置文件,放置在应用根部目下,
打开并写入以下内容:
[uwsgi]
#http=127.0.0.1:5000
# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:5000
#虚拟环境目录
home = /root/.virtualenvs/flask-movie
#指向网站根目录
chdir = /usr/local/nginx/html/flask_movie
#python启动程序文件
wsgi-file = manage.py
#python程序内用于启动的application变量名
callable = app
#处理器数
processes = 4
#线程数
threads = 2
#状态监测地址
stats = 127.0.0.1:9191
#设置uwsgi包解析的内部缓存区大小。默认4k
buffer-size = 32768
uWSGI命令
uwsgi 启动 :虚拟环境下uwsgi config.ini
uwsgi 关闭:虚拟环境下killall -9 uwsgi
在根目录下,输入启动命令,如果不报错,出现如下命令,则启动成功。
[uWSGI] getting INI configuration from uwsgi.ini
*** Starting uWSGI 2.0.17 (64bit) on [Tue Jul 3 22:42:15 2018] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-16) on 02 July 2018 14:12:13
os: Linux-3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018
nodename: shenghun
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /home/Servers_Nginx/Fisher
detected binary path: /usr/bin/uwsgi
uWSGI running as root, you can use --uid/--gid/--chroot options
nginx的配置
虽然只有Uwsgi也可以直接部署项目,但是为了安全,需要Nginx来进行请求代理,反向代理代理的是内部服务器,正是有Nginx存在,Uwsgi的真正接口才不会暴露在网络上,服务器的安全才有了一定的保障(当然,恶意攻击另说),此外,Nginx还自带防DDoS攻击机制.可以说日常使用是非常省心了.
前文已经对nginx的安装有了介绍,这里就不重复说明了,具体可以参考以下链接:
nginx安装
对于服务器来说,可能不会单单只部署一个应用,可能存在多个网站站点的情况,所以配置nginx一般也要考虑到这种情况,这里采用的是主文件加配置文件的方式,单个应用的nginx配置文件单独放置,用include的方式引入主文件中。
主文件配置:
新建主配置文件nginx.conf
worker_processes 4;
events {
worker_connections 262140;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
limit_conn_zone $binary_remote_addr zone=addr:5m;
include /etc/nginx/vhosts/*.conf;
}
将其复制到nginx配置文件目录下:
cp nginx.conf /usr/local/nginx/conf/
项目nginx配置子文件:
新建应用配置文件flask_movie.conf
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
include /usr/local/nginx/html/flask_movie/uwsgi_params;
uwsgi_pass 127.0.0.1:5000; # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理
uwsgi_param UWSGI_PYHOME /root/.virtualenvs/flask-movie; # 指向虚拟环境目录
uwsgi_param UWSGI_CHDIR /usr/local/nginx/html/flask_movie; # 指向网站根目录
uwsgi_param UWSGI_SCRIPT manage:app; # 指定启动程序
uwsgi_read_timeout 100;
}
location ~ \.flv$ {
flv;
limit_conn addr 4;
limit_rate 1024k;
rewrite ^/static/uploads/movies/(.+?).flv$ /flask_movie/app/static/uploads/movies/$1.flv permanent;
}
location ~ \.mp4$ {
mp4;
limit_conn addr 4;
limit_rate 1024k;
rewrite ^/static/uploads/movies/(.+?).mp4$ /flask_movie/app/static/uploads/movies/$1.mp4 permanent;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
在/etc/下新建层级目录/nginx/vhosts/,然后将应用nginx配置文件放入目录中。
我在配置的时候出了一个错,记录一下,在重启nginx和开启uwsgi后,报:
in bind_to_environ environ['REQUEST_METHOD'], path_info, KeyError: 'REQUEST_METHOD'
这是因为没有配置uwsgi_params,新建文件命名为uwsgi_params,放置在项目根目录下,内容如下:
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param UWSGI_SCHEME $scheme;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
然后启动项目:(项目根目录下操作)
uwsgi uwsgi.ini
重启nginx:
nginx -s stop
nginx
nginx -s reload
浏览器访问服务地址,点亮服务,一切ok,这样配置,也方便以后拓展。
版权属于:Jolly
本文链接:https://totoro.site/index.php/archives/45/
关于转载:原创文章,禁止转载