Nginx 配置指南


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

    图片

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/

1. Nginx简介 1.1. 什么是nginx 1.2. Nginx的优点 1.3. 哪里使用到nginx 1.4. Nginx和Apache的区别 2. 安装Nginx服务器 2.1. 在windows上安装 2.2. 在Linux上安装 2.2.1. 写在前面 2.2.2. 准备使用yum安装nginx的运行环境 2.2.3. 安装pcre 2.2.4. 安装zlib库 2.2.5. 安装nginx 2.2.6. 控制nginx 2.2.7. nginx安装服务 3. Nginx配置文件详解 3.1. Nginx的主配置文件概述 3.1.1. 认识配置文件 3.1.2. nginx配置文件结构 3.1.3. nginx的全局配置 3.2. events配置 3.3. http的配置 3.4. nginx重要指令之location 4. nginx中的rewrite 4.1. 什么是rewrite 4.2. rewrite的命令的作用域和优先级 4.3. if指令 4.3.1. if指令的语法 4.3.2. if指令中使用的逻辑运算符 4.3.3. If指令中可以使用的变量 4.3.4. if指令实例 4.4. rewrite指令 4.4.1. rewrite指令语法 4.4.2. flag标记 4.4.3. set指令 4.4.4. return指令 4.4.5. rewrite实例 5. nginx的虚拟主机 5.1. 什么是nginx的虚拟主机 5.2. 标准的虚拟主机配置 5.3. 规划虚拟主机的配置文件 6. 动静分离 7. nginx的反向代理 7.1. 什么是反向代理 7.2. 明确两个概念 7.3. 特点 7.4. 反向代理的配置 7.5. 可以将代理配置单独放在一个配置文件中 8. nginx的负载均衡(自学) 8.1. 什么是负载均衡 8.2. 负载均衡的优点 8.3. 负载均衡的分配策略 8.4. 负载均衡配置 9. 安装PHP 10. PHP-FPM 10.1. 什么是PHP-FPM 10.2. 为什么要是使用PHP-FPM 10.3. 安装并且启动PHP-FPM 10.3.1. 安装 10.3.2. fpm的配置 10.3.3. 启动和停止 10.3.4. 自启动php-fpm 10.3.5. 检查php-fpm是否启动 10.4. nginx使用php-fpm处理php
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

私有运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值