当前位置:首页 > 技术 > 正文内容

基于CentOS的全栈Web应用生产环境部署实战

访客 技术 2026年7月2日 1

生产环境架构概述

在将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

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。