一、Nginx 简介

1.1 概述

Nginx 是一款高性能、轻量级的开源 Web 服务器和反向代理服务器,以其可靠性、丰富的功能和简单的配置而闻名。由 Igor Sysoev 开发,最初用于解决 C10K 问题,与传统的 Web 服务器相比,Nginx 采用异步事件驱动架构,能够处理大量并发连接,并以低资源消耗提供高性能服务。

1.2 应用场景

Nginx 广泛应用于各种 Web 服务场景,包括:

  • 静态资源服务: 高效地提供图片、CSS、JavaScript 等静态文件。
  • 反向代理: 作为应用程序服务器的前置代理,隐藏真实服务器、负载均衡、缓存内容等。
  • 负载均衡: 分配请求到多个后端服务器,提高系统可用性和性能。
  • 动态内容服务: 与应用程序服务器配合,处理动态请求,如 PHP、Python、Java 等。
  • 安全防护:  实现访问控制、HTTPS 加密、防止 DDoS 攻击等安全功能。

二、Nginx 的优势

  • 高性能: 擅长处理并发连接,适合高流量网站。
  • 稳定性: 即使在高流量环境下也能保持稳定。
  • 模块化: 支持多种模块扩展,如安全、缓存、负载均衡等。
  • 轻量级: 占用资源少,易于部署和维护。
  • 简单易用: 配置语法简洁,易于上手。

三、Nginx 安装

3.1 Windows 安装

  1. 从 Nginx 官网下载 Windows 版本的压缩包。
  2. 解压压缩包到目标目录。
  3. 运行 nginx.exe 启动 Nginx。

https://mmbiz.qpic.cn/mmbiz_png/ibEOIpiboaSgAJibhpdZq5yia2MH0Vy88OicN5vZufcoYUyjZRS3GctzHj4jiaibZNQlSDD0ZDPqYLs1icIwlndPh38zcg/640?wx_fmt=png&from=appmsg

3.2 Linux 安装

推荐使用包管理器安装 Nginx,以 CentOS 为例:

# 安装 Nginx
sudo yum install nginx
# 启动 Nginx
sudo systemctl start nginx

3.3 Mac 安装

推荐使用 Homebrew 包管理器安装 Nginx:

# 安装 Nginx
brew install nginx
# 启动 Nginx
brew services start nginx

四、Nginx 常用命令

4.1 测试配置文件

# 测试默认配置文件
nginx -t

# 测试指定配置文件
nginx -t -c /path/to/nginx.conf

4.2 启动、重启、关闭

# 启动 Nginx
./nginx

# 指定配置文件启动
./nginx -c /path/to/nginx.conf

# 重启 Nginx
nginx -s reload

# 快速关闭 Nginx
nginx -s stop

# 平稳关闭 Nginx
nginx -s quit

4.3 开机自启动

# 设置开机自启动 (Linux)
sudo systemctl enable nginx

# 取消开机自启动 (Linux)
sudo systemctl disable nginx

# 使用 brew services 管理 (Mac)
brew services start nginx
brew services stop nginx
brew services restart nginx

4.4 查看和停止 Nginx 进程

# 查看 Nginx 进程
ps -ef | grep nginx

# 关闭指定进程
kill -s QUIT <进程号>

# 快速停止 Nginx
kill -TERM <主进程号>

# 强制停止 Nginx
pkill -9 nginx

五、Nginx 配置文件

5.1 配置文件结构

Nginx 配置文件采用分层结构,主要包括以下几个部分:

  • 全局块 (main):  配置影响 Nginx 全局的指令,如 worker 进程数、pid 文件路径、错误日志等。
  • events 块: 配置 Nginx 网络连接相关的设置,如最大连接数、事件驱动模型等。
  • http 块:  包含 HTTP 相关的配置,如虚拟主机、代理、缓存、日志等。
  • server 块:  定义虚拟主机,每个 server 块对应一个域名或 IP 地址。
  • location 块:  定义请求的路由规则,以及针对不同 URL 的处理方式。

5.2 常用指令

5.2.1 全局块
  • user <用户名> <用户组>:  指定运行 Nginx worker 进程的用户和用户组。
  • worker_processes <数量>:  设置 worker 进程的数量,通常建议设置为 CPU 核心数。
  • error_log <路径> <级别>:  设置错误日志的路径和级别。
  • pid <路径>:  设置 Nginx 主进程 PID 文件的路径。
5.2.2 events 块
  • worker_connections <数量>:  设置每个 worker 进程的最大连接数。
  • use <模型>:  选择事件驱动模型,如 epoll、kqueue、select 等。
  • multi_accept <on|off>:  设置是否允许同时接收多个网络连接。
5.2.3 http 块
  • include <路径>:  包含其他配置文件。
  • default_type <MIME 类型>:  设置默认的 MIME 类型。
  • charset <字符集>:  设置默认的字符集。
  • sendfile <on|off>:  开启或关闭高效文件传输模式。
  • gzip <on|off>:  开启或关闭 gzip 压缩。
5.2.4 server 块
  • listen <端口>:  监听的端口号。
  • server_name <域名>:  虚拟主机的域名。
  • root <路径>:  设置网站根目录。
  • index <文件名>:  设置默认首页文件名。
5.2.5 location 块
  • location <匹配规则> {}:  定义匹配规则和处理方式。
  • proxy_pass <地址>:  反向代理到指定地址。
  • rewrite <规则> <地址>:  URL 重写规则。
  • return <状态码>:  返回指定状态码。

5.3 常用内置变量

Nginx 提供了许多内置变量,可以用于配置指令和日志格式中,以下列举一些常用的变量:

  • $args: 获取请求 URL 中的 query string 参数。
  • $arg_<参数名>: 获取指定名称的 query string 参数值。
  • $cookie_<cookie 名>: 获取指定名称的 cookie 值。
  • $http_<请求头名>: 获取指定名称的请求头值。
  • $host: 获取请求的域名或 IP 地址。
  • $uri: 获取请求的 URI,不包含 query string。
  • $request_uri: 获取完整的请求 URI,包含 query string。
  • $request_method: 获取请求方法,如 GET、POST 等。

六、Nginx 高级配置

6.1 反向代理

反向代理是 Nginx 最常用的功能之一,可以将客户端请求转发到后端服务器,并返回服务器的响应。

示例配置:

http {
  server {
    listen 80;
    server_name example.com;

    location / {
      proxy_pass http://backend_server;
    }
  }
}

常用指令:

  • proxy_pass: 设置反向代理的目标地址。
  • proxy_set_header: 设置转发到后端服务器的请求头。
  • proxy_redirect:  修改后端服务器返回的 Location 头信息。
  • proxy_cache:  开启反向代理缓存。

6.2 负载均衡

负载均衡可以将客户端请求分发到多个后端服务器,提高系统的可用性和性能。

示例配置:

http {
  upstream backend {
    server backend1.example.com weight=2;
    server backend2.example.com;
  }

  server {
    listen 80;
    server_name example.com;

    location / {
      proxy_pass http://backend;
    }
  }
}

常用指令:

  • upstream: 定义后端服务器组。
  • server:  定义后端服务器地址。
  • weight: 设置服务器权重。
  • ip_hash:  基于客户端 IP 地址进行负载均衡。
  • least_conn:  将请求转发到连接数最少的服务器。

6.3 静态资源缓存

Nginx 可以缓存静态资源,如图片、CSS、JavaScript 等,以减少带宽消耗和提高响应速度。

示例配置:

http {
  proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m max_size=1g;

  server {
    listen 80;
    server_name example.com;

    location ~* \.(gif|jpg|jpeg|png|css|js)$ {
      proxy_cache my_cache;
      proxy_pass http://backend_server;
    }
  }
}

常用指令:

  • proxy_cache_path:  设置缓存路径和参数。
  • proxy_cache:  启用缓存。
  • expires:  设置缓存过期时间。

6.4 HTTPS 配置

Nginx 可以配置 HTTPS 协议,为网站提供安全连接。

示例配置:

server {
  listen 443 ssl;
  server_name example.com;

  ssl_certificate /path/to/certificate.crt;
  ssl_certificate_key /path/to/private.key;

  location / {
    # ...
  }
}

常用指令:

  • listen 443 ssl:  监听 443 端口并启用 SSL。
  • ssl_certificate:  指定 SSL 证书文件路径。
  • ssl_certificate_key:  指定 SSL 私钥文件路径。

七、Nginx 性能优化

7.1 优化 worker 进程数

将 worker 进程数设置为 CPU 核心数可以提高 CPU 利用率。

7.2 调整缓冲区大小

根据实际情况调整缓冲区大小可以减少磁盘 I/O 操作。

7.3 启用 gzip 压缩

压缩静态资源可以减少网络传输量。

7.4 使用缓存

缓存静态资源和动态内容可以减少服务器负载。

7.5 优化日志级别

降低日志级别可以减少磁盘 I/O 操作。

八、Nginx 安全配置

8.1 限制请求速率

防止恶意流量攻击,可以通过设置限制请求速率来保护服务器。

8.2 使用 HTTPS

HTTPS 协议可以加密数据传输,提高网站安全性。

8.3 设置访问控制

可以通过设置 IP 白名单或黑名单来限制特定 IP 地址的访问。

九、Nginx 常见问题与解决方案

9.1 Nginx 无法启动

可能原因:

  • 配置文件错误:这是最常见的原因之一,可以使用 nginx -t 命令检查配置文件语法是否正确。
  • 端口冲突:检查 Nginx 监听的端口是否被其他程序占用。
  • 权限问题:确保 Nginx 进程有权限访问配置文件、日志文件以及网站目录。

解决方案:

  • 根据错误提示修改配置文件,并使用 nginx -t 命令验证配置是否正确。
  • 修改 Nginx 监听的端口,或关闭占用该端口的其他程序。
  • 使用 chown 命令修改文件或目录的属主和属组,或使用 chmod 命令修改文件或目录的权限。

9.2 403 Forbidden 错误

可能原因:

  • 权限问题:Nginx 进程没有权限访问网站目录或文件。
  • 索引文件缺失:网站目录下缺少默认索引文件,例如 index.html、index.php 等。
  • 目录浏览功能未启用:如果希望允许用户浏览目录,需要在配置文件中启用 autoindex on 指令。

解决方案:

  • 修改网站目录或文件的权限,确保 Nginx 进程有读取权限。
  • 在网站根目录下创建默认索引文件。
  • 在配置文件中添加 autoindex on 指令,启用目录浏览功能。

9.3 500 Internal Server Error 错误

可能原因:

  • 后端服务器故障:检查后端服务器是否正常运行。
  • PHP 代码错误:检查 PHP 代码是否存在语法错误或逻辑错误。
  • PHP 内存限制:如果 PHP 脚本需要处理大量数据,可能会超出 PHP 内存限制,导致 500 错误。

解决方案:

  • 检查后端服务器的运行状态,并尝试重启后端服务器。
  • 检查 PHP 错误日志,找到错误代码并修复。
  • 修改 PHP 配置文件 php.ini,增加 memory_limit 的值。

9.4  Nginx 高负载

可能原因:

  • 流量过大:网站访问量过大,超出 Nginx 服务器的处理能力。
  • 配置不当:Nginx 配置参数设置不合理,例如 worker 进程数过少、缓存设置不当等。
  • 资源瓶颈:服务器硬件资源不足,例如 CPU、内存、网络带宽等。

解决方案:

  • 优化 Nginx 配置,例如增加 worker 进程数、启用缓存、压缩数据传输等。
  • 升级服务器硬件配置,例如增加 CPU 核心数、内存容量、网络带宽等。
  • 使用负载均衡技术,将流量分发到多台服务器上。

9.5  Nginx 安全问题

可能原因:

  • 版本过低:旧版本的 Nginx 可能存在安全漏洞。
  • 配置不当:例如未禁用不必要的模块、未限制访问来源等。
  • 弱口令:使用弱口令容易被暴力破解。

解决方案:

  • 及时升级 Nginx 到最新版本。
  • 遵循安全配置建议,例如禁用不必要的模块、限制访问来源、设置访问控制等。
  • 使用强口令,并定期修改密码。

十、Nginx 模块

Nginx 的强大之处在于其模块化架构,允许开发者根据需要加载不同的模块来扩展功能。以下是几个常用的 Nginx 模块:

10.1 ngx_http_core_module

这是 Nginx 的核心模块,默认情况下已编译进 Nginx,提供了 HTTP 协议的基本功能,例如:

  • 处理 HTTP 请求和响应
  • 管理虚拟主机
  • 配置日志记录
  • 设置访问控制

10.2 ngx_http_access_module

该模块用于控制客户端对 Nginx 服务器的访问权限,例如:

  • 基于 IP 地址允许或拒绝访问
  • 基于用户名和密码进行身份验证

10.3 ngx_http_rewrite_module

Rewrite 模块提供了强大的 URL 重写功能,可以根据预设的规则修改请求的 URI,例如:

  • 实现 URL 跳转
  • 隐藏网站文件结构
  • SEO 友好化 URL

10.4 ngx_http_proxy_module

Proxy 模块是实现反向代理的核心模块,它允许 Nginx 将请求转发到后端服务器,并处理后端服务器的响应,例如:

  • 负载均衡
  • 缓存后端服务器的响应
  • 添加/修改请求头

10.5 ngx_http_fastcgi_module

FastCGI 模块用于连接 Nginx 与 FastCGI 进程,例如 PHP-FPM,处理动态内容,例如:

  • 转发请求到 FastCGI 进程
  • 配置 FastCGI 进程池

10.6 ngx_http_gzip_module

Gzip 模块用于压缩 HTTP 响应内容,减少网络传输量,提高网站访问速度。

10.7 ngx_http_ssl_module

SSL 模块用于配置 HTTPS 协议,实现网站的安全访问。

十一、Nginx 实战

11.1 搭建静态资源服务器

server {
    listen 80;
    server_name static.example.com;
    root /var/www/static;

    location / {
        index index.html;
    }
}

说明:

  • listen 80:监听 80 端口,即 HTTP 默认端口。
  • server_name static.example.com:设置虚拟主机域名。
  • root /var/www/static:设置网站根目录。
  • index index.html:设置默认索引文件为 index.html。

11.2 配置反向代理

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

server {
    listen 80;
    server_name www.example.com;

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

说明:

  • upstream backend:定义一个名为 backend 的后端服务器组。
  • server backend1.example.com weight=5:将 backend1.example.com 添加到后端服务器组,并设置权重为 5。
  • server backend2.example.com:将 backend2.example.com 添加到后端服务器组,默认权重为 1。
  • proxy_pass http://backend:将请求转发到名为 backend 的后端服务器组。
  • proxy_set_header Host $host:设置请求头 Host 为客户端请求的域名。
  • proxy_set_header X-Real-IP $remote_addr:设置请求头 X-Real-IP 为客户端的真实 IP 地址。

11.3 配置 HTTPS

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

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/private.key;
    location / {
        root /var/www/html;
        index index.html;
    }
}

说明:

  • listen 443 ssl:监听 443 端口,即 HTTPS 默认端口,并启用 SSL。
  • ssl_certificate /path/to/certificate.crt:设置 SSL 证书路径。
  • ssl_certificate_key /path/to/private.key:设置 SSL 私钥路径。

十二、总结

本文档提供了一个全面的 Nginx 配置指南,涵盖了从基础概念到高级应用的各个方面。希望这份指南能够帮助您更好地理解和使用 Nginx,构建高性能、安全可靠的 Web 服务。

附录:

  • Nginx 官方网站:http://nginx.org/
  • Nginx 文档:http://nginx.org/en/docs/
  • Nginx 模块:http://nginx.org/en/docs/http/modules/