一、更新依赖包
sudo apt update
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
二、Python3.9环境搭建
-
任意目录:
-
cd /srv/
-
下载方法一:
-
wget https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tgz
-
下载方法二:
-
curl -O https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tar.xz
-
解压Python-3.9.4.tgz:
-
tar -zxvf Python-3.9.4.tgz
-
编译:
-
cd Python-3.9.4
-
./configure --enable-optimizations
-
运行make以启动构建过程(为了缩短构建时间,请根据处理器修改-j标志。 如果你不知道处理器的核心数,可以通过键入
nproc
来找到它。 我的系统有1个内核,所以我使用-j1标志。) -
键入:
-
make -j 1
-
安装Python二进制文件:
-
sudo make altinstall
-
检查:
-
python3.9 --version
-
创建python与python3和pip软连接
-
查看python3.9的路径:
-
which python3.9
-
在环境变量中添加该软连接(把which python3.9的路径写到配置中):
-
vim ~/.bashrc
alias python='/usr/local/bin/python3.9' alias python3='/usr/local/bin/python3.9' alias pip3='/usr/local/bin/pip3.9'
-
wq保存并退出
-
生效配置文件:
-
source ~/.bashrc
-
检查python3.9:
-
分别键入
python
和python3
输出的版本均为python3.9Python 3.9.4 (default, Jan 17 2022, 14:22:53) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
-
检查pip3
-
键入
which pip3
(显示路径与/usr/local/bin/pip3.9一致)root@iZwz9hokpg2hhzpa7pr3p3Z:/srv# which pip3 /usr/local/bin/pip3
-
键入
pip3 -V
(显示python3.9表示正确)root@iZwz9hokpg2hhzpa7pr3p3Z:/srv# pip3 -V pip 21.3.1 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)
三、安装:Pipenv
pip3 install Pipenv
- 可以先使用demo进行调试后在使用git拉取的项目
- 创建一个demo:
cd /srv/
mkdir myproject
cd myproject
vim run.py
from flask import Flask app = Flask(__name__) @app.route("/") def helloWorld(): return "Hello World" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
- 使用
Pipenv
创建一个虚拟环境 pipenv install
[root@centos7_template_v20211103 myproject]# pipenv install Creating a virtualenv for this project... Pipfile: /srv/myproject/Pipfile Using /usr/bin/python3 (3.9.4) to create virtualenv... ⠧ Creating virtual environment...created virtual environment CPython3.9.4.final.0-64 in 345ms creator CPython3Posix(dest=/root/.local/share/virtualenvs/myproject-oukWrxAT, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv) added seed packages: pip==21.3.1, setuptools==60.2.0, wheel==0.37.1 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator ✔ Successfully created virtual environment! Virtualenv location: /root/.local/share/virtualenvs/myproject-oukWrxAT Creating a Pipfile for this project... Pipfile.lock not found, creating... Locking [dev-packages] dependencies... Locking [packages] dependencies... Updated Pipfile.lock (16c839)! Installing dependencies from Pipfile.lock (16c839)... 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00 To activate this project's virtualenv, run pipenv shell. Alternatively, run a command inside the virtualenv with pipenv run.
- 进入虚拟环境:
pipenv shell
- 查看虚拟环境路径:
pipenv --venv
用于Uwsgi配置文件中的home参数 - 安装包(例如Flask):
pipenv install flask
- (如果是已经有的项目直接使用:
pipenv install
安装项目中的所有包)(Pipenv不作详细介绍)
四、安装:Uwsgi
- 注意不需要安装在pipenv虚拟环境中
apt-get install libpcre3
apt-get install libpcre3-dev -y
pip3 install uwsgi --no-cache-dir
五、编写:Uwsgi启动文件
cd /srv/myproject
vim myproject.ini
http
:因为后面会用到nginx代理,连接方式使用http即可home
:使用虚拟环境 即pipenv --venv
chdir
:项目的路径 如/srv/myproject
module
:模块:启动文件的名称不需要加上.pycallable
:wsgi文件中的app变量(也就是flask的实例)processes
:启动的工作进程-生成指定数目的worker/进程进程数(根据你服务器的配置去设定一般cup数*2)threads
:线程数(一般processes * 2)master
:是否启用mater模式wsgi-file
:启动文件enable-threads
:允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程vacuum
:当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)(此项可以不配置)reload-mercy
:设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了'reload-mercy'秒就会被强行结束(忽略之前已经接收到的请求而直接结束)harakiri
:一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)limit-as
:通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。max-requests
:为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)你可以使用这个选项来默默地对抗内存泄漏listen
:设置socket的监听队列大小(默认:100)daemonize
:日志文件路径(使进程在后台运行,并将日志打到指定的日志文件或者udp服务器)disable-logging
:不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中log-maxsize
:以固定的文件大小(单位KB),切割日志文件。 例如:log-maxsize = 50000000 就是50M一个日志文件其他配置的参数这里不作详细介绍,可查阅uwsgi官网文档
[uwsgi]
# 连接方式
# socket = /srv/myproject/myproject.sock
http = 0.0.0.0:5000
# http-socket = 0.0.0.0:5000
# 基本配置
home = /Users/yangyuexiong/.local/share/virtualenvs/xxxxxx-MNTQRX14
chdir = /srv/myproject
module = run
callable = app
processes = 2
threads = 4
master = true
buffer-size = 32768
wsgi-file = /srv/myproject/run.py
chmod-socket = 660
enable-threads = true
vacuum = true
# 处理(超时/请求/进程结束/虚拟内存)
reload-mercy = 8
harakiri = 60
limit-as = 256
max-requests = 5000
listen = 120
# 日志
daemonize = /srv/myproject/uwsgi.log
disable-logging = true
log-maxsize = 50000000
- 本机调试uwsgi启动:
- 开启端口:
iptables -I INPUT -p tcp --dport 5000 -j ACCEPT
cd /srv/myproject
- 执行:
uwsgi --ini myproject.ini
- 调试完毕后
control+c
或killall -9 uwsgi
结束进程即可
六、安装:Nginx
apt-get install nginx
nginx -v
七、编写:Nginx配置
cd /etc/nginx/conf.d/
vim myproject.conf
- 按照以下配置删改对应参数即可,如
ip
,location
等
upstream flask_server {
server 123.45.678.900:5000;
# server 123.45.678.900:5001;
# server 123.45.678.900:5002;
# server 123.45.678.900:5003;
}
server {
listen 80;
server_name 123.45.678.900;
charset utf-8;
client_max_body_size 75M;
# 前端页面
location / {
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; # 允许请求方法
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000; # OPTIONS 请求的有效期,在有效期内不用发出另一条预检请求
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 200;
}
root /srv/dist; # 前端打包完成的文件路径
index index.html index.htm;
try_files $uri $uri/ /index.html; # 官网介绍设置这条可以解决history路由的问题
expires -1; # 首页一般没有强制缓存
add_header Cache-Control no-cache;
access_log /srv/logs/access.log;
error_log /srv/logs/err.log;
}
# 后端接口
location /api {
proxy_pass http://flask_server;
}
# 静态资源
location /static {
alias /srv/dist/static; # 静态资源目录
autoindex on; # 开启静态资源列目录
autoindex_exact_size off; # on(默认)显示文件的确切大小,单位是byte;off显示文件大概大小,单位KB、MB、GB
autoindex_localtime off; # off(默认)时显示的文件时间为GMT时间;on显示的文件时间为服务器时间
}
}
- 检查配置:
nginx -t
- 重启:
nginx -s reload
或service nginx restart
八、启动项目
cd /srv/myproject/
uwsgi --ini myproject.ini
- 最后可以直接使用git上的项目进行部署
九、使用:Jenknis持续集成项目后续的更新迭代
后续更新...
- 大可不必
十、使用:Superivsor监控项目进程启停
调试中...
- 大可不必