基于CentOS的全栈Web应用生产环境部署实战
生产环境架构概述
在将Web应用推向生产环境时,合理的架构设计是保障系统高可用与高性能的基础。典型的全栈架构通常包含反向代理服务器、应用服务器、缓存层以及持久化数据库。
服务器初始化与安全连接
无论是物理机还是云主机,操作系统通常预装了基础环境。本文以CentOS 7/8或兼容的RHEL系统为例进行环境构建。
建立SSH安全会话
SSH(Secure Shell)是远程管理服务器的标准加密协议。在生产环境中,强烈建议禁用密码登录,改用SSH密钥对进行身份验证以提升安全性。
在本地终端中,可通过以下命令建立连接:
ssh deployer@192.168.10.50 -i ~/.ssh/id_rsa_prod
# 建议使用非root的普通用户进行日常操作,必要时通过sudo提权
系统级依赖安装
在编译各类中间件和语言环境前,需要安装基础的构建工具和开发库:
sudo yum update -y
sudo yum groupinstall -y "Development Tools"
sudo yum install -y gcc make openssl-devel bzip2-devel libffi-devel zlib-devel readline-devel sqlite-devel
内网穿透测试方案
在开发阶段,若需向外部第三方服务(如支付回调、Webhook)暴露本地接口,可借助内网穿透工具。常见的开源方案包括 frp 和 ngrok,商业方案则有花生壳等。通过配置 frp 客户端与服务端,可轻松将内网端口映射至公网进行联调测试。
核心中间件部署
MySQL 数据库安装与配置
关系型数据库是业务数据的基石。以下演示 MySQL 5.7 的安装流程:
# 添加 MySQL 官方 Yum 源
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
sudo rpm -ivh mysql57-community-release-el7-11.noarch.rpm
# 安装服务端
sudo yum install -y mysql-community-server --nogpgcheck
# 启动并设置开机自启
sudo systemctl enable --now mysqld
# 获取初始化临时密码
sudo grep 'temporary password' /var/log/mysqld.log
使用临时密码登录后,必须立即修改密码并调整安全策略:
mysql -u root -p
-- 在 MySQL 命令行中执行
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongP@ssw0rd!';
FLUSH PRIVILEGES;
Redis 缓存服务编译
Redis 常用于会话管理和热点数据缓存。这里采用源码编译方式安装 Redis 6.2:
wget https://download.redis.io/releases/redis-6.2.7.tar.gz
tar -zxvf redis-6.2.7.tar.gz
cd redis-6.2.7
# 编译并安装到指定目录
make BUILD_TLS=yes
sudo make install PREFIX=/opt/redis6
# 配置环境变量
echo 'export PATH=/opt/redis6/bin:$PATH' | sudo tee /etc/profile.d/redis.sh
source /etc/profile.d/redis.sh
修改默认配置文件以实现后台守护进程运行:
sudo mkdir -p /etc/redis
sudo cp redis.conf /etc/redis/redis.conf
# 使用 sed 批量修改配置
sudo sed -i 's/^daemonize no/daemonize yes/' /etc/redis/redis.conf
sudo sed -i 's/^bind 127.0.0.1.*/bind 0.0.0.0/' /etc/redis/redis.conf
# 启动服务
redis-server /etc/redis/redis.conf
redis-cli ping
Python 运行环境构建
系统自带的 Python 版本通常较旧,我们需要从源码编译安装 Python 3.9:
wget https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tgz
tar -zxvf Python-3.9.13.tgz
cd Python-3.9.13
# 配置编译参数,启用优化
./configure --prefix=/opt/python39 --enable-optimizations --with-ssl
make -j$(nproc)
sudo make altinstall
# 验证安装
/opt/python39/bin/python3.9 -V
应用服务器与反向代理
虚拟环境与 uWSGI 配置
对于 Python Web 框架(如 Django、Flask),uWSGI 是生产环境的首选 WSGI 服务器。
# 创建项目虚拟环境
/opt/python39/bin/python3.9 -m venv /opt/venvs/webapp_env
source /opt/venvs/webapp_env/bin/activate
# 在虚拟环境中安装 uWSGI
pip install uwsgi
Nginx 反向代理服务器
Nginx 负责处理静态资源请求、SSL 终结以及将动态请求转发至后端 uWSGI。正向代理隐藏客户端,而反向代理隐藏服务端,Nginx 在此扮演反向代理角色,保护后端集群拓扑。
wget https://nginx.org/download/nginx-1.22.1.tar.gz
tar -zxvf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure --prefix=/opt/nginx --with-http_ssl_module --with-http_v2_module
make -j$(nproc)
sudo make install
# 创建全局命令软链接
sudo ln -sf /opt/nginx/sbin/nginx /usr/local/bin/nginx
前端静态资源部署
现代前端框架(如 Vue、React)在部署前需通过构建工具打包为纯静态文件。确保环境变量中的 API 基础路径已指向生产域名。
构建与分发
# 在前端项目根目录执行构建
npm run build:prod
# 将生成的 dist 目录打包并上传至服务器
tar -czvf frontend_dist.tar.gz dist/
在服务器上解压至 Nginx 静态资源目录:
sudo mkdir -p /var/www/frontend
sudo tar -zxvf frontend_dist.tar.gz -C /var/www/frontend --strip-components=1
Nginx 前端路由配置
编辑 Nginx 配置文件,处理单页应用(SPA)的路由刷新 404 问题:
server {
listen 80;
server_name app.example.com;
root /var/www/frontend;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存策略
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
后端业务服务部署
代码同步与数据库初始化
通过 CI/CD 管道或 Git 将代码拉取至服务器。修改生产环境配置文件,关闭 Debug 模式,配置安全的 ALLOWED_HOSTS 及数据库连接串。
在 MySQL 中初始化业务数据库:
mysql -u root -p
CREATE DATABASE webapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'webapp_user'@'localhost' IDENTIFIED BY 'SecureDbP@ss123';
GRANT ALL PRIVILEGES ON webapp_db.* TO 'webapp_user'@'localhost';
FLUSH PRIVILEGES;
执行数据库迁移脚本以同步表结构:
python manage.py migrate --settings=config.production
依赖安装与 uWSGI 启动
安装项目依赖时,若遇到 mysqlclient 编译失败,需提前安装系统级开发头文件:
sudo yum install -y mysql-devel python3-devel gcc
pip install -r requirements.txt
采用 INI 格式编写 uWSGI 配置文件 app_uwsgi.ini,相较于 XML 更具可读性与维护性:
[uwsgi]
socket = 127.0.0.1:9000
chdir = /opt/projects/webapp_backend
module = core.wsgi:application
master = true
processes = 4
threads = 2
vacuum = true
daemonize = /var/log/uwsgi/webapp.log
pidfile = /var/run/uwsgi/webapp.pid
启动 uWSGI 进程:
uwsgi --ini app_uwsgi.ini
Nginx 代理后端请求
在 Nginx 中增加一个 server 块,将 API 请求代理至 uWSGI 监听的内部端口:
server {
listen 80;
server_name api.example.com;
location /api/ {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9000;
uwsgi_read_timeout 60s;
}
location /static/ {
alias /opt/projects/webapp_backend/static_collected/;
}
}
完成配置后,重载 Nginx 使更改生效:
sudo nginx -t && sudo nginx -s reload