原文地址 https://www.cyberlight.xyz/pa...
搭建CyberLight后有了完整Python建站经历,在此作下记录,以便以后查询,但愿能帮到初学python建站的朋友。php
本次笔记的默认条件为:html
1. 您已在Linux成功部署Flask开发环境,欲部署生产环境。python
2.此时您已自建Flask项目目录,并安装了虚拟环境。linux
3.您的域名已解析到服务器ip。【此处服务器是指物理层面的服务器主机,不是用于请求响应的Web服务器】nginx
下面是笔记内容数据库
环境: CentOS 7, Python 3.6.8flask
1、经过gunicorn运行Flask项目segmentfault
开发环境中,启动Flask常见图中的红色警告,Flask官方并不建议咱们将此服务器用于生产环境。在实际生产环境中,咱们须要一个性能更强的WSGI服务器,这篇笔记选择了gunicorn。(我的体验后,gunicorn的确比Flask开发时的服务器有肉眼可见的速度提高)浏览器
下面安装gunicorn安全
进入Linux终端,命令窗口路径 切换至 项目根目录,首先激活Python虚拟环境
此时,在命令窗口输入
继续输入如下内容,使用pip安装gunicorn
激活后,输入如下命令运行Flask项目
(注意,该命令根据实际状况变化)该命令中,
-w后的数字表明worker(工做线程)数量(-w 4表明4个worker进程),一般建议worker数量为 (2 * CPU数量) + 1
-t后的数字表明超时时间,单位 秒
-b后是 ip:端口(0.0.0.0:5000为在服务器ip下的5000端口运行【此处服务器是指物理层面的服务器主机,不是用于请求响应的Web服务器】)
app:app,: 左边的app表明Flask运行的主程序(个人Flask主程序为app.py),: 右边的app照写便可。如,您的Flask主程序名为test.py,则该部分为test:app
关于worker数量的选择,在Python环境中,可经过以下代码查询CPU数量
import multiprocessing print(multiprocessing.cpu_count())
如,个人笔记本处理器,i7-8750H CPU数量为
可得,个人笔记本理论能设置 (2 * 12) + 1 = 25 个worker进程。事实上,4~12个worker进程就能够每秒处理成百上千个请求(这段出自李辉大神的《Flask Web 开发实战》,推荐~)
启动gunicorn后,便能经过 http://ip:您设置的端口号 进入您的网站了。然而,因为是生产环境的配置,咱们每每但愿Flask项目能一直运行于后台,而不会关闭命令窗口后失效。
个人解决方案是,建立一个专属gunicorn运行的Linux窗口,即使咱们退出Linux命令窗口也不影响
具体步骤为,
中止前面运行的gunicorn,进入Linux(本文是CentOS)命令窗口,输入以下命令安装screen
建立一个名为name的新窗口(name为您定义的窗口名【可自由设置】,S必定要大写)
进入Flask项目根目录,激活虚拟环境
像以前同样运行gunicorn,如个人命令为
以后按CTRL+A+D离开该窗口(只要不关闭服务器,gunicorn会一直在后台运行)。输入screen -r name能切换回该命令窗口
screen的更多命令见这篇笔记https://www.cyberlight.xyz/passage/linux-screen
此处经过 新建独立命令窗口 的方法运行gunicorn,若您须要实现 gunicorn随服务器开机自启(经过supervisor管理gunicorn),别急,笔记末尾将指示。
至此,gunicorn 的配置完成。(此处没有配置80或443端口,将在后面说明)
2、配置Nginx反向代理gunicorn
经过虚拟专用网络技术可让远程服务器代理客户端,让咱们以远程服务器的ip 请求访问 公司的内网,这种代理称为正向代理。Nginx能够做为服务器,代理gunicorn服务端监听来自外部的请求,即是反向代理。咱们将用Nginx配置80或443端口反向代理gunicorn的运行端口
Nginx是成熟的Web服务器,使用Nginx反向代理gunicorn,不只能提高程序的处理能力、静态文件的处理效率,还能提升服务器的安全系数,避免直接暴露WSGI服务器。
我经过宝塔面板配置的Nginx和网站数据库,您也能够直接在终端配置,下面是个人方法
首先按宝塔的官方教程安装宝塔面板,CentOS输入以下命令(安装前须要确保是干净的操做系统,没有安装过其它环境带的Apache/Nginx/php/MySQL(已有环境不可安装))
安装后,命令窗口会生成登陆地址、帐号、密码,在浏览器打开并登陆便可
进入宝塔面板主页面,忽略 首次进入时 推荐的安装提示,选择左侧栏的 软件商店,而后选择 运行环境,安装Nginx
安装后,点击Nginx行最右边的设置按钮,选择配置修改(这里即是Nginx的主配置文件)
在下面增长一段server配置内容
server { listen 80; #监听的端口号,http默认为80,请勿修改 server_name www.xxx.com; #这里是您的域名 location / { proxy_pass http://0.0.0.0:5000; #这是上面我设置的Nginx运行端口5000,您根据本身的配置设置 proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #用Nginx访问Flask静态文件 #静态文件在static的子目录或更低层的子目录中 location /static/(.*) { root /www/flask/xxx/; #这里的路径是绝对路径,xxx是指static目录的上级目录,通常是网站根目录 } }
上面的配置中,个人网站绝对路径是 /www/flask/xxx,static目录的路径是/www/flask/xxx/static
设置完成后点击保存,点击该窗口(Nginx管理)第一行的 服务,点击 重载配置
进入网页,输入 http://+您的域名 变能经过80端口访问网站了,至此,若是没别的需求,网站便能正常运行了
下面记录设置https的过程
我使用的宝塔免费证书,地址 https://www.bt.cn/admin/safe
进入该网站,选择SSL管理,点击申请证书(验证方式选择DNS验证),以后按宝塔的教程验证便可
验证成功后下载证书,解压后进入 证书目录/Nginx,将两个文件都传至服务器
再次打开宝塔面板的Nginx设置,选择配置修改,和笔记前文同样,插入一段server配置,以下(若是前面插入过80端口的配置,请将80端口的配置删除)
server { listen 443 ssl; #监听的端口号,https默认为443,请勿修改 server_name www.xxx.com; #这里是您的域名 #下面是证书配置 ssl_certificate /abc/ssl/xxx.pem; #配置证书位置(该路径为服务器存放证书的绝对路径),文件格式为.pem,有时是.srt ssl_certificate_key /abc/ssl/xxx.key; #配置秘钥位置(该路径为服务器存放证书的绝对路径),文件格式为.key #ssl_client_certificate ca.crt;#双向认证 #ssl_verify_client on; #双向认证 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM; #上面是证书配置 location / { proxy_pass http://0.0.0.0:5000; #这是上面我设置的Nginx运行端口5000,您根据本身的配置设置 proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # fix flask redirect生产环境 从https到http跳转 } #用Nginx访问Flask静态文件 #静态文件在static的子目录或更低层的子目录中 location /static/(.*) { root /www/flask/xxx/; #这里的路径是绝对路径,xxx是指static目录的上级目录,通常是网站根目录 } }
按图中的说明配置证书便可,静态文件的配置方法和笔记上文提到的同样
若是须要:当客户访问http时,自动跳转到https。 则再插入一段server配置
server { listen 80; #监听80端口 server_name www.xxx.com; #这里是域名 rewrite ^(.*)$ https://$host$1 permanent; #将http请求强制跳转到https }
一样,保存后重载Nginx配置。
以上是Flask部署https的所有设置,如今便能经过 https://您的域名 访问您的网站了
3、配置Nginx访客日志
因为经过Nginx反向代理gunicorn,咱们能够直接经过Nginx统计访客,生成访客日志,有了日志,便能用Python数据分析访客状况
和笔记前文同样,进入Nginx的 设置—配置修改 中,在已存在的http{}配置中增长以下内容,增长后的大体结构以下
http { log_format main '$remote_addr - $remote_user [$time_iso8601] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; #访客日志的生成路径,这是相对路径,它的根目录是Nginx的安装目录 ... #...表明http做用域中原来的内容,没必要关心,保持不变便可,只须要添加上面的内容 }
Nginx日志的参数分别表明下面的信息
$remote_addr
客户端的ip地址(代理服务器,显示代理服务ip)
$remote_user
用于记录远程客户端的用户名称(通常为“-”)
$time_local
用于记录访问时间和时区(这里采用了一种更通用的时间格式,time_iso8601)
$request
用于记录请求的url以及请求方法
$status
响应状态码,例如:200成功、404页面找不到等。
$body_bytes_sent
给客户端发送的文件主体内容字节数
$http_user_agent
用户所使用的代理(通常为浏览器)
$http_x_forwarded_for
能够记录客户端IP,经过代理服务器来记录客户端的ip地址
$http_referer
能够记录用户是从哪一个连接访问过来的
以下图所示,能够直接进入Nginx根目录,找到日志所在目录
以后能够用python进行数据分析,若是我有较好的方案,也会继续作相关笔记
感谢您阅读到这里,若是您有任何疑问或其余方法,欢迎到评论区留言哦!
注:
上述笔记实现了 Gunicorn后台运行,而更多时候咱们须要 Gunicorn 随服务器开机自启 或 系统出错时及时重启,我在 CentOS下经过Supervisor管理虚拟环境的Gunicorn Flask项目,实现开机自启等功能 中记录了本身的实现过程,感谢阅读!