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
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 -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
我曾经遇到一个案例,某团队把所有文件都设为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测试一下响应头,确认版本号正确、缓存策略生效。这些细节,才是运维的功夫所在。