技术教程
10-03
案例一 这是一个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