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 仓库安装

  1. 添加 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 签名检查 (对于官方仓库,通常可以信任)。

  2. 安装 Nginx

    执行以下命令安装 Nginx:

    bash
    sudo yum install nginx -y

  3. 启动 Nginx

    安装完成后,启动 Nginx 服务:

    bash
    sudo systemctl start nginx

  4. 设置开机自启

    为了确保 Nginx 在系统重启后自动启动,执行以下命令:

    bash
    sudo systemctl enable nginx

  5. 验证安装

    可以通过多种方式验证 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 端口) 流量通过。

  1. 开放端口

    bash
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --permanent --add-service=https

  2. 重新加载防火墙配置

    bash
    sudo firewall-cmd --reload

    4. Nginx 配置

Nginx 的主要配置文件是 /etc/nginx/nginx.conf。该文件采用模块化的结构,可以包含其他配置文件。

4.1. 配置文件结构

Nginx 配置文件由指令和块组成。指令是配置选项,块用于组织指令。

  • 全局块:位于文件顶部,包含影响整个 Nginx 服务器的指令,如 userworker_processes 等。

  • events 块:配置影响 Nginx 连接处理的参数,如 worker_connections

  • http 块:包含配置 HTTP 服务器的指令,如 serverlocationupstream 等。

  • 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 块) 实现这一功能。

  1. 创建网站目录

    为每个网站创建一个独立的目录,用于存放网站文件。

    bash
    sudo mkdir -p /var/www/example1.com
    sudo mkdir -p /var/www/example2.com

  2. 创建虚拟主机配置文件

    /etc/nginx/conf.d/ 目录下为每个网站创建一个独立的配置文件。例如:

    • /etc/nginx/conf.d/example1.com.conf
    • /etc/nginx/conf.d/example2.com.conf

    在每个配置文件中,定义相应的 server 块,配置 server_nameroot 等指令。

  3. 重启 Nginx

    修改配置文件后,需要重启 Nginx 使配置生效:

    bash
    sudo systemctl restart nginx

5. 高级配置

5.1. SSL/TLS 证书配置 (HTTPS)

为了启用 HTTPS,需要获取 SSL/TLS 证书,并在 Nginx 中进行配置。

  1. 获取证书

    可以从 Let's Encrypt 等机构免费获取 SSL/TLS 证书,也可以购买商业证书。

  2. 配置 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 可以作为负载均衡器,将请求分发到多个后端服务器,提高系统的可用性和性能。

  1. 定义 upstream 块

    http 块中定义 upstream 块,列出后端服务器的地址和权重:

    nginx
    upstream backend {
    server backend1.example.com weight=5;
    server backend2.example.com;
    server backend3.example.com backup;
    }

    • weight:指定服务器的权重,默认为 1。
    • backup:将服务器标记为备用服务器,仅在主服务器不可用时启用。
  2. 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: 每日轮换一次日志。其他选项有 weeklymonthly 等。
  • 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)。在 serverlocation 块中添加以下配置:

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 应用至关重要。

THE END