CentOS Nginx 安装教程:从入门到精通 – wiki词典

CentOS Nginx 安装教程:从入门到精通

前言

Nginx(发音为 “engine-x”)是一个高性能的HTTP和反向代理服务器,同时也可以作为邮件代理服务器和通用的TCP/UDP代理服务器。因其高并发处理能力、低内存占用和丰富的功能,Nginx 在 Web 服务器领域占据了主导地位,广泛应用于负载均衡、反向代理、静态文件服务等场景。本教程将引导您在 CentOS 系统上从零开始安装和配置 Nginx,从基础入门到掌握其高级特性。

适用系统版本

本教程主要适用于 CentOS 7 和 CentOS 8。

准备工作

在开始安装之前,请确保您的 CentOS 服务器满足以下条件:

  1. 操作系统: CentOS 7 或 CentOS 8。
  2. 网络连接: 服务器可以访问互联网以下载软件包。
  3. 用户权限: 拥有 root 用户权限或 sudo 权限的用户。

步骤一:系统更新与安装依赖

首先,更新您的系统软件包到最新版本,并安装一些必要的工具和依赖。

bash
sudo yum update -y
sudo yum install -y curl policycoreutils-python-utils

  • yum update -y:更新所有已安装的软件包。
  • curl:一个传输数据的命令行工具。
  • policycoreutils-python-utils:处理 SELinux 策略的工具,如果您的系统开启了 SELinux,这会很有用。

步骤二:安装 Nginx

Nginx 官方仓库通常提供最新版本的 Nginx,相比 CentOS 自带的仓库,功能更全面,修复了更多 Bug。因此,我们推荐使用 Nginx 官方仓库进行安装。

方式一:通过 Nginx 官方仓库安装 (推荐)

  1. 创建 Nginx 仓库配置文件:
    创建一个名为 nginx.repo 的文件在 /etc/yum.repos.d/ 目录下。

    • 对于 CentOS 7:
      bash
      sudo vi /etc/yum.repos.d/nginx.repo

      在文件中添加以下内容:
      “`ini
      [nginx-stable]
      name=nginx stable repo
      baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
      gpgcheck=1
      enabled=1
      gpgkey=https://nginx.org/keys/nginx_signing.key

      [nginx-mainline]
      name=nginx mainline repo
      baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
      gpgcheck=1
      enabled=0
      gpgkey=https://nginx.org/keys/nginx_signing.key
      * **对于 CentOS 8:**bash
      sudo vi /etc/yum.repos.d/nginx.repo
      在文件中添加以下内容:ini
      [nginx-stable]
      name=nginx stable repo
      baseurl=http://nginx.org/packages/centos/8/$basearch/
      gpgcheck=1
      enabled=1
      gpgkey=https://nginx.org/keys/nginx_signing.key

      [nginx-mainline]
      name=nginx mainline repo
      baseurl=http://nginx.org/packages/mainline/centos/8/$basearch/
      gpgcheck=1
      enabled=0
      gpgkey=https://nginx.org/keys/nginx_signing.key
      ``
      * **说明:**
      *
      nginx-stable:稳定版仓库,推荐用于生产环境。
      *
      nginx-mainline:最新主线版仓库,包含最新特性和改进,可能不如稳定版经过充分测试。默认enabled=0,如果需要安装主线版,可以将其改为1`。

  2. 安装 Nginx:
    bash
    sudo yum install -y nginx

方式二:通过 CentOS 官方仓库安装 (版本可能较旧)

如果您对 Nginx 版本要求不高,或者遇到官方仓库安装问题,可以使用 EPEL (Extra Packages for Enterprise Linux) 仓库。

  1. 安装 EPEL 仓库:

    • 对于 CentOS 7:
      bash
      sudo yum install -y epel-release
    • 对于 CentOS 8:
      bash
      sudo dnf install -y epel-release
      sudo dnf config-manager --set-enabled PowerTools # CentOS 8 需要
  2. 安装 Nginx:
    bash
    sudo yum install -y nginx

步骤三:管理 Nginx 服务

安装完成后,Nginx 服务并不会自动启动,您需要手动启动并设置开机自启。

  1. 启动 Nginx 服务:
    bash
    sudo systemctl start nginx

  2. 设置 Nginx 开机自启:
    bash
    sudo systemctl enable nginx

  3. 检查 Nginx 服务状态:
    bash
    sudo systemctl status nginx

    如果服务正常运行,您会看到 active (running) 的字样。

  4. 重新加载配置:
    当您修改 Nginx 配置文件后,无需重启服务,只需重新加载配置即可。
    bash
    sudo systemctl reload nginx

  5. 停止 Nginx 服务:
    bash
    sudo systemctl stop nginx

步骤四:配置防火墙

CentOS 默认开启了 firewalld 防火墙,Nginx 默认监听 80 端口 (HTTP) 和 443 端口 (HTTPS)。您需要开放这些端口以允许外部访问。

  1. 开放 HTTP (80) 和 HTTPS (443) 端口:
    bash
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --permanent --add-service=https

  2. 重新加载防火墙规则:
    bash
    sudo firewall-cmd --reload

现在,您可以在浏览器中输入您的服务器 IP 地址或域名,应该能看到 Nginx 的欢迎页面(”Welcome to Nginx!”)。

步骤五:Nginx 基础配置

Nginx 的主配置文件位于 /etc/nginx/nginx.conf。其他网站或应用相关的配置通常放在 /etc/nginx/conf.d/ 目录下,以 .conf 结尾的文件会被主配置文件自动包含。

配置文件结构概述

一个典型的 Nginx 配置文件结构如下:

“`nginx

全局配置

user nginx; # 运行 Nginx 进程的用户
worker_processes auto; # 工作进程数量,通常设置为 CPU 核心数或 auto

error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
pid /var/run/nginx.pid; # Nginx 主进程的 PID 文件

events {
worker_connections 1024; # 每个工作进程的最大连接数
}

http {
include /etc/nginx/mime.types; # MIME 类型映射
default_type application/octet-stream; # 默认 MIME 类型

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;           # 配合 sendfile 提高传输效率

keepalive_timeout  65;        # 长连接超时时间

#gzip  on;                    # 开启 Gzip 压缩

include /etc/nginx/conf.d/*.conf; # 包含 /etc/nginx/conf.d/ 目录下的所有 .conf 文件

}
“`

配置您的第一个网站 (虚拟主机)

我们将创建一个简单的虚拟主机来服务静态内容。

  1. 创建网站根目录:
    bash
    sudo mkdir -p /var/www/html/example.com

  2. 创建简单的 HTML 文件:
    bash
    echo "<h1>Welcome to Example.com!</h1>" | sudo tee /var/www/html/example.com/index.html

  3. 设置目录权限:
    bash
    sudo chown -R nginx:nginx /var/www/html/example.com
    sudo chmod -R 755 /var/www/html/example.com

  4. 创建 Nginx 虚拟主机配置文件:
    bash
    sudo vi /etc/nginx/conf.d/example.com.conf

    添加以下内容:
    “`nginx
    server {
    listen 80;
    server_name example.com www.example.com; # 您的域名

    root         /var/www/html/example.com;  # 网站根目录
    index        index.html index.htm;     # 默认文件
    
    location / {
        try_files $uri $uri/ =404; # 尝试匹配文件或目录,否则返回 404
    }
    
    error_page 500 502 503 504 /50x.html; # 错误页面
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    
    access_log  /var/log/nginx/example.com_access.log  main;
    error_log   /var/log/nginx/example.com_error.log   warn;
    

    }
    “`

  5. 检查 Nginx 配置语法:
    bash
    sudo nginx -t

    如果看到 syntax is oktest is successful,则表示配置无误。

  6. 重新加载 Nginx 配置:
    bash
    sudo systemctl reload nginx

现在,如果您在本地 hosts 文件中将 example.comwww.example.com 指向您的服务器 IP,就可以通过浏览器访问 http://example.com 看到您创建的页面。

步骤六:Nginx 高级配置

Nginx 远不止静态文件服务,它在反向代理、负载均衡、SSL/TLS 加密等方面表现卓越。

1. 配置 SSL/TLS (HTTPS)

为您的网站启用 HTTPS 是现代 Web 的最佳实践。我们将使用 Let’s Encrypt 提供的免费 SSL 证书。

  1. 安装 Certbot:
    Certbot 是 Let’s Encrypt 官方推荐的客户端,可以自动获取和续订证书。

    • 对于 CentOS 7:
      bash
      sudo yum install -y certbot python2-certbot-nginx
    • 对于 CentOS 8:
      bash
      sudo dnf install -y certbot python3-certbot-nginx
  2. 获取并安装 SSL 证书:
    bash
    sudo certbot --nginx -d example.com -d www.example.com

    按照提示输入您的邮箱地址,并同意服务条款。Certbot 会自动修改您的 Nginx 配置,添加 HTTPS 支持。

  3. 测试自动续订:
    Let’s Encrypt 证书有效期为 90 天,Certbot 会自动设置定时任务进行续订。您可以手动测试续订过程。
    bash
    sudo certbot renew --dry-run

2. 配置反向代理

Nginx 作为反向代理服务器可以将客户端请求转发到后端应用服务器(如 Node.js, Python Flask/Django, Java Tomcat 等),隐藏后端服务的真实 IP 和端口。

假设您有一个后端应用运行在 http://127.0.0.1:3000

修改 example.com.conf

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

# 将所有 HTTP 请求重定向到 HTTPS
return 301 https://$server_name$request_uri;

}

server {
listen 443 ssl;
server_name example.com www.example.com;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Certbot 自动生成
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Certbot 自动生成
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
    proxy_pass http://127.0.0.1:3000; # 转发到后端应用
    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_set_header X-Forwarded-Proto $scheme;
}

access_log  /var/log/nginx/example.com_access.log  main;
error_log   /var/log/nginx/example.log   warn;

}
“`

重新加载 Nginx 配置后,访问 https://example.com 就会将请求转发到您的后端应用。

3. 配置负载均衡

当您有多个后端服务器提供相同服务时,Nginx 可以将请求分发到这些服务器上,实现负载均衡。

“`nginx
upstream backend_servers {
server 192.168.1.100:8000; # 后端服务器1
server 192.168.1.101:8000; # 后端服务器2
# server 192.168.1.102:8000 backup; # 备份服务器
# server 192.168.1.103:8000 down; # 标记为停止
}

server {
listen 80;
server_name myapp.com;

location / {
    proxy_pass http://backend_servers; # 将请求转发到 upstream 定义的服务器组
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}
“`

Nginx 提供了多种负载均衡算法:
* round-robin (默认): 按顺序循环分发请求。
* least_conn: 将请求发送到活动连接数最少的服务器。
* ip_hash: 基于客户端 IP 地址的哈希值来分配请求,确保同一客户端总是被转发到同一服务器,适用于会话保持。
* least_time (商业版): 最短响应时间和最少活动连接数的服务器。

您可以在 server 后添加权重(如 server 192.168.1.100:8000 weight=3;)来调整流量分配。

4. 配置缓存

Nginx 可以缓存后端服务器的响应,减少后端压力,提高响应速度。

http 块中定义缓存区域:

“`nginx
http {
# … 其他配置

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;

server {
    listen 80;
    server_name mycachedapp.com;

    location / {
        proxy_pass http://my_backend_server;
        proxy_cache my_cache;              # 启用缓存
        proxy_cache_valid 200 302 10m;     # 缓存 200 和 302 状态码的响应 10 分钟
        proxy_cache_valid 404 1m;          # 缓存 404 状态码的响应 1 分钟
        proxy_cache_min_uses 1;            # 至少请求一次后才缓存
        add_header X-Cache-Status $upstream_cache_status; # 添加缓存状态头信息
    }
}

}
“`

5. 开启 Gzip 压缩

Gzip 可以压缩传输的文本文件,减少带宽消耗,加快页面加载速度。在 http 块中添加:

“`nginx
http {
# … 其他配置

gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

}
“`

步骤七:Nginx 故障排除

  • 检查 Nginx 状态: sudo systemctl status nginx
  • 检查 Nginx 配置语法: sudo nginx -t
  • 查看 Nginx 错误日志: /var/log/nginx/error.log
  • 查看 Nginx 访问日志: /var/log/nginx/access.log
  • 防火墙问题: 确保端口已开放,使用 sudo firewall-cmd --list-all 查看当前规则。
  • SELinux 问题: 如果遇到权限拒绝错误,可能是 SELinux 阻止了 Nginx 访问文件或端口。您可以临时禁用 SELinux (sudo setenforce 0) 或配置相应的 SELinux 策略。例如,允许 Nginx 访问非标准端口或目录:
    bash
    sudo semanage fcontext -a -t httpd_sys_content_t "/path/to/your/webroot(/.*)?"
    sudo restorecon -Rv /path/to/your/webroot
    sudo semanage port -a -t http_port_t -p tcp 8080 # 如果 Nginx 监听 8080 端口

总结

通过本教程,您应该已经掌握了在 CentOS 上安装和配置 Nginx 的基本方法,并了解了如何利用其高级功能,如 SSL/TLS 加密、反向代理、负载均衡和内容缓存。Nginx 功能强大且配置灵活,深入学习其模块和指令将帮助您构建更高效、更安全的 Web 服务架构。

滚动至顶部