CentOS下Nginx服务器搭建全攻略
Nginx 安装与配置完整指南
一、安装 Nginx
1.1 添加 Nginx 官方仓库
在 CentOS 系统中,默认仓库的 Nginx 版本可能较旧(通常为 1.12 或更早版本),建议添加官方仓库来安装最新稳定版本(目前为 1.25.x):
sudo tee /etc/yum.repos.d/nginx.repo <<EOF
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=0
enabled=1
EOF
此命令会创建 /etc/yum.repos.d/nginx.repo
文件,配置 Nginx 官方 YUM 仓库。其中:
baseurl
会根据 CentOS 版本自动匹配(例如 CentOS 7 对应 7/$basearch/,CentOS 8 对应 8/$basearch/)gpgcheck=0
表示不进行 GPG 验证(生产环境建议设为1并导入密钥:sudo rpm --import http://nginx.org/keys/nginx_signing.key
)enabled=1
表示启用该仓库
1.2 安装 Nginx 软件包
sudo yum install -y nginx
安装完成后,系统会自动创建以下重要文件和目录:
- 主程序:
/usr/sbin/nginx
- 配置文件目录:
/etc/nginx/
- 主配置文件:
nginx.conf
- 虚拟主机配置目录:
conf.d/
- 模块配置目录:
modules-available/
- 主配置文件:
- 默认网站目录:
/usr/share/nginx/html
- 日志目录:
/var/log/nginx/
- 访问日志:
access.log
- 错误日志:
error.log
- 访问日志:
- 系统服务单元:
/usr/lib/systemd/system/nginx.service
1.3 启动服务并设置开机自启
# 启动Nginx服务
sudo systemctl start nginx# 设置开机自动启动
sudo systemctl enable nginx
验证服务状态:
sudo systemctl status nginx
正常输出应显示"active (running)"状态。常见状态说明:
active (running)
:服务正常运行failed
:启动失败(需检查日志)inactive (dead)
:服务已停止
二、防火墙配置
2.1 开放基础端口
# 永久开放HTTP(80)和HTTPS(443)服务
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https# 重新加载防火墙规则
sudo firewall-cmd --reload
对于云服务器(如AWS、阿里云等),还需在安全组中开放80和443端口:
- 登录云平台控制台
- 找到对应实例的安全组配置
- 添加入站规则:TCP 80和443,源地址0.0.0.0/0
2.2 可选端口管理
查看已开放端口和服务:
sudo firewall-cmd --list-all
输出示例:
public (active)target: defaulticmp-block-inversion: nointerfaces: eth0sources: services: dhcpv6-client http https sshports: protocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules:
临时开放特定端口(测试用,重启后失效):
sudo firewall-cmd --add-port=8080/tcp
永久开放端口:
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
三、验证安装
访问服务器公网 IP(如 http://你的服务器IP
),应看到 Nginx 默认欢迎页(显示"Welcome to nginx!")。
若无法访问,检查步骤:
- 检查防火墙设置
sudo firewall-cmd --list-all
- 确认服务器网络配置
curl -I localhost # 本地测试 ping 你的服务器IP # 检查网络连通性
- 查看 Nginx 错误日志
sudo tail -f /var/log/nginx/error.log
- 检查端口监听状态
正常应显示:sudo netstat -tulnp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx: master
四、配置文件结构
4.1 主要配置文件
- 主配置文件:
/etc/nginx/nginx.conf
- 包含全局设置、events 块和 http 块
- 通常通过
include
指令加载其他配置文件
典型结构示例:
user nginx;
worker_processes auto;error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;events {worker_connections 1024;
}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;keepalive_timeout 65;gzip on;include /etc/nginx/conf.d/*.conf;
}
- 虚拟主机配置目录:
/etc/nginx/conf.d/
- 建议每个站点单独创建
.conf
文件 - 文件名通常与域名一致,如
example.com.conf
- 建议每个站点单独创建
4.2 重要目录
-
默认网站根目录:
/usr/share/nginx/html
- 存放静态网页文件
- 可修改为自定义路径
-
日志文件:
- 访问日志:
/var/log/nginx/access.log
- 记录所有访问请求
- 错误日志:
/var/log/nginx/error.log
- 记录Nginx运行错误和警告
- 访问日志:
-
PID 文件:
/run/nginx.pid
- 存储Nginx主进程的进程ID
- 用于服务管理和进程控制
五、虚拟主机配置示例
5.1 创建站点配置文件
/etc/nginx/conf.d/example.com.conf
示例:
server {listen 80;server_name example.com www.example.com;# 网站根目录设置root /var/www/example.com;index index.html index.htm;# 日志配置access_log /var/log/nginx/example.com.access.log main;error_log /var/log/nginx/example.com.error.log warn;# 默认请求处理location / {try_files $uri $uri/ =404;}# 静态文件缓存设置location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {expires 30d;add_header Cache-Control "public, no-transform";}# 禁止访问隐藏文件location ~ /\. {deny all;}# 自定义错误页面error_page 404 /404.html;error_page 500 502 503 504 /50x.html;
}
5.2 创建网站目录并设置权限
# 创建网站目录
sudo mkdir -p /var/www/example.com# 设置目录所有权(Nginx运行用户通常为nginx)
sudo chown -R nginx:nginx /var/www/example.com# 设置目录权限
sudo chmod -R 755 /var/www/example.com# 创建测试页面
echo "<!DOCTYPE html>
<html>
<head><title>Welcome to example.com</title>
</head>
<body><h1>Welcome to example.com</h1><p>This is a test page for Nginx configuration.</p>
</body>
</html>" | sudo tee /var/www/example.com/index.html# 创建错误页面
echo "<h1>404 Not Found</h1>" | sudo tee /var/www/example.com/404.html
echo "<h1>50x Server Error</h1>" | sudo tee /var/www/example.com/50x.html
5.3 测试并重载配置
# 测试配置语法是否正确
sudo nginx -t# 如果测试通过,平滑重载配置(不影响现有连接)
sudo systemctl reload nginx# 或者完全重启服务(会中断现有连接)
sudo systemctl restart nginx
配置测试成功输出:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
六、常见问题解决方案
6.1 Nginx 启动失败
检查步骤:
-
查看错误信息
sudo journalctl -xe sudo tail -f /var/log/nginx/error.log
-
端口冲突检查
sudo netstat -tulnp | grep :80
如果其他服务(如Apache)占用了80端口,需要先停止它们:
sudo systemctl stop httpd sudo systemctl disable httpd
-
配置文件测试
sudo nginx -t
-
检查SELinux状态
getenforce
6.2 SELinux 相关问题
临时解决方案(不推荐生产环境):
sudo setenforce 0
永久解决方案(需重启生效):
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
更安全的做法是配置正确的SELinux上下文:
# 为网站目录设置httpd上下文
sudo chcon -R -t httpd_sys_content_t /var/www/example.com# 允许Nginx访问网络
sudo setsebool -P httpd_can_network_connect 1
七、性能优化建议
7.1 进程配置优化
/etc/nginx/nginx.conf
示例:
worker_processes auto; # 自动匹配CPU核心数
worker_rlimit_nofile 65535; # 提高worker进程能打开的文件描述符数量events {worker_connections 4096; # 每个worker的最大连接数use epoll; # 高效事件模型(Linux专用)multi_accept on; # 一次接受多个连接
}
调整系统限制:
# 编辑/etc/security/limits.conf
echo "nginx soft nofile 65535" | sudo tee -a /etc/security/limits.conf
echo "nginx hard nofile 65535" | sudo tee -a /etc/security/limits.conf
7.2 连接优化
http {keepalive_timeout 65; # 保持连接的超时时间keepalive_requests 100; # 单个连接的最大请求数sendfile on; # 启用高效文件传输tcp_nopush on; # 优化数据包发送tcp_nodelay on; # 禁用Nagle算法client_body_buffer_size 10K;client_header_buffer_size 1k;client_max_body_size 8m;large_client_header_buffers 2 1k;
}
7.3 压缩配置
gzip on;
gzip_min_length 1k; # 最小压缩文件大小
gzip_comp_level 6; # 压缩级别(1-9)
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on; # 根据客户端支持情况决定是否压缩
gzip_disable "MSIE [1-6]\."; # 对旧版IE禁用压缩
gzip_proxied any; # 对所有代理请求启用压缩
7.4 缓存优化
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;server {location / {proxy_cache my_cache;proxy_cache_key "$scheme$request_method$host$request_uri";proxy_cache_valid 200 304 12h;proxy_cache_valid any 10m;add_header X-Proxy-Cache $upstream_cache_status;}
}
创建缓存目录并设置权限:
sudo mkdir -p /var/cache/nginx
sudo chown nginx:nginx /var/cache/nginx
八、HTTPS 配置建议
8.1 使用 Certbot 自动配置
安装 Certbot(Let's Encrypt客户端):
sudo yum install -y epel-release
sudo yum install -y certbot python3-certbot-nginx
申请证书(自动配置Nginx):
sudo certbot --nginx -d example.com -d www.example.com
按照提示操作后,Certbot会:
- 验证域名所有权
- 获取SSL证书
- 自动修改Nginx配置启用HTTPS
- 设置自动续期任务
手动续期测试:
sudo certbot renew --dry-run
查看自动续期任务:
sudo systemctl list-timers | grep certbot
8.2 手动配置示例
/etc/nginx/conf.d/example.com_ssl.conf
:
server {listen 443 ssl http2;server_name example.com www.example.com;ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;# 安全配置ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';ssl_prefer_server_ciphers on;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_session_tickets off;# OCSP Staplingssl_stapling on;ssl_stapling_verify on;resolver 8.8.8.8 8.8.4.4 valid=300s;resolver_timeout 5s;# 其他站点配置...root /var/www/example.com;index index.html;location / {try_files $uri $uri/ =404;}
}# HTTP重定向到HTTPS
server {listen 80;server_name example.com www.example.com;return 301 https://$host$request_uri;
}
配置完成后测试并重载:
sudo nginx -t
sudo systemctl reload nginx
检查SSL配置质量:
curl -I https://example.com
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -text
可以使用在线工具测试SSL配置:
- SSL Labs Test
- Mozilla SSL Config Generator