一、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 安装
从 Nginx 官网下载 Windows 版本的压缩包。

解压压缩包到目标目录。

运行 nginx.exe 启动 Nginx。

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/

刚学java菜鸡,永劫无间蚀月,王者荣耀王者,金铲铲小铂金,第五人格菜鸡,原神开服玩家,星穹铁道菜鸡,崩坏的菜鸡,闪耀暖暖,和平精英,LOL,CSGO,以及三A大作收集者等等。。。