阿里云服务器部署flask项目「gunicorn + nginx + 支持https」

news2024/11/27 22:25:31

最近做了一个微信小程序,使用 flask 实现了对应的后台,上线需要部署到服务器上,之前只是了解并没有全链路试过,靠着网上的资料最终完成部署上线,但中间遇到了较多的一些问题,网上的资料也比较零碎,所以整理了这篇文章,一方面是作为记录方便后续查阅,另一方面也希望能够让跟我一样的新手少走弯路。

准备

1、首先要有一个服务器,我这里使用的是阿里云的,系统使用的 CenterOS 7.9
2、第二需要有一个自己的域名(微信小程序必须要求是域名访问而不能是IP访问,并且域名还要是支持 https的);
3、其他环境配置:python:3.10.6;pip: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回车退出,修改完执行下面的命令,让上一步的修改生效
source ~/.bash_profile
  • 检查python3是否安装成功,输出版本号及代表成功
[root@iZt4n8a2eru6403z3l0adjZ Python-3.10.6]# python3 -V
Python 3.10.6

pip3安装

在运行项目的过程中,经常会有一些第三方库需要安装,我们先安装 pip ,方便后续的一些操作。

  • 先安装 pip相关的前置依赖 setuptools(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
    一般的命令是 gunicorn -w worker数量 -b ip:端口号 运行文件名:flask实例名,- w 表示有3 个 工作线程;- b 指定ip 和端口;app 为全局变量 (app = Flask(_ _name _ _)),例如我们这里就是:
gunicorn -b 127.0.0.1:5000 hello:app

这样子在地址栏直接输入127.0.0.1:5000就可以看到
Xnip2023-05-14_15-36-21.jpg
作为守护进程在后台运行

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 | grep gunicorn 获取对应的进程id,使用命令 kill -HUP 进程ID 进行重启。执行上述命令后,再次执行“pstree -ap|grep gunicorn”,我们很容易发现,除了主进程,其他的Gunicorn进程都已经销毁,并新建了进程(进程ID发生了变化)。
  • 关闭gunicorn
    通过 ps -ef | grep gunicorn 获取对应的进程id,使用命令 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,具体内容如下:

    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: [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf

这个是因为我们一开始在安装 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

这个时候就会出现如下错误:

./configure: error: SSL modules require the OpenSSL library

这个是因为系统是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
service nginx stop
service nginx start

这个时候就可以使用https 访问你的公域ip 或者域名啦。
大功告成!!!

常用命令

nginx
  • 启动 nginx 服务:service nginx start
  • 停止 nginx 服务:service nginx stop
  • 重启 nginx 服务:service nginx restart 或者 ./nginx -s quit && ./nginx
  • 重新加载修改了的配置: nginx -s reload
pip指定源

pip install -i http://mirrors.aliyun.com/pypi/simple Pillow

遇到的错误

  • nginx: [error] invalid PID number “” in “/usr/local/nginx/logs/nginx.pid”
    在编辑nginx.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

参考文章

https://www.cnblogs.com/mrice/p/9882781.html(里面提到的 openssl 版本问题并不适用我)
https://blog.csdn.net/chen565884393/article/details/128038281
https://blog.csdn.net/weixin_41709748/article/details/127604499

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPF MaterialDesign 初学项目实战(2)首页导航栏样式

其他内容 WPF MaterialDesign 初学项目实战&#xff08;0&#xff09;:github 项目Demo运行 WPF MaterialDesign 初学项目实战&#xff08;1&#xff09;首页搭建 MaterialDesign 确保运行了初学项目实战&#xff08;0&#xff09; MaterialDesign给我们提供了很多的样式库&…

微服务框架【笔记-Nacos环境隔离】

Nacos注册中心 环境隔离 - namespace Nacos 中服务存储和数据存储的最外层都是一个名为namespace的东西&#xff0c;用来做最外层隔离 Nacos默认的命名空间&#xff1a; 创建命名空间复制命名空间ID启动Orderservice服务&#xff0c;在nacos服务列表可以看到环境隔离之后的服…

vue实现电梯锚点导航

1、目标效果 最近喝了不少的咖啡、奶茶&#xff0c;有一个效果我倒是挺好奇怎么实现的&#xff1a; &#xff08;1&#xff09;点击左侧分类菜单&#xff0c;右侧滚动到该分类区域 &#xff08;2&#xff09;右侧滑动屏幕&#xff0c;左侧显示当前所处的分类区域 这种功能会出现…

Jmeter进阶使用:BeanShell实现接口前置和后置操作

一、背景 我们使用Jmeter做压力测试或者接口测试时&#xff0c;除了最简单的直接对接口发起请求&#xff0c;很多时候需要对接口进行一些前置操作&#xff1a;比如提前生成测试数据&#xff0c;以及一些后置操作&#xff1a;比如提取接口响应内容中的某个字段的值。举个最常用…

XDC约束技巧 之 I/O篇 (上)

《XDC约束技巧之时钟篇》中曾对I/O约束做过简要概括&#xff0c;相比较而言&#xff0c;XDC中的I/O约束虽然形式简单&#xff0c;但整体思路和约束方法却与UCF大相径庭。加之FPGA的应用特性决定了其在接口上有多种构建和实现方式&#xff0c;所以从UCF到XDC的转换过程中&#x…

都别吹牛逼了,2个英语指令简单评测便知ChatGPT、博弈Ai、文心一言、通义千问、讯飞星火真实水平

一、博弈Ai&#xff1a;GPT3.5版 演示&#xff1a;https://chat.bo-e.com/ 1、充当英语发言助手 评分&#xff1a;10分 总结&#xff1a;完整满足了指令需求 2、充当英汉互译器 评分&#xff1a;8分 总结&#xff1a;基本满足了我的指令需求。但是有点啰嗦&#xff0c;扣…

MySQL---视图(定义、修改、更新、重命名、删除)

1. 定义视图 视图&#xff08;view&#xff09;是一个虚拟表&#xff0c;非真实存在&#xff0c;其本质是根据SQL语句获取动态的数据集&#xff0c;并为其命 名&#xff0c;用户使用时只需使用视图名称即可获取结果集&#xff0c;并可以将其当作表来使用。 数据库中只存放了…

SIR模型与R模拟

SIR病毒模型R模拟 文章目录 SIR病毒模型R模拟[toc]1.SIR病毒模型2.R模拟 1.SIR病毒模型 SIR病毒模型的的三个字母分别为病毒传播过程中的三种状态&#xff0c;其中 S&#xff0c;表示易感染者&#xff0c;即没有被感染病毒的人群I&#xff0c;表示已感染者&#xff0c;即被感…

Spring_jdbcTemplate基本使用

文章目录 一、导入spring-jdbc和spring-tx坐标二、创建数据库表和实体在applicationContext.xml中配置连接池和JdbcTemplate在test数据库中创建account表 三、创建JdbcTemplate对象四、执行数据库操作 一、导入spring-jdbc和spring-tx坐标 <dependency><groupId>o…

Vue.js快速入门

文章目录 一、Vue基础1.1 渐进式框架​1.2 第一个Vue程序1.3 el 挂载点1.4 data 数据对象 二、Vue 指令2.1 v-text 文本值2.2 v-html 标签元素2.3 v-on 绑定事件2.4 v-show 隐藏2.5 v-if 消除2.6 v-bind 属性值2.7 v-for 生成列表2.8 v-model 双向数据绑定 三、axios 网络请求库…

EXCEL数组公式的理解和技巧(未完成)

1 小心特例 frenquce 会划分为n1个区间 SUMPRODUCT(IF(FREQUENCY(B5:B18,B5:B18)>0,1,0)*IF(VALUE(MID(A5:A18,6,1))5,1,0)) 2 用0/ 和1/0 数组公式来解决问题 SUMPRODUCT(1/COUNTIF(B5:B18,B5:B18)) 这个只返回了B列里不重复的数据个数&#xff0c;确实是10个 SUMPRODU…

在 Windows 上安装 kind

一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡&#xff0c;让我们一起学习在 Windows 上安装 kind。如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连) 二、 kind是什么 kind 是一个使用 Docker 容器“节点”运行 Kubernetes 集群的工具。使用 kind 工具搭建的 Kubernetes…

【Linux Network】应用层协议——HTTP

目录 1. 认识URL 2. urlencode和urldecode urlencode例子&#xff1a; urldecode例子&#xff1a; 3. HTTP协议格式 3.1 HTTP请求&#xff1a; 3.2 HTTP响应&#xff1a; 3.3 HTTP的方法&#xff1a; 3.4 GET方法和POST方法的区别 3.5 HTTP的状态码&#xff1a; 3.6 HTTP常见He…

Python学习20:温度转换 II(python123)

温度的刻画有两个不同体系&#xff1a;摄氏度&#xff08;Celsius&#xff09;和华氏度&#xff08;Fabrenheit&#xff09;。‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‫‪‪‪‪‪‪‫‪‪‪‪‪‫‪ 请编写程序将用户输入华氏度转换为摄氏度&#xff…

参会记录|春日研学 · 踏歌前行 —— MAS 实验室内部学术研讨会

前言&#xff1a;2023年5月12日&#xff08;周五&#xff09;晚&#xff0c;实验室在江苏苏州天街附近举行了一次内部研讨会&#xff0c;主题聚焦当今学术界研究前沿和实验室下一阶段发展规划。会议期间&#xff0c;首先是各位与会博士生畅所欲言&#xff0c;探讨当前学术前沿&…

数据结构学习记录——什么是图(抽象数据类型定义、常见术语、邻接矩阵表示法、邻接表表示法)

目录 什么是图 抽象数据类型定义 常见术语 无向图 有向图 网络 邻接点 度&#xff08;出度、入度&#xff09; 稀疏图 稠密图、完全图 边密度 邻接矩阵表示法 用二维数组存储 用一维数组存储 邻接矩阵的好处 邻接矩阵的坏处 邻接表表示法 指针数组-链表存储…

ES的可视化工具-Kibana的安装和使用

【前言】 Kibana 是为 Elasticsearch设计的开源分析和可视化平台。你可以使用 Kibana 来搜索&#xff0c;查看存储在 Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化&#xff0c;以图表的形式展现出来。 下面是Kibana的安装步骤&#xff0c;控…

Vue项目的搭建和启动

文章目录 一、安装配置 node.js1.1 下载安装1.2 配置环境变量1.3 修改模块下载位置1.4 设置淘宝镜像 二、创建启动 Vue三、开发环境 VSCode3.1 开发插件3.2 Vue 项目结构 提示&#xff1a;以下是本篇文章正文内容&#xff0c;前端系列学习将会持续更新 一、安装配置 node.js …

【重新定义matlab强大系列六】利用matlab进行一维滤波or二维滤波

&#x1f517; 运行环境&#xff1a;matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

NVM —— 你把我玩明白

前期回顾 纯前端 根据目录解析word,拆分不同段落_彩色之外的博客-CSDN博客纯前端 解析 wordhttps://blog.csdn.net/m0_57904695/article/details/130503211?spm1001.2014.3001.5501 &#x1f44d; 本文专栏&#xff1a;开发技巧 目录 &#x1f37a; 下载 及 配置镜像 …