Nginx在CentOS上的安装与配置教程


Nginx 在 CentOS 上的安装与配置

1. 引言

Web 服务器是现代互联网基础设施的关键组成部分。在众多可用的 Web 服务器软件中,Nginx 以其高性能、稳定性、丰富的功能集和低资源消耗而脱颖而出。Nginx 不仅可以作为独立的 Web 服务器,还可以用作反向代理、负载均衡器和 HTTP 缓存。本报告旨在详细阐述 Nginx 在 CentOS 操作系统上的安装与配置过程,为系统管理员和 Web 开发人员提供实用指南。

2. 系统环境与预备条件

2.1. 操作系统

本报告以 CentOS 7/8 作为目标操作系统。CentOS 是一个基于 Red Hat Enterprise Linux (RHEL) 的、社区驱动的免费开源操作系统,以其稳定性和安全性著称。

2.2. 软件包管理

CentOS 使用 YUM (Yellowdog Updater, Modified) 作为其默认的软件包管理器。在安装 Nginx 之前,建议更新系统软件包到最新版本:

bash
sudo yum update -y

2.3. 防火墙配置 (可选)

如果系统启用了防火墙 (firewalld),需要开放 HTTP (80) 和 HTTPS (443) 端口:

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

如果使用 iptables,可以用以下命令:

bash
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT
sudo service iptables save

2.4. SELinux (可选)

如果系统启用了 SELinux,可能需要调整相关策略以允许 Nginx 正常运行。为了简化安装过程,可以临时禁用 SELinux(不推荐在生产环境中使用):

bash
sudo setenforce 0

如果需要配置SELinux,可以安装policycoreutils-python工具包后,运行下列命令:
bash
sudo yum install policycoreutils-python
sudo semanage port -a -t http_port_t -p tcp 80
sudo semanage port -a -t http_port_t -p tcp 443

3. Nginx 安装

3.1. 通过 EPEL 仓库安装 (推荐)

EPEL (Extra Packages for Enterprise Linux) 是一个由 Fedora 社区维护的、为 RHEL 和 CentOS 提供额外软件包的仓库。通过 EPEL 仓库安装 Nginx 可以获得较新的版本和及时的安全更新。

  1. 安装 EPEL 仓库

    bash
    sudo yum install epel-release -y

  2. 安装 Nginx

    bash
    sudo yum install nginx -y

3.2. 从 Nginx 官方仓库安装

Nginx 官方也提供了自己的 yum 仓库。这种方式可以安装最新版本的 Nginx。

  1. 创建 Nginx 仓库文件

    bash
    sudo vi /etc/yum.repos.d/nginx.repo

    在文件中添加以下内容(以 CentOS 7 为例):

    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1

    对于 CentOS 8, 需要将7改为8.

  2. 安装 Nginx

    bash
    sudo yum install nginx -y

3.3 验证安装

安装完成后,启动 Nginx 服务并检查其状态:

bash
sudo systemctl start nginx
sudo systemctl status nginx

如果服务正常运行,应该看到类似 "active (running)" 的输出。

使用浏览器访问服务器的 IP 地址或域名,如果看到 Nginx 的默认欢迎页面,则表示安装成功。

4. Nginx 基本配置

Nginx 的主要配置文件是 /etc/nginx/nginx.conf。该文件使用一种简洁的、层次化的配置语法。

4.1. 配置文件结构

Nginx 配置文件由多个上下文 (context) 组成,每个上下文包含一组指令 (directive)。主要的上下文包括:

  • events: 配置影响 Nginx 连接处理的参数。
  • http: 配置 HTTP 服务器的核心功能。
  • server: 定义一个虚拟主机。
  • location: 定义如何处理特定 URI 的请求。

4.2. 常用指令

以下是一些常用的 Nginx 指令:

  • worker_processes: 指定 Nginx 工作进程的数量。通常设置为 CPU 核心数或 auto
  • worker_connections: 指定每个工作进程可以同时处理的最大连接数。
  • listen: 指定监听的端口和地址。
  • server_name: 指定虚拟主机的域名。
  • root: 指定网站的根目录。
  • index: 指定默认的索引文件。
  • error_page: 定义错误页面的处理方式。
  • access_logerror_log: 指定访问日志和错误日志的位置。

4.3. 虚拟主机配置

虚拟主机允许在同一台服务器上托管多个网站。每个虚拟主机通常对应一个 server 块。

以下是一个简单的虚拟主机配置示例:

```nginx
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;

location / {
    try_files $uri $uri/ =404;
}

}
```
在上述例子中:

  • listen 80;: 表示监听所有网络接口80端口的连接
  • server_name example.com www.example.com;: 将example.comwww.example.com绑定到这个虚拟主机。
  • root /var/www/example.com;: 表示网站根目录位于/var/www/example.com.
  • index index.html;: 表示在根目录访问的时候,默认访问文件是index.html
  • location /: 匹配根 URL (/).
  • try_files $uri $uri/ =404;: 尝试按顺序查找文件:首先尝试直接访问请求的 URI($uri),如果找不到,尝试访问同名目录下的 index 文件($uri/),如果仍然找不到,返回 404 错误。

4.4. 配置文件的组织

为了便于管理,可以将不同的虚拟主机配置放在单独的文件中,然后通过 include 指令包含到主配置文件中。通常,这些配置文件位于 /etc/nginx/conf.d/ 目录下。

例如,可以在 /etc/nginx/conf.d/ 目录下创建一个名为 example.com.conf 的文件,并将上述虚拟主机配置放入其中。然后在 /etc/nginx/nginx.conf 文件的 http 块中添加以下指令:

nginx
include /etc/nginx/conf.d/*.conf;

4.5. 检查配置并重新加载

修改配置文件后,需要检查配置文件的语法是否正确:

bash
sudo nginx -t

如果显示 "syntax is ok" 和 "test is successful",则表示配置语法正确。

然后,重新加载 Nginx 以应用新的配置:

bash
sudo systemctl reload nginx

或者使用
sudo nginx -s reload
这两种方式都可以实现Nginx配置文件的平滑重新加载。

5. Nginx 高级配置

5.1. 反向代理

Nginx 经常被用作反向代理服务器,将客户端的请求转发到后端服务器集群。这种方式可以提高安全性、负载均衡和性能。

以下是一个简单的反向代理配置示例:

```nginx
server {
listen 80;
server_name example.com;

location / {
    proxy_pass http://backend_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

}
```

在上述例子中:

  • proxy_pass: 指定后端服务器的地址。
  • proxy_set_header: 设置传递给后端服务器的 HTTP 头。
  • http://backend_server 应该被替换为后端服务器的IP和端口,例如http://127.0.0.1:8080.

5.2. 负载均衡

Nginx 可以将请求分发到多个后端服务器,实现负载均衡。

以下是一个简单的负载均衡配置示例:

```nginx
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}

server {
listen 80;
server_name example.com;

location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

}
```

在上述例子中:

  • upstream: 定义一个后端服务器组。
  • 每个 server 指令指定一个后端服务器的地址。

Nginx 支持多种负载均衡算法,例如:

  • 轮询 (round-robin): 默认算法,按顺序将请求分发到每个服务器。
  • 最少连接 (least_conn): 将请求分发到当前连接数最少的服务器。
  • IP 哈希 (ip_hash): 根据客户端 IP 地址的哈希值将请求分发到固定的服务器,可以实现会话保持。

可以在 upstream 块中使用 least_connip_hash 指令来指定负载均衡算法。

5.3. HTTPS 配置

为了保证网站的安全性,建议启用 HTTPS。可以使用 Let's Encrypt 等免费的证书颁发机构 (CA) 来获取 SSL/TLS 证书。

以下是一个简单的 HTTPS 配置示例:

```nginx
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
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;

root /var/www/example.com;
index index.html;

location / {
    try_files $uri $uri/ =404;
}

}
```

在上述例子中:

  • 第一个 server 块将 HTTP 请求重定向到 HTTPS。
  • 第二个 server 块配置 HTTPS。
  • ssl_certificatessl_certificate_key: 指定 SSL/TLS 证书和私钥的路径。
  • 其他指令与 HTTP 配置类似。

5.4. 静态内容缓存

Nginx 可以缓存静态内容(例如图片、CSS 和 JavaScript 文件),减少对后端服务器的请求,提高性能。

以下是一个简单的静态内容缓存配置示例:

```nginx
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
    # ... 其他配置 ...

    location /static/ {
        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_pass http://backend;
    }
}

}
```

在上述例子中:

  • proxy_cache_path: 定义缓存的存储路径和参数。
  • proxy_cache: 指定要使用的缓存区域。
  • proxy_cache_valid: 定义不同状态码的缓存时间。

5.5. 性能调优相关参数比较

以下是一些常用的 Nginx 性能调优参数,以对比方式呈现其作用:

| 参数 | 描述 | 调整建议 | 影响 |
| :------------------ | :----------------------------------------------------------- | :----------------------------------------------------------- | :--------------------------------------------------------- |
| worker_processes | Nginx 工作进程的数量。 | 设置为 CPU 核心数或 auto。 | 过少会限制并发处理能力,过多会增加进程间切换开销。 |
| worker_connections | 每个工作进程可以同时处理的最大连接数。 | 根据系统资源和预期负载调整。 | 过小会限制并发连接数,过大会消耗过多内存。 |
| sendfile | 是否启用 sendfile() 系统调用来传输文件。 | 通常启用 (on),可以提高文件传输效率。 | 禁用会降低性能,但在某些特殊情况下可能需要禁用。 |
| tcp_nopush | 是否启用 TCP_NOPUSH 选项(仅限 FreeBSD)或 TCP_CORK 选项(Linux)。 | 通常启用 (on),可以减少网络包的数量,提高效率。 | 禁用可能会增加网络延迟。 |
| tcp_nodelay | 是否禁用 Nagle 算法。 | 对于需要低延迟的连接(例如 WebSocket),可以禁用 (off)。 | 启用可能会增加网络延迟,但可以提高吞吐量。 |
| keepalive_timeout | 长连接的超时时间。 | 根据实际情况调整,平衡连接复用和资源占用。 | 过短会导致频繁建立连接,过长会占用过多资源。 |
| gzip | 是否启用 Gzip 压缩。 | 对于文本类型的内容(例如 HTML、CSS、JavaScript),通常启用 (on)。 | 启用可以减少传输数据量,提高加载速度,但会增加 CPU 消耗。 |
| open_file_cache | 是否启用文件描述符缓存。 | 通常启用,可以减少文件打开操作的开销。 | 可以提高对静态文件的访问速度。 |

上面这种比较方式,比用表格更强调描述和建议,而不是单纯的数据对比。

6. 补充说明

本报告详细介绍了 Nginx 在 CentOS 系统上的安装和配置过程,涵盖了基本安装、配置文件结构、虚拟主机配置、反向代理、负载均衡、HTTPS 配置和性能调优等方面。提供的配置示例和参数说明可以作为实际部署的参考,但具体的配置需要根据实际的硬件环境、业务需求和安全要求进行调整。建议在生产环境中进行充分的测试和监控,以确保 Nginx 的稳定运行和最佳性能。
同时,需要密切关注 Nginx 官方的安全公告和版本更新,及时升级到最新版本,以修复已知的安全漏洞和缺陷。

THE END