
案例一
这是一个Flask应用程序,包含以下关键文件和目录:
- app.py - 主应用程序文件
- models.py - 数据模型
- requirements.txt - 项目依赖
- templates/ - HTML模板
- static/ - 静态资源
- lottery.db - SQLite数据库
## 一、系统要求
- Linux服务器(推荐Ubuntu 20.04或CentOS 7/8)
- Python 3.8或更高版本
- 网络连接
- 基本的Linux命令知识
## 二、准备Linux环境
### 1. 更新系统包
```
# Ubuntu/Debian系统
sudo apt update && sudo apt upgrade -y
# CentOS/RHEL系统
sudo yum update -y
```
### 2. 安装必要的软件包
```
# Ubuntu/Debian系统
sudo apt install -y python3
python3-pip python3-venv git nginx
curl
# CentOS/RHEL系统
sudo yum install -y python3
python3-pip git nginx curl
```
## 三、克隆项目代码
```
# 创建项目目录
mkdir -p /var/www/lottery_app
cd /var/www/lottery_app
# 克隆项目代码(假设您的代码在Git仓库中)
git clone <您的项目Git地址> .
# 如果没有Git仓库,可以使用FTP/SCP等方式
上传代码
```
## 四、创建虚拟环境并安装依赖
```
# 在项目目录中创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 安装项目依赖
pip install --upgrade pip
pip install -r requirements.txt
# 安装Gunicorn作为WSGI服务器
pip install gunicorn
```
## 五、配置环境变量
创建 .env 文件(如果不存在)或修改现有的环境变量配置:
```
# 在项目根目录创建.env文件
touch .env
nano .env
```
添加以下内容(根据实际情况修改):
```
SECRET_KEY=your_secure_secret_key_here
DATABASE_URL=sqlite:////var/www/
lottery_app/lottery.db
```
## 六、准备数据库
```
# 激活虚拟环境
source venv/bin/activate
# 运行Python shell创建数据库表
python
```
在Python shell中执行:
```
from app import app, db
from models import Admin
with app.app_context():
db.create_all()
# 检查是否存在管理员账户,如果不存在则
创建
if not Admin.query.filter_by
(username='admin').first():
admin = Admin
(username='admin')
admin.set_password
('your_secure_password_here')
db.session.add(admin)
db.session.commit()
exit()
```
## 七、配置Gunicorn
### 1. 测试Gunicorn能否正常运行
```
source venv/bin/activate
gunicorn --bind 0.0.0.0:8000 app:app
```
如果一切正常,您应该能看到Gunicorn启动成功的信息。按 Ctrl+C 停止。
### 2. 创建Gunicorn配置文件
```
mkdir -p /var/www/lottery_app/logs
touch /var/www/lottery_app/
gunicorn_config.py
nano /var/www/lottery_app/
gunicorn_config.py
```
添加以下内容:
```
import multiprocessing
import os
# 绑定的地址和端口
bind = '127.0.0.1:8000'
# 工作进程数量
workers = multiprocessing.cpu_count()
* 2 + 1
# 工作方式
worker_class = 'sync'
# 每个工作进程的最大并发数
worker_connections = 1000
# 请求超时时间
timeout = 30
# 保持连接时间
keepalive = 2
# 日志文件
errorlog = '/var/www/lottery_app/logs/
gunicorn_error.log'
accesslog = '/var/www/lottery_app/
logs/gunicorn_access.log'
# 日志级别
loglevel = 'info'
# 进程ID文件
pidfile = '/var/www/lottery_app/
gunicorn.pid'
```
## 八、配置Systemd服务
创建Systemd服务文件,以便系统可以自动启动Gunicorn服务:
```
sudo nano /etc/systemd/system/
lottery_app.service
```
添加以下内容:
```
[Unit]
Description=Gunicorn instance to
serve lottery_app
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/lottery_app
Environment="PATH=/var/www/
lottery_app/venv/bin"
ExecStart=/var/www/lottery_app/venv/
bin/gunicorn -c gunicorn_config.py
app:app
Restart=on-failure
[Install]
WantedBy=multi-user.target
```
启用并启动服务:
```
sudo systemctl daemon-reload
sudo systemctl start lottery_app
sudo systemctl enable lottery_app
```
检查服务状态:
sudo systemctl status lottery_app
九、配置Nginx作为反向代理
1. 创建Nginx配置文件
sudo nano /etc/nginx/sites-available/lottery_app
添加以下内容(替换 your_domain.com 为您的域名或服务器IP):
server {
listen 80;
server_name your_domain.com;
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;
}
location /static {
alias /var/www/lottery_app/static;
expires 30d;
}
location /uploads {
alias /var/www/lottery_app/static/uploads;
expires 30d;
}
}
2. 启用Nginx配置
sudo ln -s /etc/nginx/sites-available/lottery_app /etc/nginx/sites-enabled
sudo nginx -t # 测试配置是否正确
sudo systemctl restart nginx
十、配置文件权限
sudo chown -R www-data:www-data /var/www/lottery_app
sudo chmod -R 755 /var/www/lottery_app
sudo chmod -R 775 /var/www/lottery_app/static/uploads
sudo chmod -R 775 /var/www/lottery_app/backups
十一、配置防火墙
# Ubuntu/Debian系统
sudo ufw allow 'Nginx Full'
sudo ufw allow OpenSSH
sudo ufw enable
# CentOS/RHEL系统
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
十二、获取SSL证书(可选但推荐)
使用Let's Encrypt获取免费的SSL证书:
# 安装Certbot
sudo apt install certbot python3-certbot-nginx # Ubuntu/Debian
sudo yum install certbot python3-certbot-nginx # CentOS/RHEL
# 获取证书
sudo certbot --nginx -d your_domain.com
# 设置自动续期
sudo certbot renew --dry-run
十三、部署后的维护
1. 查看应用日志
tail -f /var/www/lottery_app/logs/gunicorn_error.log
tail -f /var/www/lottery_app/logs/gunicorn_access.log
sudo journalctl -u lottery_app
sudo journalctl -u nginx
2. 重启服务
sudo systemctl restart lottery_app
sudo systemctl restart nginx
3. 更新代码
cd /var/www/lottery_app
git pull
source venv/bin/activate
pip install -r requirements.txt
sudo systemctl restart lottery_app
十四、项目特性说明
## 十四、项目特性说明
部署完成后,您的Flask应用将包含以下功能:
1. 1.
黄历查询功能 :通过 /huangli 路由访问,数据处理逻辑在前端JavaScript中实现
2. 2.
开奖结果展示 :通过 /results 路由访问
3. 3.
新闻管理系统 :包括新闻列表和详情页
4. 4.
后台管理中心 :包含开奖设置、新闻管理、数据备份等功能
5. 5.
安全特性 :包含CSRF保护、管理员认证等
通过以上步骤,您的Flask项目应该已经成功部署到Linux服务器上,并且可以通过您的域名或服务器IP地址访问。
----------------------------------------------------------------------------------------------------------
案例二
# Flask博客项目CentOS部署详细步骤
下面是将您的Flask博客项目部署到CentOS系统的完整步骤:
准备CentOS环境
- 更新系统包
# 更新系统包
sudo yum update -y
# 安装必要的系统依赖
sudo yum install -y gcc python3 python3-devel python3-pip nginx git
- 创建项目目录并克隆代码
# 创建项目目录
sudo mkdir -p /var/www/blog
# 设置目录权限
sudo chown -R $USER:$USER /var/www/blog
# 克隆或上传项目代码到该目录
# 如果使用git:git clone <your-repo-url> /var/www/blog
# 或使用scp/sftp等工具上传项目文件
- 创建并激活Python虚拟环境
# 进入项目目录
cd /var/www/blog
# 创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 升级pip
pip install --upgrade pip
- 安装项目依赖
# 安装项目依赖
pip install -r requirements.txt
# 安装WSGI服务器(用于生产环境)
pip install gunicorn
- 配置环境变量
# 在项目目录创建.env文件
cp .env.example .env # 如果没有.env.example,则直接创建.env
# 编辑.env文件,根据实际情况修改配置
nano .env
.env文件应包含以下关键配置(根据您的实际情况修改):
# 邮件服务器配置
MAIL_SERVER=smtp.qq.com
MAIL_PORT=587
MAIL_USE_TLS=True
MAIL_USERNAME=your-email@qq.com
MAIL_PASSWORD=your-email-password
MAIL_DEFAULT_SENDER=your-email@qq.com
# 应用密钥(建议修改为随机生成的字符串)
SECRET_KEY=your-secure-secret-key
# 数据库配置(SQLite使用绝对路径)
DATABASE_URL=sqlite:///blog.db
- 初始化数据库
# 确保虚拟环境处于激活状态
# 运行Python交互环境
python
在Python交互环境中执行:
from app import app, db
with app.app_context():
db.create_all()
# 如果需要创建管理员用户,可以在这里添加代码
quit()
- 配置Gunicorn服务
# 创建Gunicorn配置文件
nano /var/www/blog/gunicorn_config.py
添加以下内容:
bind = '127.0.0.1:8000'
workers = 3
accesslog = '/var/log/blog/access.log'
errorlog = '/var/log/blog/error.log'
user = 'your_username' # 替换为您的用户名
创建日志目录:
sudo mkdir -p /var/log/blog
sudo chown -R $USER:$USER /var/log/blog
- 创建Systemd服务文件
sudo nano /etc/systemd/system/blog.service
添加以下内容(ini):
[Unit]
Description=Gunicorn instance to serve Flask blog application
After=network.target
[Service]
User=your_username # 替换为您的用户名
Group=nginx
WorkingDirectory=/var/www/blog
Environment="PATH=/var/www/blog/venv/bin"
ExecStart=/var/www/blog/venv/bin/gunicorn --config /var/www/blog/gunicorn_config.py app:app
Restart=always
[Install]
WantedBy=multi-user.target
- 配置Nginx作为反向代理
sudo nano /etc/nginx/conf.d/blog.conf
添加以下内容(nginx):
server {
listen 80;
server_name your_domain.com www.your_domain.com; # 替换为您的域名或服务器IP
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;
}
location /static {
alias /var/www/blog/static;
}
# 错误页面
error_page 404 /404.html;
error_page 500 502 503 504 /500.html;
}
- 配置防火墙
# 允许HTTP和HTTPS流量
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd –reload
- 启动服务并设置开机自启
# 启动Gunicorn服务
sudo systemctl start blog
sudo systemctl enable blog
# 检查Gunicorn服务状态
sudo systemctl status blog
# 测试Nginx配置
sudo nginx -t
# 启动Nginx服务
sudo systemctl start nginx
sudo systemctl enable nginx
- 配置SELinux(如果启用)
# 如果SELinux处于enforcing模式,需要设置以下规则
sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/blog(/.*)?'
sudo restorecon -Rv /var/www/blog/
# 允许Nginx连接到Gunicorn
sudo setsebool -P httpd_can_network_connect 1
13. 监控和维护
- 查看应用日志: sudo journalctl -u blog
- 查看Nginx日志: sudo tail -f /var/log/nginx/error.log
- 查看Gunicorn日志: sudo tail -f /var/log/blog/error.log
## 其他注意事项
1. 1.
数据库备份 :定期备份 blog.db 文件
2. 2.
安全优化 :
- 考虑配置HTTPS(使用Let's Encrypt证书)
- 修改 SECRET_KEY 为随机生成的强密码
- 定期更新系统和依赖包
3. 3.
性能优化 :根据访问量调整Gunicorn的worker数量
4. 4.
静态文件 :确保static目录权限正确,以便Nginx能访问
完成以上步骤后,您的Flask博客应用应该已成功部署到CentOS系统上并可以通过浏览器访问了。
-------------------------------------------------------------------------------------------
在 CentOS 系统中搭建第二个 Flask 应用,与搭建第一个的流程类似,但需要注意端口占用和服务配置的隔离。以下是具体步骤:
1. 准备独立的环境
为第二个 Flask 应用创建独立的目录和虚拟环境,避免依赖冲突:
bash
# 创建应用目录
mkdir -p /var/www/flask_app2
cd /var/www/flask_app2
# 创建并激活虚拟环境
python3 -m venv venv
source venv/bin/activate
# 安装Flask(可指定版本)
pip install flask
2. 编写第二个 Flask 应用代码
创建应用主文件(如app.py),注意使用与第一个应用不同的端口:
python
运行
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "这是第二个Flask应用!"
if __name__ == '__main__':
# 使用不同于第一个应用的端口(如5001)
app.run(host='0.0.0.0', port=5001)
3. 配置服务(使用 systemd)
创建服务文件,确保与第一个应用的服务名不同:
bash
sudo vim /etc/systemd/system/flask-app2.service
服务文件内容:
ini
[Unit]
Description=Second Flask Application
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/flask_app2
Environment="PATH=/var/www/flask_app2/venv/bin"
ExecStart=/var/www/flask_app2/venv/bin/python app.py
[Install]
WantedBy=multi-user.target
4. 启动并设置开机自启
bash
# 重新加载systemd配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start flask-app2
# 设置开机自启
sudo systemctl enable flask-app2
# 检查服务状态
sudo systemctl status flask-app2
5. 配置 Nginx 反向代理(可选)
如果需要通过域名区分两个应用,可配置 Nginx:
bash
sudo vim /etc/nginx/conf.d/flask-app2.conf
配置内容:
nginx
server {
listen 80;
server_name app2.yourdomain.com; # 第二个应用的域名
location / {
proxy_pass http://127.0.0.1:5001; # 对应第二个应用的端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
重启 Nginx:
bash
sudo systemctl restart nginx
关键注意事项
端口冲突:确保两个应用使用不同的端口(默认 5000,可改为 5001、5002 等)
服务名区分:systemd 服务文件名称需不同,避免冲突
目录隔离:应用文件和虚拟环境应完全独立
防火墙设置:如果启用了 firewalld,需开放第二个应用的端口
bash
sudo firewall-cmd --add-port=5001/tcp --permanent
sudo firewall-cmd --reload
通过以上步骤,你就可以在同一台 CentOS 服务器上运行多个独立的 Flask 应用了。
.................................................................................................................................................
为第二个 Flask 应用配置 Gunicorn 的步骤如下:
1. 在虚拟环境中安装 Gunicorn
bash
# 激活第二个应用的虚拟环境
cd /var/www/flask_app2
source venv/bin/activate
# 安装Gunicorn
pip install gunicorn
2. 测试 Gunicorn 运行
bash
# 用Gunicorn启动Gunicorn启动应用(指定不同端口)
gunicorn -w 4 -b 0.0.0.0:5001 app:app
-w 4:指定 4 个工作进程
-b 0.0.0.0:5001:绑定到 5001 端口(与第一个应用不同)
app:app:表示从 app.py 文件中导入 app 实例
3. 修改 systemd 服务配置
编辑之前创建的服务文件:
bash
sudo vim /etc/systemd/system/flask-app2.service
将ExecStart行修改为使用 Gunicorn:
ini
[Unit]
Description=Second Flask Application with Gunicorn
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/flask_app2
Environment="PATH=/var/www/flask_app2/venv/bin"
# 使用Gunicorn启动,而不是直接运行python
ExecStart=/var/www/flask_app2/venv/bin/gunicorn -w 4 -b 0.0.0.0:5001 app:app
[Install]
WantedBy=multi-user.target
4. 重启服务
bash
sudo systemctl daemon-reload
sudo systemctl restart flask-app2
使用 Gunicorn 的优势
性能更好:支持多进程处理,能同时处理更多请求
更稳定:相比 Flask 开发服务器,更适合生产环境
资源控制:可以灵活配置工作进程数量
安全性:提供更好的安全特性,适合暴露在公网环境
如果后续需要进一步优化,还可以结合 Nginx 作为反向代理,处理静态文件并转发动态请求给 Gunicorn,形成更完善的生产环境部署架构。
------------------------------------------------------------------------------------------------------------------------------
第一步:重新创建 Gunicorn 服务配置文件
bash
# 1. 确保在任意目录下,执行以下命令创建服务文件
sudo nano /etc/systemd/system/gunicorn.service
粘贴以下内容(根据你的实际路径修改):
ini
[Unit]
Description=Gunicorn daemon for blog project
After=network.target
[Service]
User=wzf
Group=wzf
WorkingDirectory=/var/www/blog
ExecStart=/var/www/blog/venv/bin/gunicorn \
--workers 3 \
--bind unix:/var/www/blog/blog.sock \
app:app
[Install]
WantedBy=multi-user.target
保存文件:按 Ctrl+O → 回车确认 → 按 Ctrl+X 退出。
第二步:重载系统服务配置(关键步骤)
bash
# 让系统识别新创建的服务文件
sudo systemctl daemon-reload
第三步:验证服务是否存在并启动
bash
# 1. 查看服务是否已被识别
sudo systemctl list-unit-files | grep gunicorn
# 若输出 `gunicorn.service enabled` 或 `static`,说明已识别
# 2. 启动服务
sudo systemctl start gunicorn
# 3. 查看服务状态(确认是否启动成功)
sudo systemctl status gunicorn
若仍提示 “Unit not found”
检查服务文件路径是否完全正确:
bash
# 确认文件存在且路径正确
ls -l /etc/systemd/system/gunicorn.service
若输出 “没有那个文件或目录”,说明第一步的文件创建失败,重新执行第一步(建议用 nano )。
检查文件权限:
bash
# 确保服务文件有正确权限
sudo chmod 644 /etc/systemd/system/gunicorn.service
再次重载配置并尝试启动:
bash
sudo systemctl daemon-reload
sudo systemctl restart gunicorn
核心问题是系统未识别到服务文件,通过 “重新创建文件 + 重载配置” 即可解决。只要 /etc/systemd/system/gunicorn.service 存在且格式正确,systemctl 就能找到并管理该服务。
# Gunicorn 配置文件:
bind = "0.0.0.0:8888" # 绑定地址和端口
workers = 3 # 工作进程数(建议设为 CPU 核心数×2 + 1)
accesslog = "/var/www/blog/logs/access.log" # 访问日志路径
errorlog = "/var/www/blog/logs/error.log" # 错误日志路径
loglevel = "info" # 日志级别(debug/info/warning/error/critical)
注意:若指定日志路径(如 logs/access.log),需先创建 logs 目录,否则启动会报错
bash
mkdir -p /var/www/blog/logs # 创建日志目录
..................................................................................................
创建Systemd服务文件
sudo nano /etc/systemd/system/blog.service
添加以下内容(ini):
[Unit]
Description=Gunicorn daemon for blog project
After=network.target
[Service]
User=wzf
Group=wzf
WorkingDirectory=/var/www/blog
ExecStart=/var/www/blog/venv/bin/gunicorn \
--config /var/www/blog/gunicorn_config.py \
app:app
[Install]
WantedBy=multi-user.target
.........................................................................................................
sudo systemctl start gunicorn # 启动服务
sudo systemctl stop gunicorn # 停止服务
........................................................................................................
# 重载配置(推荐,不中断服务)
sudo systemctl reload nginx
# 或重启服务(会短暂中断)
sudo systemctl restart nginx
# 停止服务
sudo systemctl stop nginx
请先登录后发表评论