CentOS7下的Nginx部署
一、Nginx 概述:高性能 Web 服务的基石
1.1 Nginx 的定位与核心优势
Nginx(发音为 “engine x”)是一款开源的高性能 HTTP 和反向代理服务器,由俄罗斯工程师 Igor Sysoev 开发,于 2004 年首次发布。其设计目标是解决 C10K 问题(支持 1 万并发连接),凭借轻量级、高并发、低内存占用等特性,成为现代 Web 架构的核心组件。
核心功能:
- 静态资源服务:高效处理 HTML、CSS、JS、图片等静态文件。
- 反向代理与负载均衡:分发客户端请求到后端服务器集群,支持轮询、最小连接数等策略。
- API 网关与流量控制:作为微服务架构的入口,实现限流、熔断、路由转发。
- SSL/TLS 加密:通过 HTTPS 保障数据传输安全,支持 HTTP/2 和 QUIC 协议。
典型应用场景:
- 静态网站托管(如博客、企业官网)。
- 动态应用反向代理(如 Node.js/PHP/Java 后端)。
- 高并发场景下的负载均衡(如电商大促、直播平台)。
- 边缘计算与 CDN 节点(减少源站压力,提升用户访问速度)。
二、环境准备:系统配置与依赖安装
2.1 操作系统选择
Nginx 支持主流 Linux 发行版,推荐以下环境:
- CentOS 7/8:稳定性强,适合企业级部署。
- Ubuntu 20.04/22.04:社区活跃,包管理便捷。
- Alpine Linux:轻量级系统,适合容器化部署(如 Docker)。
硬件要求:
- 最低配置:1 核 CPU、1GB 内存、20GB 磁盘(适用于测试环境)。
- 生产环境:4 核 CPU、8GB + 内存、SSD 磁盘(根据流量动态扩展)。
2.2 系统优化
2.2.1 关闭防火墙(测试环境)
bash
systemctl stop firewalld && systemctl disable firewalld # CentOS
ufw disable # Ubuntu
2.2.2 配置 YUM/APT 仓库
CentOS/RHEL:
bash
yum install -y yum-utils # 安装仓库工具
vim /etc/yum.repos.d/nginx.repo # 创建Nginx仓库文件
填入以下内容:
ini
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
Ubuntu/Debian:
bash
apt update && apt install -y apt-transport-https gnupg2
wget -qO- https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | tee /etc/apt/sources.list.d/nginx.list
apt update
三、Nginx 安装与基本配置
3.1 安装最新稳定版
3.1.1 通过包管理器安装
CentOS:
bash
yum install -y nginx # 安装Nginx
Ubuntu:
bash
apt install -y nginx # 安装Nginx
3.1.2 手动编译安装(可选)
适用于需要定制模块的场景:
bash
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz && cd nginx-1.24.0
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-stream # 启用SSL和流模块
make && make install
3.2 服务启停与状态检查
3.2.1 控制命令
bash
systemctl start nginx # 启动
systemctl stop nginx # 停止
systemctl restart nginx # 重启
systemctl reload nginx # 重新加载配置
systemctl enable nginx # 开机自启
systemctl status nginx # 查看状态
3.2.2 验证安装
访问服务器 IP 或域名,若看到默认页面 “Welcome to nginx!”,表示安装成功。
bash
curl http://localhost # 命令行验证
四、核心配置文件详解
Nginx 配置文件采用分层结构,主配置文件为/etc/nginx/nginx.conf
(默认路径),主要分为以下部分:
4.1 全局块
配置影响 Nginx 全局的指令,如用户、进程数、错误日志路径:
nginx
user nginx; # 运行用户(默认nginx用户,需提前创建)
worker_processes 4; # 工作进程数,建议与CPU核心数一致
error_log /var/log/nginx/error.log warn; # 错误日志级别
pid /var/run/nginx.pid; # 进程ID文件
4.2 Events 块
配置工作进程的网络连接模型:
nginx
events {worker_connections 10240; # 每个进程最大连接数(默认1024)use epoll; # 使用epoll事件驱动(Linux推荐)multi_accept on; # 允许同时接受多个连接
}
4.3 HTTP 块
核心配置模块,包含 HTTP 协议相关指令和虚拟主机配置:
nginx
http {include /etc/nginx/mime.types; # 媒体类型定义default_type application/octet-stream; # 默认文件类型log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"'; # 日志格式access_log /var/log/nginx/access.log main; # 访问日志路径sendfile on; # 启用零拷贝传输tcp_nopush on; # 合并网络包,提升传输效率tcp_nodelay on; # 禁用Nagle算法,适用于实时数据keepalive_timeout 65; # 长连接超时时间# 虚拟主机配置(示例)server {listen 80; # 监听端口server_name example.com; # 域名location / {root /usr/share/nginx/html; # 网站根目录index index.html index.htm; # 默认索引文件}error_page 500 502 503 504 /50x.html; # 错误页面location = /50x.html {root /usr/share/nginx/html;}}
}
五、虚拟主机与反向代理配置
5.1 单服务器多站点(虚拟主机)
5.1.1 基于域名的虚拟主机
nginx
server {listen 80;server_name site1.com;root /var/www/site1;index index.html;
}server {listen 80;server_name site2.com;root /var/www/site2;index index.php; # 支持PHP动态站点(需配合FastCGI)
}
5.1.2 基于端口的虚拟主机
nginx
server {listen 8080;server_name localhost;root /var/www/app;
}
5.2 反向代理与负载均衡
5.2.1 基本反向代理配置
nginx
server {listen 80;server_name api.example.com;location / {proxy_pass http://127.0.0.1:3000; # 代理到后端Node.js服务proxy_set_header Host $host; # 传递原始Host头proxy_set_header X-Real-IP $remote_addr; # 传递真实IP}
}
5.2.2 负载均衡策略
轮询(默认):
nginx
upstream backend {server 192.168.1.10:8080;server 192.168.1.11:8080;
}server {location / {proxy_pass http://backend;}
}
最小连接数:
nginx
upstream backend {least_conn; # 切换至最小连接数策略server 192.168.1.10:8080;server 192.168.1.11:8080;
}
IP 哈希(会话保持):
nginx
upstream backend {ip_hash; # 相同IP请求转发到同一服务器server 192.168.1.10:8080;server 192.168.1.11:8080;
}
六、性能优化与安全加固
6.1 连接与超时优化
nginx
http {keepalive_requests 1000; # 单连接最大请求数proxy_connect_timeout 30s; # 代理连接超时proxy_read_timeout 60s; # 代理读取超时send_timeout 60s; # 响应超时
}
6.2 Gzip 压缩
启用 Gzip 减少带宽占用:
nginx
http {gzip on;gzip_min_length 1k; # 最小压缩文件大小gzip_comp_level 6; # 压缩级别(1-9,默认6)gzip_types text/plain text/css application/json; # 压缩类型gzip_vary on; # 启用Vary头,让CDN正确缓存压缩内容
}
6.3 静态资源缓存
配置浏览器缓存策略:
nginx
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {expires 7d; # 缓存7天add_header Cache-Control "public"; # 允许公共缓存access_log off; # 关闭静态资源日志
}
6.4 安全加固措施
6.4.1 隐藏版本号
nginx
server_tokens off; # 移除响应头中的Nginx版本信息
6.4.2 限制访问频率
使用limit_req
模块防止 CC 攻击:
nginx
http {limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; # 定义限速区域server {location / {limit_req zone=one burst=20 nodelay; # 突发请求限制}}
}
6.4.3 启用 HTTPS
nginx
server {listen 443 ssl;server_name example.com;ssl_certificate /etc/ssl/certs/example.crt; # SSL证书路径ssl_certificate_key /etc/ssl/private/example.key; # 私钥路径ssl_protocols TLSv1.2 TLSv1.3; # 禁用老旧协议ssl_prefer_server_ciphers on; # 优先使用服务器加密算法
}
七、常见问题与解决方案
7.1 启动失败
常见原因:
- 端口被占用(如 80 端口被其他程序监听):
bash
lsof -i :80 # 查看端口占用 kill -9 <PID> # 终止进程
- 配置文件语法错误:
bash
nginx -t # 检测配置文件 nginx -s reload # 重新加载配置
7.2 反向代理异常
排查步骤:
- 检查后端服务器是否正常运行(如
curl http://backend:port
)。 - 查看 Nginx 错误日志(
/var/log/nginx/error.log
),确认代理路径是否正确。 - 检查跨域问题,添加 CORS 头:
nginx
add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
7.3 高并发下性能瓶颈
优化方向:
- 增加
worker_processes
和worker_connections
。 - 启用
sendfile
和tcp_nopush
提升传输效率。 - 使用
spawn_fcgi
或uwsgi
优化动态请求处理。
八、Nginx 监控与日志分析
8.1 内置状态页
配置监控端点:
nginx
location /status {stub_status on;access_log off;allow 127.0.0.1; # 仅允许本地访问deny all;
}
访问http://server/status
查看状态:
plaintext
Active connections: 123
server accepts handled requests123456 123456 12345678
Reading: 1 Writing: 2 Waiting: 100 # 读写等待连接数
8.2 日志分析工具
- AWK/Sed:过滤特定请求
bash
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c # 统计URI访问次数
- GoAccess:实时可视化分析
bash
goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED # 生成HTML报告
- ELK Stack:集中式日志管理
通过 Filebeat 收集日志,发送至 Elasticsearch,利用 Kibana 可视化。
九、容器化部署(Docker 实战)
9.1 创建 Dockerfile
dockerfile
FROM nginx:alpine # 使用官方轻量级镜像
COPY nginx.conf /etc/nginx/nginx.conf # 复制自定义配置
COPY html/ /usr/share/nginx/html/ # 复制静态资源
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
9.2 启动容器
bash
docker build -t my-nginx .
docker run -d -p 80:80 -p 443:443 --name nginx-container my-nginx
十、总结:Nginx 在现代架构中的角色
Nginx 凭借其高性能、灵活性和丰富的模块生态,成为 Web 服务器领域的标杆。从静态资源服务到复杂的微服务负载均衡,其核心优势贯穿整个技术栈。通过合理配置与优化,Nginx 可轻松支撑百万级并发流量,是企业级应用部署的首选方案。
最佳实践建议:
- 生产环境采用 “Nginx + 上游服务器” 架构,分离静态与动态请求。
- 结合云服务商(如 AWS ALB、阿里云 SLB)实现弹性扩展。
- 定期更新 Nginx 版本,及时修复安全漏洞(参考CVE 列表)。