4. 部署环境搭建:Linux服务器基础配置、Nginx/Apache反向代理设置、静态资源目录规划与权限管理

好,咱们进入实战环节。前面讲了双缓冲的原理和资源压缩策略,但这些东西最终要跑在服务器上。服务器环境搭不好,再好的方案也是白搭。我见过太多项目,代码写得漂亮,结果部署上去各种403、502,查半天发现是目录权限没给对。

这一章,咱们就把服务器环境从头捋一遍。从Linux基础配置,到反向代理设置,再到目录规划和权限管理。每一步我都会把踩过的坑指出来。

4.1 Linux服务器基础配置

拿到一台新服务器,别急着装软件。先做几件基础事,能省掉后面80%的麻烦。

4.1.1 系统更新与常用工具

# 更新系统包
sudo apt update && sudo apt upgrade -y   # Ubuntu/Debian
sudo yum update -y                        # CentOS/RHEL

# 安装常用工具
sudo apt install -y curl wget vim git lsof net-tools

我个人习惯,装完系统第一件事就是装lsof和netstat。为什么?排查端口冲突的时候,这两个命令能救命。有一次线上Nginx起不来,我查了半天配置,最后用lsof -i:80才发现是另一个服务占了端口。

4.1.2 关闭SELinux(非必须但推荐)

很多新手在CentOS上被SELinux坑过。明明权限对了,Nginx就是读不了文件。如果你不是安全专家,我建议先关掉它,等环境跑通了再按需开启。

# 临时关闭
sudo setenforce 0

# 永久关闭(需重启)
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
注意: 生产环境如果安全要求高,不要直接关闭SELinux。应该学习配置SELinux策略,而不是一刀切。我这里只是给新手一个快速上手的方案。

4.1.3 调整文件描述符限制

高并发场景下,Linux默认的1024文件描述符根本不够用。我曾经有个项目,上线第一天就被用户骂,说网站打不开。查了半天,原来是文件描述符满了,Nginx拒绝新连接。

# 查看当前限制
ulimit -n

# 临时修改
ulimit -n 65535

# 永久修改
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf

4.2 Nginx/Apache反向代理设置

双缓冲部署的核心,就是通过反向代理实现新旧版本的平滑切换。我个人更倾向Nginx,性能好,配置也直观。但Apache也有它的优势,咱们都讲一下。

4.2.1 Nginx反向代理配置

先看一个典型的双缓冲场景。我们有两个静态资源目录:/data/www/v1和/data/www/v2。通过Nginx的proxy_pass或者直接root指令来切换。

server {
    listen 80;
    server_name example.com;

    # 静态资源目录(通过符号链接切换版本)
    root /data/www/current;

    location / {
        try_files $uri $uri/ /index.html;
    }

    # API反向代理
    location /api/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

这里的关键是/data/www/current这个符号链接。部署新版本时,我们先把新资源放到v2目录,然后修改符号链接指向v2,最后reload Nginx。整个过程对用户无感。

小技巧: Nginx reload是平滑的,不会中断现有连接。所以你可以放心地用nginx -s reload来切换版本。我每次发版都这么干,从来没断过服务。

4.2.2 Apache反向代理配置

如果你团队习惯用Apache,也没问题。配置思路一样,只是语法不同。

<VirtualHost *:80>
    ServerName example.com

    DocumentRoot /data/www/current

    <Directory /data/www/current>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ProxyPass /api/ http://127.0.0.1:8080/
    ProxyPassReverse /api/ http://127.0.0.1:8080/
</VirtualHost>

注意Apache的FollowSymLinks选项必须开启,否则符号链接不生效。我曾经在这个坑里爬了半天,Apache一直报403,最后发现是没加这个选项。

4.2.3 反向代理对比

特性 Nginx Apache
性能(静态文件) 高,事件驱动 中等,进程驱动
配置复杂度 低,简洁 中等,.htaccess灵活
动态内容处理 需配合PHP-FPM等 原生支持mod_php
符号链接支持 默认支持 需开启FollowSymLinks
热重载 支持(平滑) 支持(graceful)

我个人建议,纯静态资源或者前后端分离的项目,用Nginx。如果是传统LAMP架构,团队对Apache更熟,那就用Apache。工具没有好坏,顺手最重要。

4.3 静态资源目录规划与权限管理

目录规划这事,看着简单,但很多人栽跟头。我见过有人把所有版本的文件堆在一个目录里,最后自己都分不清哪个是哪个。

4.3.1 目录结构设计

我推荐的结构是这样的:

/data/
├── www/
│   ├── releases/          # 存放所有历史版本
│   │   ├── v1.0.0/
│   │   ├── v1.1.0/
│   │   └── v2.0.0/
│   ├── current -> releases/v2.0.0/   # 符号链接,指向当前版本
│   └── backup/            # 备份目录,回滚用
├── logs/                  # 日志目录
│   ├── nginx/
│   └── app/
└── scripts/               # 部署脚本
    ├── deploy.sh
    └── rollback.sh

为什么这么设计?三个好处:

  • 版本清晰:每个版本独立目录,不会互相污染
  • 回滚简单:只要把符号链接指回旧版本,一秒回滚
  • 权限隔离:不同版本可以设置不同权限,安全

4.3.2 权限管理最佳实践

权限这块,原则是「最小权限」。给Nginx只读权限,给部署用户写权限,其他人一律不给。

# 创建用户和组
sudo groupadd webapp
sudo useradd -g webapp -s /sbin/nologin deployer

# 设置目录权限
sudo chown -R deployer:webapp /data/www/releases
sudo chmod -R 755 /data/www/releases

# Nginx用户只读
sudo chown -R nginx:webapp /data/www/current
sudo chmod -R 755 /data/www/current

# 日志目录需要写权限
sudo chown -R nginx:webapp /data/logs/nginx
sudo chmod -R 755 /data/logs/nginx
核心原则: 部署用户有写权限,Web服务器只有读权限。这样即使Web服务器被攻破,攻击者也改不了你的代码。

我曾经遇到一个案例,某团队把所有文件都设为777权限,结果被黑客上传了恶意脚本。嗯,从那以后,我对权限管理就特别较真。

4.3.3 符号链接切换脚本

最后,给一个简单的切换脚本。实际项目中你可以用Ansible或Jenkins来做,但原理一样。

#!/bin/bash
# deploy.sh - 切换版本

VERSION=$1
if [ -z "$VERSION" ]; then
    echo "Usage: $0 <version>"
    exit 1
fi

# 检查版本目录是否存在
if [ ! -d "/data/www/releases/$VERSION" ]; then
    echo "Error: Version $VERSION not found"
    exit 1
fi

# 切换符号链接
ln -sfn /data/www/releases/$VERSION /data/www/current

# 重新加载Nginx
nginx -s reload

echo "Deployed version $VERSION successfully"

4.4 本章小结

部署环境搭建,说白了就是三件事:系统基础配置、反向代理设置、目录与权限管理。每一步都有坑,但只要你按规范来,就能避开大部分问题。

我个人习惯,每搭好一个环境,都会用curl -I测试一下响应头,确认版本号正确、缓存策略生效。这些细节,才是运维的功夫所在。

双缓冲部署环境架构图 双缓冲部署环境架构图 用户请求 Nginx / Apache 反向代理 监听 80/443 端口 静态资源 v1.0.0 /data/www/releases/v1.0.0 权限: 755, 属主: deployer 当前版本 (符号链接) /data/www/current → v2.0.0 权限: 755, 属主: nginx 静态资源 v2.0.0 /data/www/releases/v2.0.0 权限: 755, 属主: deployer 后端 API 服务 (8080端口) 说明:通过符号链接切换版本,Nginx reload 实现零停机部署