当前位置: 首页 > 后端技术 > Python

CentOS下通过Gunicorn+Nginx部署一个PythonFlask建站,并配置https和Nginx访客日志

时间:2023-03-25 19:42:24 Python

原文地址https://www.cyberlight.xyz/pa...搭建Cyber??Light后,我有了完整的Python建站经验,在此记录一下,以备日后查询,希望对初学python建站的朋友有所帮助。本篇笔记的默认条件是:1、你已经在Linux上成功部署了Flask开发环境,想要部署生产环境。2、至此,你已经建立了自己的Flask项目目录,并安装了虚拟环境。3、你的域名已经解析到服务器ip。【这里的服务器是指物理层面的服务器主机,不是用于请求响应的web服务器】以下是笔记内容环境:CentOS7,Python3.6.81.在Flask项目的开发环境中运行通过gunicorn,启动Flask常用图红色警告,Flask官方不建议我们生产环境使用此服务器。在实际生产环境中,我们需要一个性能更强的WSGI服务器。本篇笔记选择gunicorn。(经过亲身体验,gunicorn确实比Flask开发的server快。)接下来安装gunicorn,进入Linux终端,将命令窗口的路径切换到项目根目录,首先激活Python虚拟环境,此时,在命令窗口输入.venv/bin/activate继续输入以下内容,使用pip安装gunicornpip3installgunicorn激活后,输入以下命令运行Flask项目gunicorn-w4-t30-b0.0.0.0:5000app:app(注意这个命令根据实际情况变化)在这个命令中,-w后面的数字代表worker(工作线程)的数量(-w4代表4个worker进程),一般是建议worker数量为(2*CPU数量)+1-t后的数字代表超时时间,单位second-b后跟ip:port(0.0.0.0:5000是运行在5000端口下)serverip【这里的server指的是服务器主机在物理层,不是用于请求响应的web服务器])app:app,:左边的app代表Flask运行的主程序(我的Flask主程序是app.py),右边的app可以写成如下。例如,如果你的Flask主程序名为test.py,那么这部分就是test:app。关于worker个数的选择,在Python环境下,可以通过以下代码查询CPU个数importmultiprocessingprint(multiprocessing.cpu_count())比如我笔记本处理器,i7-8750HCPU个数可用,而我的notebook理论上可以设置(2*12)+1=25个worker进程。其实4~12个worker进程每秒可以处理几十万个请求(此段来自李辉,《Flask Web 开发实战》,推荐~)启动gunicorn后,可以通过http://ip:你设置的端口号访问您的网站。但是由于生产环境的配置,我们往往希望Flask项目能够一直在后台运行,而不是关闭命令窗口然后失败。我的解决方案是创建一个专用于gunicorn运行的Linux窗口。即使我们退出Linux命令窗口,也不影响具体的步骤。停止之前运行的gunicorn,进入linux(本文为CentOS)命令窗口,输入以下命令安装screenyuminstallscreencreatesanewwindownamedname(name是你定义的窗口名【可以自由设置】,S必须大写)screen-Sname进入Flask项目根目录,激活虚拟环境。venv/bin/activate和之前运行gunicorn一样,比如我的命令是gunicorn-w4-t30-b0.0.0.0:5000app:app然后按CTRL+A+D离开窗口(如只要服务器没有关闭,gunicorn就会一直在后台运行)。输入screen-rname以切换回命令窗口屏幕以获取更多命令,请参阅此注释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是一个成熟的网络服务器。使用Nginx反向代理gunicorn,不仅可以提高程序的处理能力和静态文件的处理效率,还可以提高服务器的安全性。系数以避免直接暴露WSGI服务器。我通过宝塔面板配置了Nginx和网站数据库,你也可以直接在终端配置。以下是我的方法。首先按照宝塔官方教程安装宝塔面板。CentOS输入如下命令(安装前需要保证是干净的操作系统,其他环境没有安装Apache/Nginx/php/MySQL(现有环境无法安装))yuminstall-ywget&&wget-Oinstall.shhttp://download.bt.cn/install..._6.0.sh&&shinstall.sh安装完成后,命令窗口会生成登录地址、账号和密码。在浏览器中打开,登录后进入宝塔面板主页面。第一次进入时忽略推荐的安装提示,在左侧一栏Store选择软件,然后选择运行环境,安装完成后安装Nginx,点击Nginx那一行最右边的设置按钮,选择配置修改(这里是Nginx的主要配置文件),在server{listen80;下面添加一段服务器配置内容#监听端口号,http默认80,请不要修改server_namewww.xxx.com;#这里是你的域名位置/{proxy_passhttp://0.0.0.0:5000;#这是我上面设置的Nginx运行5000端口,你根据自己的配置设置proxy_redirectoff;proxy_set_header主机$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;在location/static/(.*){root/www/flask/xxx/的子目录下;#这里的路径是绝对路径,xxx指的是静态目录的父目录,一般是网站的根目录}}在上面的配置中,我的网站的绝对路径是/www/flask/xxx,并且静态目录的路径是/www/flask/xxx/static设置完成后点击保存,在窗口第一行点击服务(Nginx管理),点击重新加载配置进入网页,输入http://+你的域名即可通过80端口访问网站.至此,如果不出意外的话,网站可以正常运行了。下面记录设置https的过程。我用的是宝塔的免费证书。地址为https://www.bt.cn/admin/safe。选择DNS验证),然后按照宝塔教程验证是否验证成功。验证成功后,下载证书,解压,进入证书目录/Nginx,将两个文件传输到服务器。同样插入一个server配置,如下(如果之前插入过80端口的配置,请删除80端口的配置)server{listen443ssl;#监听端口号,https默认为443,请不要修改server_namewww.xxx.com;#这里是你的域名#下面是证书配置ssl_certificate/abc/ssl/xxx.pem;#配置证书位置(路径为服务器存放证书的绝对路径),文件格式为.pem,有时为.srtssl_certificate_key/abc/ssl/xxx.key;#配置秘钥位置(路径为服务器存放证书的绝对路径),文件格式为.key#ssl_client_certificateca.crt;#双向认证#ssl_verify_clienton;#双向认证ssl_session_cacheshared:SSL:1m;ssl_session_timeout5m;ssl_protocolsTLSv1TLSv1.1TLSv1.2;ssl_ciphersEECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:HIGH:!RC4:!MD5:!aNULL:!NULeNULL:!:!DH:!EDH:!EXP:+中等;#上面是证书配置位置/{proxy_passhttp://0.0.0.0:5000;#这是上面的我设置的Nginx运行端口5000,根据您自己的配置设置proxy_redirectoff;proxy_set_header主机$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerX-Forwarded-Proto$scheme;#fixflaskredirect生产环境从https跳转到http}#用Nginx访问Flask静态文件#静态文件在静态子目录或下级子目录location/static/(.*){root/www/flask/xxx/;#这里的路径是绝对路径,xxx指的是静态目录的上层目录,一般是网站的根目录}}按照图中的说明配置证书即可,静态的配置方法文件与上面注释中提到的相同。需求:当客户访问http时,自动跳转到https然后插入一个服务器配置server{listen80;#监听80端口server_namewww.xxx.com;#这里是域名重写^(.*)$https://$host$1permanent;#Forciblyjumphttprequeststohttps}同样,保存后重新加载Nginx配置。以上就是Flask部署https的所有设置,现在就可以通过https://你的域名访问你的网站了3.配置Nginx访客日志由于gunicorn是通过Nginx做反向代理的,我们可以直接通过Nginx并生成访客日志,有了日志,就可以使用Python数据分析访客情况。和之前的笔记一样,进入Nginx设置-配置修改,在已有的http{}配置中添加如下内容,添加后的大体结构如下http{log_formatmain'$remote_addr-$remote_user[$time_iso8601]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x_forwarded_for"';access_log日志/access.logmain;#访客日志生成路径,这个是相对路径,它的根目录是Nginx的安装目录...#...代表http范围内的原始内容,不用管,保持不变,添加即可以上内容}Nginxlog参数分别代表以下信息参数列表:$remote_addr客户端的ip地址(代理服务器,显示代理服务ip)$remote_user用于记录远程客户端的用户名(通常是“-")$time_local用于记录访问时间和Timezone(这里使用更通用的时间格式,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随服务器自动启动或者系统出现故障时及时重启。我使用Supervisor管理CentOS下虚拟环境的GunicornFlask项目,实现启动等功能。我把自己的实现过程记录下来,谢谢阅读!