阿里云服务器分发flask项目gunicorn + nginx + 支持https
我做了一个微信小程序,用flask实现了相应的后端。必须部署在服务器上才能上线。我之前只是知道它并没有尝试整个链接。网上的资料终于分发到网上了,但是这个过程中出现了很多问题,网上的资料也比较碎片化,所以整理了这篇文章。一方面作为记录供以后参考,另一方面也希望能够为我所用。同样,新手也应该少走弯路。
准备
1.首先,你需要一台服务器。我这里使用的是阿里云,系统使用的是CenterOS 7.9
2.其次要有独立的域名(微信小程序必须是域名访问不能是IP访问,域名必须支持https);
3、其他环境配置:python:3.10.6;蜂鸣声:22.2.1; nginx: 1.20.2 openssl: 1.1.1s
服务器端口开发
由于防火墙的原因,我们需要开放一些服务器上必须使用的端口,否则在公网场景下将无法使用。添加方法也非常简单。在阿里云Esc中,单击服务器上的安全组,创建安全组,然后添加以下端口配置。
duankou.jpg
升级python并安装python3
Center OS7已经安装了Python2,无法删除。我们使用的是Python3,所以需要升级。
- 安装依赖包
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
- Python安装包下载(https://www.python.org/downloads/)
我这里选择安装的是3.10.6♿❀我本地版本的开发环境保持一致。首先从上面的链接下载对应的安装包,上传到/user/local/python3
mkdir /usr/local/python3
cd /usr/local/python3
tar -xvf Python-3.10.6.tar.gz
- 编译安装
cd Python-3.10.6/
./configure --prefix=/usr/local/python3
make && make install
- 创建软链接
ln -sf /usr/local/python3/bin/python3 /usr/bin/python3
- 添加到/usr/local/python3/bin PATH
# vim ~/.bash_profile
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/local/python3/bin
export PATH
- 输入:wq 并按 Enter 退出。更改完成后,执行以下命令,使上一步的更改生效
source ~/.bash_profile
- 检查是否安装了python3。打印版本号,输入成功
[root@iZt4n8a2eru6403z3l0adjZ Python-3.10.6]# python3 -V
Python 3.10.6
pip3安装
运行项目过程中,经常会有一些第三方库需要安装。我们先安装pip,以方便后续的一些操作。
- 首先安装pip相关的安装工具进行预依赖(https://pypi.python.org/pypi/setuptools)
下载对应的安装包,创建setuptools文件夹并上传到此文件夹阿里云-服务器,解压编译
mkdir setuptools
cd setuptools
tar -xvf setuptools-36.6.0.tar.gz
cd setuptools-36.6.0
python3 setup.py build
python3 setup.py install
- 安装pip(https://pypi.python.org/packages/source/)
同样下载安装包,上传到对应文件夹,解压编译
mkdir pip3
cd pip3
tar -xvf pip-22.2.1.tar.gz
cd pip-22.2.1
python setup.py install
# 验证操作是否成功
pip --version
gunicorn
- 安装gunicorn
pip3 install gunicorn
# 查看是否安装成功
gunicorn -h
- 上传工程文件,我们以下面最简单的
hello_world为例
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return '<h1>hello world</h1>'
if __name__ == '__main__':
app.run(debug=True)
- 启动gunicorn❙worker number-b ip: 运行的端口号 Filename: Flask 实例name , - w 表示有3个工作线程; -b指定ip和端口; app 是一个全局变量(app = Flask(_ _name _ _)),例如这里是:
gunicorn -b 127.0.0.1:5000 hello:app
这样直接在地址栏输入 127.0.0.1:5000 就可以了参见
gunicorn -w 4 -b 127.0.0.1:5000 -D --access-logfile log文件路径 运行文件名称:Flask程序实例名
# 例:gunicorn -w 4 -b 127.0.0.1:5000 -D --access-logfile ./logs/log =hello:app
- 重启gunicorn
通过ps -ef | 获取对应的进程ID抓住gunicorn并使用命令kill -HUP进程ID重新启动。执行上述命令后,再次运行“pstree -ap|grep Gunicorn”。我们很容易发现,除了主进程之外,其他Gunicorn进程都被销毁了,并且创建了新的进程(进程ID被改变了)。 - 关闭gunicorn
通过ps -ef | 获取对应的进程ID抓住gunicorn并使用命令kill -9进程ID将其关闭
nginx
使用Nginx主要用于启用、卸载和分担压力。服务器。 Nginx 易于部署、占用内存少、成本低。 Nginx 既可以用作正向代理,也可以用作反向代理。
- 安装pcre预依赖
cd /usr/src
wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
tar -xvf pcre-8.37.tar.gz
cd pcre-8.37
./configure
make && make install
#安装成功查看版本
pcre-config --version
- 安装openssl、zlib、gcc依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
- 安装nginx(https://nginx.org/download/)
选择上面的nginx版本,这里我是通过链接它的第一个选择是nginx-1.12.2.tar.gz。如果不需要支持https的话问题不大。但是后来支持https访问的时候,openssl安装的依赖一直失败,最终还是升级了。 nginx仅修复到1.20.2,因此可以直接安装1.20.2版本。另外,通过上面的链接下载安装包,然后上传到/usr/src/目录下
tar -xvf nginx-1.20.2.tar.gz
cd nginx-1.20.2
./configure
make && make install
# 安装成功的话,会在 usr/local/ 多一个 nginx 目录
cd /usr/local/nginx/sbin
#启动 nginx
./nginx
#查看进程
ps -ef | grep nginx
如果你想在浏览器中直接访问公网IP,还需要更改Nginx配置。路径为:/usr/local/nginx/conf/nginx.conf 文件。通过阿里云的过滤功能(或者vim)打开对应的文件,
nginxc.jpg
server_name这里可以填写公网的IP地址,或者如果你已经有对应的域名并添加了映射我那么情况下,你可以填写自己的域名,更改并保存并运行 nginx -s reload 重新加载配置。这样就可以直接访问对应的公网IP地址或者域名就可以看到上面的hello world页面了。
支持Https
首先你要有相应的ssl证书。如果访问时使用自己生成的,一些常见的浏览器也会询问不安全。阿里云的服务器可以免费提供该证书。
获取SSL证书
登录阿里云-数字证书管理服务-SSL证书,选择免费证书,创建证书,配置证书,绑定域名,下载证书,环境选择Nginx
ssl.jpg
下载后解压。获取证书密钥文件。
更改nginx.conf的配置
将证书上传到阿里云服务器。这里我创建了一个文件夹/usr/src/cert,然后更改nginx.conf文件的配置,添加另一台服务器,具体内容如下:
server {
listen 443 ssl;
server_name 你的域名;
ssl_certificate /usr/src/cert/xxx.pem;
ssl_certificate_key /usr/src/cert/xxx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2 ;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
#ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
proxy_pass http://127.0.0.1:5000;
add_header Access-Control-Allow-Origin *;
}
}
最终文件内容为如下:
https.jpg
保存并执行nginx -s reload重新加载配置,这个时候会报错然后先是nginx,我们还没有启用ssl模块。 CD到我们的nginx源码文件夹
cd /usr/src/nginx-1.20.2
./nginx -V
# 可以看到上面的输出,在configure arguments:后面是不带参数的
nginx激活ssl模块
一般这个时候网上常见的做法是执行下面的命令
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
这时候会出现如下错误: 这是因为系统是centos7.9,原openssl版本是1.0.2k,需要升级openssl版本。
- openssl升级到1.1.1s(https://www.openssl.org/source/old/1.1.1/)
1.下载openssl1.1.1s版本的安装包
cd /usr/src/
wget https://www.openssl.org/source/openssl-1.1.1s.tar.gz --no-check-certificate
2.编译openssl
tar xf openssl-1.1.1s.tar.gz
cd openssl-1.1.1s
./config && make && make install
3. 更换openssl版本
echo "/usr/local/lib64/" >> /etc/ld.so.conf
ldconfig
mv /usr/bin/openssl /usr/bin/openssl.old
ln -sv /usr/local/bin/openssl /usr/bin/openssl
4.查看版本信息
# openssl version
OpenSSL 1.1.1s 1 Nov 2022
nginx重建
cd cd /usr/src/nginx-1.20.2
./configure --with-http_stub_status_module --with-pcre=/usr/src/pcre-8.37 --with-stream --with-http_ssl_module --with-openssl=/usr/src/openssl-1.1.1s
make && make install
启动nginx❀A这次访问您的公共域IP或域名。
你完成了! ! ! 常用命令
nginx
- 启动nginx服务:
service nginx start - 停止nginx服务:重启nginx服务:
service nginx restart 或。 /nginx -s quit && ./nginx - 重新加载修改后的配置:
nginx -s reload
pip 指定源镜像。 aliyun.com/pypi/simple Pillow发生错误
- nginx:[error]在nginx后编辑时“/usr/local/nginx/logs/nginx.pid”中的PID号“”无效
。在conf中,看起来nginx已经在运行了,当指定./nginx -s reload时,会显示
nginx: [error] invalid PID number “” in “/usr/local/nginx/logs/nginx.pid”
service nginx startservice nginx restart 或。 /nginx -s quit && ./nginxnginx -s reload发生错误
- nginx:[error]在nginx后编辑时“/usr/local/nginx/logs/nginx.pid”中的PID号“”无效
。在conf中,看起来nginx已经在运行了,当指定./nginx -s reload时,会显示
nginx: [error] invalid PID number “” in “/usr/local/nginx/logs/nginx.pid”
。解决方案:
cd /usr/local/nginx/sbin/ #进入/usr/local/nginx/sbin/目录
killall -9 nginx # 杀掉所有nginx进程
./nginx -t #检查配置文件是否有错
./nginx -c /usr/local/nginx/conf/nginx.conf # 指定配置文件-c启动nginx 版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网