Nginx 配置指南

私有运维 2024-09-09 15:07:02 阅读 85


一、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 为例:

<code># 安装 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/



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。