CentOS 安装 Nginx 详细指南
CentOS 系统 Nginx 服务安装与配置详述
1. 引言
Nginx (发音为 "engine-x") 是一款高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3 代理服务。Nginx 以其稳定性、丰富的功能集、简单的配置文件和低系统资源消耗而闻名。在众多 Web 服务器中,Nginx 能够处理高并发连接,使其成为现代 Web 架构中的关键组件。
本报告旨在详细阐述在 CentOS 操作系统上安装和配置 Nginx 的过程。内容涵盖从准备环境到配置高级功能的各个方面,力求提供一个全面、细致的操作指南。
2. 环境准备与先决条件
2.1. 系统要求
在开始安装 Nginx 之前,需要确保 CentOS 系统满足以下基本要求:
- 操作系统:CentOS 7 或 CentOS 8 (本报告以 CentOS 7 为例进行说明,CentOS 8 步骤类似)。
- 硬件要求:最低配置要求较低,建议至少 512MB 内存和 10GB 硬盘空间。对于生产环境,应根据实际负载情况进行调整。
- 网络连接:确保服务器具有稳定的互联网连接,以便下载软件包。
- 用户权限:需要具有
sudo
权限的用户账户来执行安装和配置命令。
2.2. 更新系统
在安装任何新软件之前,推荐更新 CentOS 系统软件包到最新版本。这可以确保获得最新的安全补丁和功能改进。执行以下命令进行系统更新:
bash
sudo yum update -y
该命令会检查可用的更新,并在无需确认的情况下自动安装。-y
标志用于自动应答所有提示。
2.3 依赖包
在一些旧的CentOS版本,可能需要安装EPEL。
EPEL 是 Extra Packages for Enterprise Linux 的简称,是由 Fedora 社区创建维护,为 RHEL 及衍生发行版如 CentOS、Rocky Linux 等提供高质量软件包的项目。
bash
sudo yum install epel-release -y
3. Nginx 安装
在 CentOS 上安装 Nginx 有多种方法,主要包括从官方 Nginx 仓库安装和从 EPEL 仓库安装。
3.1. 安装方式比较
官方 Nginx 仓库 vs. EPEL 仓库
-
版本:
- 官方 Nginx 仓库:通常提供最新版本的 Nginx (包括 mainline 和 stable 版本)。
- EPEL 仓库:提供的 Nginx 版本可能稍旧,但经过 CentOS 社区的充分测试,稳定性有保障。
-
更新频率:
- 官方 Nginx 仓库:更新更频繁,可以更快地获取新功能和安全补丁。
- EPEL 仓库:更新相对保守,注重稳定性。
-
安装过程:
- 官方 Nginx 仓库:需要手动添加仓库配置。
- EPEL 仓库:可以直接通过
yum
安装。
-
维护:
- 官方 Nginx 仓库:由 Nginx 官方维护。
- EPEL仓库:有Fedora社区维护
根据以上对比,建议生产环境优先选择从官方 Nginx 仓库安装,以获取最新的稳定版本。
3.2. 从官方 Nginx 仓库安装
-
添加 Nginx 仓库配置
创建
/etc/yum.repos.d/nginx.repo
文件,并添加以下内容:[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1这里,
$releasever
会自动替换为 CentOS 的版本号 (如 7 或 8),$basearch
会替换为系统架构 (如 x86_64)。gpgcheck=0
表示禁用 GPG 签名检查 (对于官方仓库,通常可以信任)。 -
安装 Nginx
执行以下命令安装 Nginx:
bash
sudo yum install nginx -y -
启动 Nginx
安装完成后,启动 Nginx 服务:
bash
sudo systemctl start nginx -
设置开机自启
为了确保 Nginx 在系统重启后自动启动,执行以下命令:
bash
sudo systemctl enable nginx -
验证安装
可以通过多种方式验证 Nginx 是否成功安装并运行:
-
检查服务状态:
bash
sudo systemctl status nginx如果 Nginx 正在运行,会看到类似 "active (running)" 的输出。
-
使用 curl 命令:
bash
curl -I 127.0.0.1如果 Nginx 正常工作,会返回 HTTP 响应头,其中包含 "Server: nginx" 字样。
-
浏览器访问:
在浏览器中输入服务器的 IP 地址或域名。如果看到 Nginx 的默认欢迎页面,则表示安装成功。
-
3.3 防火墙设置
如果 CentOS 系统启用了防火墙 (firewalld),需要允许 HTTP (80 端口) 和 HTTPS (443 端口) 流量通过。
-
开放端口:
bash
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https -
重新加载防火墙配置:
bash
sudo firewall-cmd --reload4. Nginx 配置
Nginx 的主要配置文件是 /etc/nginx/nginx.conf
。该文件采用模块化的结构,可以包含其他配置文件。
4.1. 配置文件结构
Nginx 配置文件由指令和块组成。指令是配置选项,块用于组织指令。
-
全局块:位于文件顶部,包含影响整个 Nginx 服务器的指令,如
user
、worker_processes
等。 -
events 块:配置影响 Nginx 连接处理的参数,如
worker_connections
。 -
http 块:包含配置 HTTP 服务器的指令,如
server
、location
、upstream
等。 -
server 块:定义一个虚拟主机,用于处理特定域名或 IP 地址的请求。
-
location 块:在
server
块内部,用于匹配特定 URL 路径,并定义如何处理这些请求。
4.2. 常用配置指令
user
: 指定 Nginx 工作进程的用户。worker_processes
: 指定 Nginx 工作进程的数量。通常设置为 CPU 核心数或auto
。worker_connections
: 指定每个工作进程允许的最大并发连接数。include
: 包含其他配置文件。server_name
: 指定虚拟主机的域名或 IP 地址。root
: 指定网站的根目录。index
: 指定默认的索引文件。error_page
: 定义自定义错误页面。proxy_pass
: 将请求转发到另一个服务器。listen
: 指定监听的端口和ip
4.3. 配置示例
以下是一个简单的 Nginx 配置示例,用于托管一个静态网站:
```nginx
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
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;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
include /etc/nginx/conf.d/*.conf;
}
```
配置说明:
user nginx;
:Nginx 工作进程以nginx
用户身份运行。worker_processes auto;
:工作进程数自动设置为 CPU 核心数。events
块:设置worker_connections
为 1024。http
块:include /etc/nginx/mime.types;
:包含 MIME 类型定义文件。log_format
:定义日志格式。access_log
:指定访问日志文件。sendfile on;
:启用sendfile
提高文件传输效率。keepalive_timeout
:设置 keep-alive 连接的超时时间。server
块:listen 80;
:监听 80 端口。server_name example.com www.example.com;
:指定域名。root /var/www/example.com;
:网站根目录。index index.html index.htm;
:默认索引文件。location /
:匹配所有请求。try_files $uri $uri/ =404;
:尝试按顺序查找文件,如果找不到则返回 404 错误。
error_page
:定义 50x 错误的自定义页面。
4.4 虚拟主机配置
在实际应用中,通常需要在一台服务器上托管多个网站。Nginx 通过虚拟主机 (server 块) 实现这一功能。
-
创建网站目录:
为每个网站创建一个独立的目录,用于存放网站文件。
bash
sudo mkdir -p /var/www/example1.com
sudo mkdir -p /var/www/example2.com -
创建虚拟主机配置文件:
在
/etc/nginx/conf.d/
目录下为每个网站创建一个独立的配置文件。例如:/etc/nginx/conf.d/example1.com.conf
/etc/nginx/conf.d/example2.com.conf
在每个配置文件中,定义相应的
server
块,配置server_name
、root
等指令。 -
重启 Nginx:
修改配置文件后,需要重启 Nginx 使配置生效:
bash
sudo systemctl restart nginx
5. 高级配置
5.1. SSL/TLS 证书配置 (HTTPS)
为了启用 HTTPS,需要获取 SSL/TLS 证书,并在 Nginx 中进行配置。
-
获取证书:
可以从 Let's Encrypt 等机构免费获取 SSL/TLS 证书,也可以购买商业证书。
-
配置 Nginx:
在
server
块中添加以下指令:nginx
listen 443 ssl;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
ssl_protocols TLSv1.2 TLSv1.3; #配置支持的TLS协议版本
ssl_ciphers ...; #配置加密套件listen 443 ssl;
:监听 443 端口,并启用 SSL。ssl_certificate
:指定 SSL 证书文件的路径。ssl_certificate_key
:指定 SSL 私钥文件的路径。
5.2. 反向代理配置
Nginx 可以作为反向代理服务器,将客户端请求转发到后端的应用服务器 (如 Node.js、Tomcat 等)。
在 location
块中使用 proxy_pass
指令实现反向代理:
nginx
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
proxy_pass
:指定后端服务器的地址。proxy_set_header
:设置请求头,将客户端信息传递给后端服务器。
5.3. 负载均衡配置
Nginx 可以作为负载均衡器,将请求分发到多个后端服务器,提高系统的可用性和性能。
-
定义 upstream 块:
在
http
块中定义upstream
块,列出后端服务器的地址和权重:nginx
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server backend3.example.com backup;
}weight
:指定服务器的权重,默认为 1。backup
:将服务器标记为备用服务器,仅在主服务器不可用时启用。
-
在
location
块中使用proxy_pass
指令:nginx
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}将
proxy_pass
指向upstream
块的名称。
6. Nginx 性能调优
6.1. 工作进程数
worker_processes
指令决定了 Nginx 启动的工作进程数量。通常建议设置为 CPU 核心数或 auto
。过多的工作进程可能会导致进程间切换开销增加,过少则无法充分利用 CPU 资源。
6.2. 连接数
worker_connections
指令决定了每个工作进程允许的最大并发连接数。该值受到系统文件描述符限制的影响。可以通过 ulimit -n
命令查看和修改文件描述符限制。
6.3. 开启 Gzip 压缩
启用 Gzip 压缩可以减小传输文件的大小,提高网站加载速度。在 http
块中添加以下指令:
nginx
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_min_length 1000;
gzip on;
:启用 Gzip 压缩。gzip_types
:指定需要压缩的文件类型。gzip_min_length
:指定压缩的最小文件大小。
6.4. 缓存配置
Nginx 可以缓存静态资源 (如图片、CSS、JavaScript 文件),减少对后端服务器的请求。
nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public";
}
expires
:设置过期时间add_header
:设置响应头,声明是公有缓存
6.5 日志切割
对Nginx产生的日志文件进行切割管理,防止单个文件过大。
可以使用logrotate工具.
Logrotate 是一个日志管理工具,用于轮换、压缩、删除和邮件发送日志文件。
在 CentOS 上,Logrotate 通常已经预装。如果没有,可以使用以下命令安装:
sudo yum install logrotate
Nginx 的 Logrotate 配置通常位于 /etc/logrotate.d/nginx
。如果没有这个文件,可以手动创建。
配置内容示例如下:
/var/log/nginx/*.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
配置含义:
/var/log/nginx/*.log
: 指定要处理的日志文件路径,可以使用通配符。daily
: 每日轮换一次日志。其他选项有weekly
、monthly
等。rotate 30
: 保留 30 个旧的日志文件。missingok
: 如果日志文件丢失,不报错。notifempty
: 如果日志文件为空,不轮换。compress
: 压缩旧的日志文件 (使用 gzip)。delaycompress
: 延迟压缩,即上一次的日志文件在下一次轮换时才压缩。sharedscripts
:postrotate
脚本只运行一次 (在所有匹配的日志文件轮换后)。postrotate ... endscript
: 定义在日志轮换后执行的脚本。[ -f /var/run/nginx.pid ] && kill -USR1 cat /var/run/nginx.pid
: 检查 Nginx 进程 ID 文件是否存在,如果存在,则发送 USR1 信号给 Nginx 主进程,使其重新打开日志文件。
7. Nginx 安全加固
7.1. 隐藏 Nginx 版本号
在 HTTP 响应头中隐藏 Nginx 版本号可以减少信息泄露。在 http
块中添加以下指令:
nginx
server_tokens off;
7.2. 限制请求方法
只允许必要的 HTTP 请求方法 (如 GET、POST),阻止其他方法 (如 PUT、DELETE)。在 server
或 location
块中添加以下配置:
nginx
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
7.3. 防止缓冲区溢出攻击
配置适当的缓冲区大小限制,防止缓冲区溢出攻击。在 http
块中添加以下指令:
nginx
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
7.4 使用安全加固后的配置
使用安全加固后的配置能够保护服务器免受常见网络攻击。选择合适的加密套件,使用HSTS(HTTP Strict Transport Security)能够强制客户端使用HTTPS与服务器进行通信。配置如下:
```nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
```
8. 进一步补充
本文详细描述了在 CentOS 系统上安装、配置和优化 Nginx 的各个方面。从环境准备到高级功能配置,再到性能调优和安全加固,力求提供一个全面的操作指南。
当然,实际生产环境中,还需要根据具体需求进行更细致的调整和优化。
Nginx 的功能非常强大,配置灵活。本文仅介绍了常用的一些配置选项。可以查阅 Nginx 官方文档以获取更详细的信息。
掌握 Nginx 的安装、配置和优化对于构建高性能、高可用、安全的 Web 应用至关重要。