一、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/