当前位置: 首页 > news >正文

Python Web项目的服务器部署

一.部署运行

1.虚拟环境的安装:(一行一行运行)

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh
bash miniconda.sh -b -p /opt/miniconda3
echo 'export PATH="/opt/miniconda3/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
conda init bash
source ~/.bashrc
conda config --set auto_activate_base false

2. 系统依赖安装:(一行一行运行)

sudo yum update -y
sudo yum install -y epel-release
sudo yum install -y gcc gcc-c++ make
sudo yum install -y mariadb-server mariadb-devel nginx
sudo yum install -y git wget unzip
sudo yum install -y cairo-devel freetype-devel libpng-devel libjpeg-devel

 3.项目环境安装:(灵活修改,以下参考)

mkdir -p /var/www/ershouche
cd /var/www/ershouche
conda create -n ershouche_env python=3.8 -y
conda activate ershouche_env
cat > requirements.txt << 'EOF'
# Web framework
flask>=2.0.1,<2.1.0
Werkzeug>=2.0.1,<2.1.0
Jinja2>=3.0.1,<3.1.0
itsdangerous>=2.0.1,<2.1.0
MarkupSafe>=2.0.1,<2.1.0
# Database
pymysql>=1.0.2
dbutils>=3.0.3
# Data processing and visualization
numpy>=1.20.0,<1.23.0
pandas>=1.3.0,<1.4.0
matplotlib>=3.4.0,<3.5.0
wordcloud>=1.8.1
statsmodels>=0.13.0,<0.14.0
# Web scraping
beautifulsoup4>=4.9.0
selenium>=3.141.0,<4.1.0
requests>=2.25.0,<2.27.0
lxml>=4.6.0
# Tools
python-dotenv>=0.19.0
pillow>=8.3.0
# WSGI server
gunicorn>=20.1.0
EOF
conda install -c conda-forge -y numpy pandas matplotlib pillow statsmodels lxml
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

 4.安装宝塔(上传文件,配置数据库等方便)

 通用安装脚本:

if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec

 上传文件略,数据库可以:

mysql -uroot -p
SELECT User, Host FROM mysql.user;
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
navicat连接搞定。

5.直接运行项目:

5.项目运行
conda activate ershouche_env
cd py脚本启动目录
python app.py

 

二.性能优化

方案:

软件:SupervisorNginx

python库:Gunicorn、Gevent 

 


 

vim pro.sh

#!/bin/bash

# 启用调试模式
set -e

# 获取用户输入
read -p "请输入服务器IP地址: " SERVER_IP
read -p "请输入项目工作目录: " WORK_DIR
echo "请输入项目启动命令(以EOF结束):"
RUN_COMMAND=""
while IFS= read -r line; do
    [[ $line == "EOF" ]] && break
    RUN_COMMAND+="$line"$'\n'
done

# 提取工作目录的最后一个目录名
PROJECT_NAME=$(basename "$WORK_DIR")

# 安装必要的软件包
echo "安装必要的软件包..."
sudo yum install -y epel-release
sudo yum update -y
sudo yum install -y nginx supervisor

# 安装 Python 包
echo "安装 Python 包..."
pip install gunicorn gevent

# 配置 Gunicorn
echo "配置 Gunicorn..."
cat > $WORK_DIR/gunicorn_config.py << EOF
bind = "127.0.0.1:8000"
workers = 4
worker_class = "gevent"
worker_connections = 1000
timeout = 120
loglevel = "debug"
errorlog = "/var/log/$PROJECT_NAME/gunicorn_error.log"
accesslog = "/var/log/$PROJECT_NAME/gunicorn_access.log"
capture_output = True
EOF

# 创建日志目录
sudo mkdir -p /var/log/$PROJECT_NAME
sudo chown -R $(whoami):$(whoami) /var/log/$PROJECT_NAME

# 创建启动脚本
echo "创建启动脚本..."
cat > $WORK_DIR/start.sh << EOF
#!/bin/bash
cd $WORK_DIR
$RUN_COMMAND
EOF
chmod +x $WORK_DIR/start.sh

# 配置 Supervisor
echo "配置 Supervisor..."
sudo tee /etc/supervisord.d/$PROJECT_NAME.ini << EOF
[program:$PROJECT_NAME]
command=$WORK_DIR/start.sh
directory=$WORK_DIR
user=root
autostart=true
autorestart=true
startsecs=10
startretries=3
stopwaitsecs=10
killasgroup=true
stopasgroup=true
redirect_stderr=true
stdout_logfile=/var/log/$PROJECT_NAME/supervisor_stdout.log
stderr_logfile=/var/log/$PROJECT_NAME/supervisor_stderr.log
EOF

# 配置 Nginx
echo "配置 Nginx..."
sudo tee /etc/nginx/conf.d/$PROJECT_NAME.conf << EOF
server {
    listen 80;
    server_name $SERVER_IP;

    access_log /var/log/nginx/$PROJECT_NAME_access.log;
    error_log /var/log/nginx/$PROJECT_NAME_error.log;

    location /static {
        alias $WORK_DIR/static;
        expires 30d;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
        
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}
EOF

# 启动服务
echo "启动服务..."
sudo systemctl restart supervisord
sudo systemctl enable supervisord
sudo systemctl restart nginx
sudo systemctl enable nginx

# 检查服务状态
echo "检查服务状态..."
sudo supervisorctl status $PROJECT_NAME
sudo systemctl status nginx

echo "部署完成!您可以通过 http://$SERVER_IP 访问您的应用。"

 三. 其他操作

端口占用的处理:找到占用端口杀死它。

比如80:

sudo lsof -i :80
sudo kill <PID>

终止特定命令行启动的进程

ps aux | grep "python app.py"
pkill -f "python app.py"

注意事项

  • 权限要求:操作系统资源(如低端口号)通常需 sudo
  • 精确终止:优先用 kill + PID(避免 pkill/fuser 误杀)。
  • 网络分析lsof -i 比 netstat 更详细(支持显示远程 IP)。
  • 风险控制fuser -k 和 pkill -f 可能影响其他进程,建议先确认匹配结果。

相关文章:

  • golang从入门到做牛马:第十五篇-Go语言切片(Slice):动态数组的“魔法”
  • 基于WPF的雷达上位机系统开发实践
  • 「AI 加持的高效架构」高并发场景下的服务器成本优化
  • 如何更有效管理项目风险
  • 数据类设计_图片类设计之4_规则类图形混合算法(前端架构)
  • CSDN博客:Markdown编辑语法教程总结教程(下)
  • AF3 make_fixed_size函数解读
  • 类与对象(一)
  • springcloud gateway通过数据库获取路由信息
  • 【经典算法】Leetcode-零钱兑换问题
  • [高阶技术了解]WebRPC详解
  • MongoDB Vs Elasticsearch
  • Jatpack Room 数据库封装:简洁、通用、高性能的持久化解决方案
  • 开启AI开发新时代——全解析Dify开源LLM应用开发平台
  • maven wrapper的使用
  • 【Godot4.4】写入和读取ZIP文件
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(34)混元金斗装万物 - 0-1背包问题(二维DP)
  • React.js 基础与进阶教程
  • 【网络安全 | 漏洞挖掘】四链路账户接管
  • 视频理解之Actionclip(论文宏观解读)
  • 魔都眼|邮轮港国际帆船赛启动,120名中外选手展开角逐
  • 蔡建忠已任昆山市副市长、市公安局局长
  • 浙江一家长称小学老师打孩子还威胁要从3楼扔下,当地警方已立案
  • 中国纪检监察刊文:力戒形式主义官僚主义关键是要坚持实事求是
  • 没有握手,采用翻译:俄乌三年来首次直接会谈成效如何?
  • 首次公布!我国空间站内发现微生物新物种