1. 为什么选择Nginx作为Web服务器?
在开始安装之前,我们需要先理解为什么Nginx会成为众多开发者和运维人员的首选。Nginx是一个高性能的HTTP和反向代理服务器,以其稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。根据最新的Web服务器调查,Nginx在全球活跃网站中的市场份额超过33%,远超Apache等传统服务器。
Nginx的核心优势在于其事件驱动的异步架构,这使得它能够轻松处理数万个并发连接,而内存占用仅为Apache的几分之一。对于CentOS系统来说,Nginx的轻量级特性尤其宝贵,因为服务器资源常常需要被高效利用。
提示:如果你正在运行一个流量较大的网站或需要处理大量并发请求,Nginx几乎是不二之选。即使是小型项目,提前使用Nginx也能为未来的扩展做好准备。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统检查
2.1 CentOS版本确认
在安装任何软件之前,确认你的CentOS版本是至关重要的。不同版本的CentOS可能对应不同的安装方法和依赖关系。打开终端并执行以下命令:
bash复制cat /etc/redhat-release
典型的输出可能类似于:
code复制CentOS Linux release 7.9.2009 (Core)
对于本教程,我们假设使用的是CentOS 7.x版本,但大部分步骤也适用于CentOS 8和更新的版本。如果你的系统是CentOS 6.x,建议考虑升级,因为该版本已经停止维护。
2.2 系统更新与依赖安装
在安装Nginx之前,确保你的系统是最新的,并安装必要的依赖项:
bash复制sudo yum update -y
sudo yum install -y epel-release
sudo yum install -y yum-utils
epel-release是Extra Packages for Enterprise Linux的仓库,提供了许多CentOS默认仓库中没有的软件包,包括Nginx。安装它能够大大简化后续的安装过程。
3. 通过YUM安装Nginx
3.1 标准YUM安装方法
对于大多数用户来说,通过YUM包管理器安装Nginx是最简单直接的方法。执行以下命令:
bash复制sudo yum install -y nginx
安装完成后,你可以验证Nginx的版本:
bash复制nginx -v
典型的输出可能类似于:
code复制nginx version: nginx/1.20.1
3.2 启用并启动Nginx服务
安装完成后,需要设置Nginx在系统启动时自动运行,并立即启动服务:
bash复制sudo systemctl enable nginx
sudo systemctl start nginx
要检查服务状态,使用:
bash复制sudo systemctl status nginx
如果一切正常,你应该看到"active (running)"的状态提示。
3.3 防火墙配置
CentOS默认启用了firewalld防火墙,需要开放HTTP(80)和HTTPS(443)端口:
bash复制sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
现在,你可以在浏览器中访问服务器的IP地址,应该能看到Nginx的默认欢迎页面。
4. 从源码编译安装Nginx
4.1 为什么选择源码安装?
虽然YUM安装简单快捷,但从源码编译安装有几个优势:
- 可以获得最新版本的Nginx
- 可以自定义编译选项和模块
- 更好地控制安装位置和配置
4.2 准备编译环境
首先安装必要的开发工具和依赖:
bash复制sudo yum groupinstall -y "Development Tools"
sudo yum install -y pcre-devel zlib-devel openssl-devel
4.3 下载并编译Nginx
访问Nginx官网获取最新稳定版的下载链接,然后执行:
bash复制wget http://nginx.org/download/nginx-1.21.6.tar.gz
tar -zxvf nginx-1.21.6.tar.gz
cd nginx-1.21.6
配置编译选项(这里启用了常用的模块):
bash复制./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream
然后编译并安装:
bash复制make
sudo make install
4.4 配置系统服务
为了方便管理,我们可以为源码安装的Nginx创建systemd服务文件:
bash复制sudo vi /etc/systemd/system/nginx.service
添加以下内容:
code复制[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
然后启用并启动服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
5. Nginx基本配置与管理
5.1 配置文件结构
Nginx的主要配置文件通常位于:
- YUM安装:/etc/nginx/nginx.conf
- 源码安装:/usr/local/nginx/conf/nginx.conf
配置文件采用模块化结构,主要包含以下几个部分:
- 全局块:配置影响Nginx全局的指令
- events块:配置影响Nginx服务器与用户的网络连接
- http块:可以嵌套多个server块,配置代理、缓存、日志等绝大多数功能
- server块:配置虚拟主机的相关参数
- location块:配置请求的路由,处理特定URL
5.2 常用管理命令
无论哪种安装方式,以下命令都适用:
检查配置语法:
bash复制sudo nginx -t
重新加载配置(不中断服务):
bash复制sudo nginx -s reload
停止服务:
bash复制sudo nginx -s stop
5.3 设置虚拟主机
典型的虚拟主机配置示例(在/etc/nginx/conf.d/目录下创建yourdomain.conf):
nginx复制server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/yourdomain.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
location = /404.html {
internal;
}
}
创建网站目录并设置权限:
bash复制sudo mkdir -p /var/www/yourdomain.com
sudo chown -R $USER:$USER /var/www/yourdomain.com
sudo chmod -R 755 /var/www/yourdomain.com
6. 安全加固与性能优化
6.1 基本安全措施
禁用server tokens(防止泄露Nginx版本信息):
nginx复制server_tokens off;
限制HTTP方法:
nginx复制if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
设置安全相关的HTTP头:
nginx复制add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
6.2 性能优化建议
调整worker进程:
nginx复制worker_processes auto; # 通常设置为CPU核心数
worker_connections 1024; # 每个worker的最大连接数
启用Gzip压缩:
nginx复制gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
配置静态文件缓存:
nginx复制location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
}
7. 常见问题排查
7.1 端口冲突问题
如果Nginx启动失败,首先检查端口是否被占用:
bash复制sudo netstat -tulnp | grep :80
如果Apache等服务占用了80端口,需要先停止它们:
bash复制sudo systemctl stop httpd
sudo systemctl disable httpd
7.2 权限问题
Nginx默认以nginx用户运行,确保它有权访问网站文件:
bash复制sudo chown -R nginx:nginx /var/www/yourdomain.com
sudo chmod -R 755 /var/www/yourdomain.com
7.3 SELinux相关问题
如果遇到403 Forbidden错误且权限设置正确,可能是SELinux阻止了访问:
临时禁用SELinux(不推荐生产环境):
bash复制sudo setenforce 0
更安全的做法是调整SELinux策略:
bash复制sudo chcon -Rt httpd_sys_content_t /var/www/yourdomain.com
8. 进阶配置与模块扩展
8.1 启用HTTP/2
在server块中添加:
nginx复制listen 443 ssl http2;
需要先配置SSL证书,可以使用Let's Encrypt免费证书。
8.2 负载均衡配置
简单的负载均衡示例:
nginx复制upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://backend;
}
}
8.3 动态模块加载
Nginx 1.9.11+支持动态模块。以安装Brotli压缩模块为例:
bash复制# 下载模块源码
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init
# 重新配置Nginx
cd /path/to/nginx/source
./configure --add-dynamic-module=/path/to/ngx_brotli [其他原有参数]
make modules
sudo cp objs/ngx_http_brotli_filter_module.so objs/ngx_http_brotli_static_module.so /etc/nginx/modules/
然后在nginx.conf中加载:
nginx复制load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;
9. 日志管理与分析
9.1 访问日志配置
自定义访问日志格式:
nginx复制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;
9.2 错误日志配置
nginx复制error_log /var/log/nginx/error.log warn;
日志级别可以是:debug, info, notice, warn, error, crit, alert, emerg。
9.3 日志轮转
创建logrotate配置:
bash复制sudo vi /etc/logrotate.d/nginx
添加内容:
code复制/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 nginx adm
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
10. 维护与监控
10.1 状态监控
启用stub_status模块:
nginx复制location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
访问http://your-server/nginx_status将显示:
code复制Active connections: 3
server accepts handled requests
10 10 20
Reading: 0 Writing: 1 Waiting: 2
10.2 定期健康检查
设置简单的监控脚本:
bash复制#!/bin/bash
response=$(curl -sI http://localhost | head -n 1 | cut -d' ' -f2)
if [ "$response" != "200" ]; then
systemctl restart nginx
echo "Nginx restarted at $(date)" >> /var/log/nginx/restart.log
fi
添加到cron:
bash复制(crontab -l ; echo "*/5 * * * * /path/to/check_nginx.sh") | crontab -
10.3 备份策略
定期备份重要配置文件:
bash复制sudo tar -czvf /backup/nginx_config_$(date +%Y%m%d).tar.gz /etc/nginx /usr/local/nginx/conf
考虑自动化备份到远程存储或云服务。
