案例一

这是一个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环境

  1. 更新系统包

 

# 更新系统包

sudo yum update -y

# 安装必要的系统依赖

sudo yum install -y gcc python3 python3-devel python3-pip nginx git

 

  1. 创建项目目录并克隆代码

 

# 创建项目目录

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等工具上传项目文件

  1. 创建并激活Python虚拟环境

 

# 进入项目目录

cd /var/www/blog

# 创建虚拟环境

python3 -m venv venv

# 激活虚拟环境

source venv/bin/activate

# 升级pip

pip install --upgrade pip

 

  1. 安装项目依赖

 

# 安装项目依赖

pip install -r requirements.txt

# 安装WSGI服务器(用于生产环境)

pip install gunicorn

 

  1. 配置环境变量

# 在项目目录创建.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

 

  1. 初始化数据库

# 确保虚拟环境处于激活状态

# 运行Python交互环境

python

在Python交互环境中执行:

from app import app, db

with app.app_context():

        db.create_all()

    # 如果需要创建管理员用户,可以在这里添加代码

quit()

 

  1. 配置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

 

  1. 创建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

 

  1. 配置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;

}

 

  1. 配置防火墙

# 允许HTTP和HTTPS流量

sudo firewall-cmd --permanent --add-service=http

sudo firewall-cmd --permanent --add-service=https

sudo firewall-cmd –reload

 

  1. 启动服务并设置开机自启

# 启动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

 

  1. 配置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