Nginx Web 服务器入门教程 – wiki基地


Nginx Web 服务器入门教程:从零开始掌握高性能之道

在当今互联网高速发展的时代,Web 服务器作为连接用户与网站应用的核心组件,其性能和稳定性至关重要。在众多Web服务器软件中,Nginx(发音为 “engine-x”)凭借其高性能、高并发处理能力和低内存消耗脱颖而出,成为了许多高流量网站和应用的首选。无论是静态文件服务、反向代理、负载均衡还是API网关,Nginx都能胜任,并展现出卓越的表现。

如果你是Web开发新手,或是希望了解如何搭建和配置一个高性能的Web服务器,那么学习Nginx将是非常有价值的。本教程旨在帮助你从零开始,逐步掌握Nginx的基础知识、安装、配置和常用功能。

第一章:初识 Nginx – 为什么选择它?

1.1 什么是 Nginx?

Nginx 是一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。最初由俄罗斯的 Igor Sysoev 开发,并于2004年发布。它的设计初衷是为了解决 C10k 问题,即单台服务器如何同时处理数万个并发连接。

传统的Web服务器(如 Apache 的 prefork 模型)通常采用多进程或多线程模型,每个连接对应一个进程或线程。当并发连接数量巨大时,创建和管理大量进程/线程会消耗大量系统资源,导致性能下降。

而 Nginx 采用了事件驱动(Event-driven)的异步非阻塞架构。它使用少量的进程来处理大量的并发连接。当一个连接建立后,Nginx 不会为其分配独立的进程或线程,而是将其注册到事件循环中。当该连接有数据可读写时,事件循环会通知 Nginx 工作进程进行处理。这种模型使得 Nginx 在处理高并发连接时表现出色,资源占用极低。

1.2 Nginx 的主要特点与优势

  • 高性能和高并发处理能力: 这是 Nginx 最突出的优势。其事件驱动架构使其能轻松处理数万甚至数十万的并发连接,非常适合高流量网站。
  • 低内存消耗: 相较于其他一些Web服务器,Nginx 在处理相同负载时通常占用更少的内存。
  • 高度模块化: Nginx 的功能由模块提供,可以根据需要编译和加载不同的模块,保持核心的精简和高效。
  • 强大的反向代理功能: Nginx 可以作为反向代理服务器,将客户端请求转发到后端的多台应用服务器上,有效隐藏后端服务,增加安全性。
  • 灵活的负载均衡: Nginx 支持多种负载均衡算法(如轮询、IP Hash、最少连接等),可以根据后端服务器的负载情况智能分配请求。
  • 静态文件服务优化: Nginx 在处理静态文件方面非常高效,可以直接快速响应静态资源请求。
  • 支持 HTTP/2 和 WebSocket: 适应现代Web协议和技术。
  • 易于配置: Nginx 的配置文件结构清晰,易于理解和编写(尽管初学者可能需要适应其语法)。

1.3 Nginx 的常见应用场景

  • 静态资源服务器: 直接托管 HTML、CSS、JavaScript、图片等静态文件。
  • 反向代理服务器: 将客户端请求转发给后端的应用服务器(如运行 Node.js, Python Django/Flask, Java Spring Boot 等的服务器),Nginx 负责接收外部请求,处理静态文件、SSL加密、压缩等,然后将动态请求转发给后端。
  • 负载均衡器: 将流量分发到多台后端服务器,提高可用性和扩展性。
  • API 网关: 作为API请求的入口点,进行认证、限流、监控、路由等。
  • 缓存服务器: 缓存后端应用的响应,减少后端压力,加快响应速度。
  • SSL 终止: 在 Nginx 层面处理 SSL/TLS 加密和解密,减轻后端服务器的负担。

第二章:安装 Nginx

在开始配置之前,你需要先在你的服务器或本地机器上安装 Nginx。这里我们以 Linux 系统(基于 Debian/Ubuntu 的发行版)为例进行说明,这是 Nginx 最常见的部署环境。对于其他系统,安装方法略有不同,但核心概念类似。

2.1 在 Ubuntu/Debian 上安装

打开终端,运行以下命令:

  1. 更新包列表:
    bash
    sudo apt update
  2. 安装 Nginx:
    bash
    sudo apt install nginx

安装过程会提示你确认,输入 Y 并回车即可。

安装完成后,Nginx 服务通常会自动启动。你可以通过以下命令检查其状态:

bash
sudo systemctl status nginx

如果看到 active (running) 字样,说明 Nginx 已经成功运行。

2.2 防火墙设置 (ufw)

如果你的服务器开启了防火墙(例如 Ubuntu 默认的 ufw),你需要允许 HTTP (80) 和 HTTPS (443) 流量通过。

Nginx 在安装时会注册其配置文件到 ufw。你可以查看可用的应用配置文件:

bash
sudo ufw app list

通常会看到 Nginx Full, Nginx HTTP, Nginx HTTPS 选项。

  • Nginx HTTP: 只允许端口 80 (HTTP)。
  • Nginx HTTPS: 只允许端口 443 (HTTPS)。
  • Nginx Full: 允许端口 80 和 443。

选择 Nginx Full 以便后续配置 HTTPS:

bash
sudo ufw allow 'Nginx Full'

然后重新加载或启用防火墙(如果之前是禁用的):

bash
sudo ufw enable

最后检查防火墙状态:

bash
sudo ufw status

确认 80 和 443 端口已被允许。

2.3 测试安装

安装成功并确保防火墙允许流量后,你可以在浏览器中访问服务器的 IP 地址或域名。如果看到 Nginx 默认的欢迎页面(通常显示 “Welcome to nginx!”),恭喜你,Nginx 已经成功安装并运行了!

第三章:Nginx 配置基础

Nginx 的核心在于其配置文件。理解配置文件的结构和语法是掌握 Nginx 的关键。

3.1 配置文件位置

在大多数 Linux 系统上,Nginx 的主配置文件位于 /etc/nginx/nginx.conf

为了更好地组织配置,Nginx 采用了模块化的配置方式。nginx.conf 文件通常会包含一些其他目录中的配置文件。常见的结构如下:

  • /etc/nginx/nginx.conf: 主配置文件,包含全局设置和引入其他配置文件。
  • /etc/nginx/conf.d/*.conf: 这个目录通常用于存放独立的配置片段,例如为不同的虚拟主机或应用配置的独立文件。Nginx 主配置文件中通常有 include /etc/nginx/conf.d/*.conf; 这样的指令来加载这些文件。
  • /etc/nginx/sites-available/: 这个目录存放所有可用的虚拟主机配置文件(每个文件通常对应一个网站或应用)。
  • /etc/nginx/sites-enabled/: 这个目录存放当前已启用的虚拟主机配置文件的软链接。Nginx 主配置文件通过 include /etc/nginx/sites-enabled/*; 来加载这些配置文件。启用或禁用一个虚拟主机通常是通过在 sites-enabled 目录中创建或删除到 sites-available 中文件的软链接来完成。

重要提示: 在修改任何 Nginx 配置文件之前,强烈建议备份原始文件。

3.2 配置文件的基本语法

  • 配置文件由指令(Directives)块(Blocks)组成。
  • 每个指令以指令名称开头,后面跟着一个或多个参数,最后以分号 ; 结束。
    nginx
    directive_name parameter1 parameter2;
  • 块是一组相关的指令,用大括号 {} 包围。块可以嵌套。
    nginx
    block_name {
    directive1 parameter;
    directive2 parameter parameter;
    # ... more directives
    }
  • 注释以 # 开头,直到行尾。
    nginx
    # This is a comment

3.3 配置文件的主要上下文(Contexts)

Nginx 配置文件有几个主要的上下文,指令只能在特定的上下文中有效:

  • main (或 Global) 上下文: 这是配置文件的最顶层,影响所有其他上下文。例如,设置 Nginx 工作进程数、用户和组等。
    “`nginx
    user www-data; # 工作进程的用户和组
    worker_processes auto; # 工作进程数量,auto 表示自动检测
    error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
    pid /var/run/nginx.pid; # PID 文件路径

    events {
    # … events block directives
    }

    http {
    # … http block directives
    }
    * **`events` 上下文:** 配置影响网络连接处理的全局属性,如每个工作进程的最大连接数、连接处理方法等。nginx
    events {
    worker_connections 1024; # 每个工作进程的最大连接数
    # multi_accept on; # 是否一次接受多个连接
    # use epoll; # 使用哪个事件模型 (Linux 上 epoll 是默认且推荐的)
    }
    * **`http` 上下文:** 这是配置 HTTP 服务器的主要上下文,包含所有 HTTP 相关的配置,如 MIME 类型、日志格式、TCP优化设置以及定义一个或多个 `server` 块。nginx
    http {
    include mime.types; # 包含 MIME 类型映射文件
    default_type application/octet-stream; # 默认 MIME 类型

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'; # 日志格式
    
    access_log /var/log/nginx/access.log main; # 访问日志路径和格式
    
    sendfile on; # 启用 sendfile 提高静态文件传输效率
    #tcp_nopush on; # 启用 tcp_nopush
    #tcp_nodelay on; # 启用 tcp_nodelay
    
    keepalive_timeout 65; # keep-alive 超时时间
    
    gzip on; # 启用 gzip 压缩
    
    # Include configuration files for virtual hosts
    include /etc/nginx/conf.d/*.conf;
    # or typically include from sites-enabled
    include /etc/nginx/sites-enabled/*;
    
    # Define one or more server blocks here or in included files
    server {
        # ... server block directives
    }
    
    server {
        # ... another server block
    }
    

    }
    * **`server` 上下文:** 定义一个虚拟主机。基于监听的端口 (`listen`) 和服务器名称 (`server_name`) 来区分不同的虚拟主机。每个 `server` 块可以看作是一个独立的网站配置。nginx
    server {
    listen 80; # 监听 80 端口
    server_name example.com www.example.com; # 绑定的域名

    # ... location blocks and other directives specific to this server
    

    }
    * **`location` 上下文:** 定义如何处理特定 URL 路径的请求。嵌套在 `server` 块中。这是 Nginx 进行请求路由和处理的核心。nginx
    server {
    listen 80;
    server_name example.com;

    location / {
        # ... directives for requests to /
    }
    
    location /images/ {
        # ... directives for requests to /images/
    }
    
    location ~ \.php$ {
        # ... directives for requests ending in .php
    }
    

    }
    ``
    * 还有
    upstream` 上下文用于配置后端服务器组(负载均衡时使用),以及其他模块特定的上下文。

第四章:配置 Nginx 服务静态文件

为网站提供静态文件是 Nginx 最基本也是最常用的功能之一。

假设你的网站文件(HTML, CSS, JS, 图片等)存放在 /var/www/mywebsite/ 目录下。你可以创建一个新的配置文件,例如 /etc/nginx/sites-available/mywebsite.conf,内容如下:

“`nginx

/etc/nginx/sites-available/mywebsite.conf

server {
listen 80; # 监听 HTTP 默认端口 80

# 定义服务器名称,根据你的域名修改
# 可以使用多个域名,用空格分隔
server_name mywebsite.com www.mywebsite.com;

# 定义网站根目录
# 当请求到达且没有匹配到更具体的 location 时,Nginx 会在这个目录下查找文件
root /var/www/mywebsite;

# 定义默认首页文件
# 当请求的是一个目录(如 / 或 /docs/)时,Nginx 会按顺序查找这些文件
index index.html index.htm;

# location 块定义如何处理特定的 URL 路径
location / {
    # try_files 会按顺序尝试查找文件
    # $uri 表示当前请求的 URI,例如 /index.html
    # $uri/ 表示当前请求的 URI 作为一个目录,尝试查找 index 文件
    # =404 表示如果前两者都没找到,则返回 404 错误
    try_files $uri $uri/ =404;
}

# 可以根据需要添加其他 location 块,例如处理特定类型的资源
# location /images/ {
#     # 这里可以添加图片相关的配置,例如过期时间等
# }

# 定义访问日志文件
access_log /var/log/nginx/mywebsite_access.log;

# 定义错误日志文件
error_log /var/log/nginx/mywebsite_error.log warn;

}
“`

创建这个文件后,你需要将其链接到 sites-enabled 目录来启用它:

bash
sudo ln -s /etc/nginx/sites-available/mywebsite.conf /etc/nginx/sites-enabled/

为了避免冲突,通常需要删除或禁用 Nginx 默认的配置文件:

bash
sudo rm /etc/nginx/sites-enabled/default

在应用新的配置之前,务必测试配置文件的语法是否正确:

bash
sudo nginx -t

如果输出显示 syntax is oktest is successful,说明配置文件没有语法错误。

最后,重新加载 Nginx 服务以应用新的配置:

bash
sudo systemctl reload nginx

现在,当你访问 mywebsite.com (如果已配置 DNS 指向你的服务器) 或服务器 IP 地址时,Nginx 就会从 /var/www/mywebsite/ 目录提供文件。

第五章:理解 server 块与虚拟主机

server 块是 Nginx 中定义虚拟主机的单元。通过监听不同的 IP 地址、端口或根据 server_name 来区分不同的 server 块,从而实现在同一台服务器上托管多个网站或应用。

  • listen 指令: 指定 server 块监听的 IP 地址和端口。
    • listen 80; 监听所有可用 IP 的 80 端口。
    • listen 192.168.1.10:80; 监听特定 IP 的 80 端口。
    • listen 443 ssl; 监听 443 端口,并启用 SSL。
  • server_name 指令: 指定这个 server 块要响应的域名。
    • server_name example.com www.example.com; 响应 example.comwww.example.com 的请求。
    • server_name *.example.com; 使用通配符,响应所有以 .example.com 结尾的子域名请求。
    • server_name .example.com; 同时响应 example.com 和所有子域名请求(注意前面的点)。
    • server_name _; 通常用作默认的 server 块(当没有其他 server_name 匹配时)。在一个 listen 端口下,如果没有指定哪个 server 是默认的,则第一个定义的 server 块将成为默认块。

选择 server 块的顺序: 当一个请求到达时,Nginx 会按照以下顺序查找最匹配的 server 块:
1. 根据 IP 和端口找到匹配的 server 块集合。
2. 在集合中,优先匹配使用精确 server_name 的块。
3. 然后匹配使用前缀通配符 (*.example.com) 的块,选择最长的匹配。
4. 接着匹配使用后缀通配符 (mail.*) 的块,选择最长的匹配。
5. 最后匹配使用正则表达式的 server_name 的块,按照在配置文件中出现的顺序选择第一个匹配的。
6. 如果都没有匹配,则使用该 IP 和端口对应的默认 server 块。

通过合理配置 listenserver_name,你可以灵活地管理多个网站。

第六章:理解 location

location 块是 Nginx 中最强大和最复杂的配置单元之一,它定义了如何根据请求的 URI (Uniform Resource Identifier) 来处理请求。location 块嵌套在 server 块内部。

location 指令的基本语法:

nginx
location [modifier] uri {
...
}

  • uri: 要匹配的 URI。
  • modifier: 控制 Nginx 如何解释 uri 并进行匹配。常见的修饰符有:
    • (无修饰符): 前缀匹配。查找以指定 uri 开头的请求路径。这是最常见的匹配方式。
      nginx
      location /images/ {
      # 匹配所有以 /images/ 开头的请求
      }
    • =: 精确匹配。只有当请求的 URI 完全等于指定的 uri 时才匹配。如果找到精确匹配,则立即停止搜索,使用这个 location 块。
      nginx
      location = /login {
      # 只匹配 /login 这个 URI
      }
    • ~: 正则表达式匹配(区分大小写)。
      nginx
      location ~ \.php$ {
      # 匹配所有以 .php 结尾的请求
      }
    • ~*: 正则表达式匹配(不区分大小写)。
      nginx
      location ~* \.(jpg|jpeg|png|gif)$ {
      # 匹配所有以 .jpg, .jpeg, .png, .gif 结尾的请求,不区分大小写
      }
    • ^~: 前缀匹配,但如果匹配成功,则停止搜索其他更长的或正则表达式的 location。这比普通的前缀匹配优先级高。
      nginx
      location ^~ /static/ {
      # 如果请求路径以 /static/ 开头,就使用这个块,不再继续匹配正则表达式 location
      }

location 块的匹配顺序(复杂但重要):

  1. 精确匹配 (=): 首先尝试所有精确匹配。如果找到一个匹配项,立即使用它并停止处理。
  2. 前缀匹配 (^~): 扫描所有以 ^~ 开头的前缀匹配。选择匹配度最高(最长路径)的一个。如果找到,使用它并停止处理。
  3. 普通前缀匹配 (无修饰符): 扫描所有普通前缀匹配。选择匹配度最高(最长路径)的一个,但暂时不使用它,而是记住它。
  4. 正则表达式匹配 (~~*): 按照它们在配置文件中出现的顺序扫描所有正则表达式匹配。一旦找到第一个匹配项,就使用它并停止处理。
  5. 使用最长的前缀匹配: 如果步骤 4 没有找到任何匹配项,则使用步骤 3 中记住的最长的前缀匹配。

理解这个顺序对于正确配置 Nginx 的路由至关重要。通常,你会有一个处理根路径 / 的前缀匹配,以及一些用于处理特定类型文件或路径的更具体的 location 块。

try_files 指令:

try_fileslocation 块中非常有用的指令,用于在指定路径下按顺序查找文件或目录,如果找到则发送给客户端;如果都没找到,则执行最后一个参数指定的动作(通常是返回错误码或内部重定向到另一个 location)。

“`nginx
location / {
# 尝试查找请求的 URI 对应的文件,例如请求 /about.html 则查找 /var/www/html/about.html
# 如果没找到,尝试查找 URI 对应的目录下的 index 文件,例如请求 /blog/ 尝试查找 /var/www/html/blog/index.html
# 如果都没找到,内部重定向到 /index.php?uri=$uri&$args (这个 /index.php 需要由另一个 location 块处理,通常是 FastCGI)
try_files $uri $uri/ /index.php?$uri&$args;
}

location /static/ {
# 尝试查找文件,如果没找到,返回 404 错误
try_files $uri =404;
}
“`

第七章:常用指令详解

除了前面提到的 listen, server_name, root, index, location, try_files 之外,还有一些非常常用的指令:

  • alias path;: 在 location 块中使用。它不是在 root 基础上查找文件,而是将匹配到的 URI 部分替换为 path,然后查找文件。
    nginx
    location /static/ {
    alias /path/to/your/static/files/;
    # 当请求 /static/style.css 时,Nginx 会去 /path/to/your/static/files/style.css 查找
    }

    注意: alias 通常用于 location 块以斜杠 / 结尾的情况,且 alias 的路径也应该以斜杠 / 结尾,以避免一些潜在的问题。普通的前缀匹配 (location /some/) 通常更推荐使用 root
  • error_page code ... [=response]: 定义当出现指定错误码时显示的页面。
    “`nginx
    server {
    # …
    error_page 404 /404.html; # 404 错误时显示 /404.html 页面
    error_page 500 502 503 504 /50x.html; # 5xx 错误时显示 /50x.html 页面

    location = /404.html {
        root /usr/share/nginx/html; # 指定错误页面的根目录
        internal; # internal 指令很重要,它表示这个 location 只能由 Nginx 内部重定向访问,防止外部直接访问错误页面文件
    }
    
    location = /50x.html {
        root /usr/share/nginx/html;
        internal;
    }
    

    }
    * **`rewrite regex replacement [flag];`**: 使用正则表达式重写 URL。功能强大但可能比较复杂,且在某些简单场景下可以用 `try_files` 或 `return` 替代,后者性能通常更好。nginx
    server {
    # …
    location /old-path/ {
    rewrite ^/old-path/(.*)$ /new-path/$1 permanent; # 将 /old-path/… 重写为 /new-path/… 并返回 301 永久重定向
    }
    }
    `flag` 常用的有 `last` (在当前 server 或 location 中继续查找匹配的 location 进行处理) 和 `permanent` (返回 301 永久重定向)。
    * **`return code [text];`**: 直接返回指定的 HTTP 状态码和可选的响应体。比 `rewrite` 更简单高效,常用于重定向或返回错误。
    nginx
    server {
    # …
    location /deprecated-path {
    return 301 /new-path; # 将 /deprecated-path 永久重定向到 /new-path
    }

    location /forbidden {
        return 403 "Access Denied!"; # 返回 403 Forbidden 错误
    }
    

    }
    * **`proxy_pass url;`**: 在反向代理时使用,将请求转发到指定的后端服务器或 upstream 组。nginx
    location /api/ {
    proxy_pass http://localhost:8080; # 将 /api/ 开头的请求转发到本地 8080 端口
    }
    * **`add_header name value [always];`**: 添加自定义 HTTP 响应头。nginx
    location / {
    add_header X-Frame-Options “DENY”; # 防止点击劫持
    add_header Content-Security-Policy “default-src ‘self'”; # 基本 CSP 设置
    }
    “`

第八章:管理 Nginx 服务器

学会如何启动、停止、重新加载和测试 Nginx 是日常维护的基础。

  • 启动 Nginx:
    bash
    sudo systemctl start nginx
  • 停止 Nginx:
    bash
    sudo systemctl stop nginx
  • 重启 Nginx: (停止然后启动,连接会中断)
    bash
    sudo systemctl restart nginx
  • 重新加载配置: (平滑重启,加载新配置但不中断现有连接,推荐在修改配置后使用
    bash
    sudo systemctl reload nginx
  • 检查 Nginx 服务状态:
    bash
    sudo systemctl status nginx
  • 测试配置文件语法:强烈推荐在 reload 前执行
    bash
    sudo nginx -t
  • 查看 Nginx 版本信息:
    bash
    nginx -v
    # 或更详细的信息
    nginx -V

第九章:Nginx 作为反向代理

反向代理是 Nginx 最强大的功能之一。作为反向代理,Nginx 接收来自客户端的请求,然后将请求转发给后端的应用服务器(例如 Node.js、Python、Java 应用),并将后端服务器的响应返回给客户端。

为什么使用反向代理?

  • 安全性: 隐藏后端真实服务器的 IP 地址和端口。
  • 负载均衡: 将流量分发到多个后端服务器(下一章会讲)。
  • SSL 终止: 在 Nginx 层面处理 SSL 加密,减轻后端服务器负担。
  • 静态文件服务优化: Nginx 高效地处理静态文件,后端应用只处理动态请求。
  • 缓存: 缓存后端响应,提高速度。
  • 压缩: 对响应进行 gzip 压缩。
  • 集中日志和监控: 在 Nginx 层面统一处理日志。

配置示例:

假设你的 Node.js 应用运行在本地的 3000 端口。你想让 Nginx 在 80 端口监听请求,并将所有请求转发到 3000 端口。

创建一个新的配置文件,例如 /etc/nginx/sites-available/mywebapp.conf

“`nginx

/etc/nginx/sites-available/mywebapp.conf

server {
listen 80;
server_name mywebapp.com www.mywebapp.com; # 你的域名

location / {
    # 将所有请求转发到本地 3000 端口
    proxy_pass http://localhost:3000;

    # 转发一些重要的请求头,确保后端应用能获取客户端真实信息
    # X-Forwarded-For 记录客户端 IP 链
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # X-Real-IP 记录客户端真实 IP
    proxy_set_header X-Real-IP $remote_addr;
    # Host 转发原始请求的 Host 头
    proxy_set_header Host $host;
    # X-Forwarded-Proto 转发客户端使用的协议 (http 或 https)
    proxy_set_header X-Forwarded-Proto $scheme;

    # 开启 WebSocket 支持 (如果你的应用需要)
    # proxy_http_version 1.1;
    # proxy_set_header Upgrade $http_upgrade;
    # proxy_set_header Connection "upgrade";
}

# 可以为静态文件单独配置 location,让 Nginx 直接提供
# location /static/ {
#    root /path/to/your/webapp/static; # 假设静态文件在应用目录下的 static 子目录
#    expires 30d; # 设置静态文件缓存过期时间
# }

}
“`

启用配置,测试并重新加载 Nginx:

“`bash
sudo ln -s /etc/nginx/sites-available/mywebapp.conf /etc/nginx/sites-enabled/

如果之前有 default 配置,记得删除

sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
“`

现在,当用户访问 mywebapp.com 时,Nginx 会接收请求并将其转发给运行在 3000 端口的 Node.js 应用。

第十章:Nginx 作为负载均衡器

当你的应用流量增大或需要高可用性时,通常会部署多个后端服务器实例。Nginx 可以作为负载均衡器,将传入的请求分发到这些后端服务器组。

配置示例:

假设你有两个后端应用服务器,分别运行在 192.168.1.100:8000 和 192.168.1.101:8000。

“`nginx

在 http 块中定义一个 upstream 块

http {
# … 其他 http 配置

# 定义一个名为 backend_servers 的 upstream 组
upstream backend_servers {
    # 负载均衡算法,默认是轮询 (round-robin)
    # weight=N: 设置权重,权重越高分到的请求越多
    server 192.168.1.100:8000 weight=3;
    server 192.168.1.101:8000 weight=1;
    # 其他算法:
    # ip_hash; # 根据客户端 IP 的 hash 值分配,确保同一客户端总是请求同一服务器
    # least_conn; # 将请求发送给当前连接数最少的服务器
    # random; # 随机选择服务器
    # ... 还有一些更高级的算法和模块
}

server {
    listen 80;
    server_name myapp.com; # 你的应用域名

    location / {
        # 将请求转发给 upstream 组
        proxy_pass http://backend_servers;

        # 转发必要的请求头
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;

        # ... 其他 proxy 配置
    }
}

}
“`

将上述 server 块配置到 sites-available 中,创建软链接到 sites-enabled,测试并重新加载 Nginx。现在 Nginx 就会根据配置的负载均衡算法将请求分发到这两台后端服务器上。

第十一章:配置 SSL/TLS (HTTPS)

为网站启用 HTTPS 可以加密客户端和服务器之间的通信,增强安全性,并且是许多现代 Web 功能(如 HTTP/2)的要求。

配置 HTTPS 需要一个 SSL 证书和私钥。你可以从认证机构购买证书(如 Comodo, DigiCert),也可以使用免费的 Let’s Encrypt 证书,或者在测试环境中生成自签名证书。这里我们演示使用一个假设已有的证书文件。

假设你的 SSL 证书文件是 /etc/nginx/ssl/myapp.crt,私钥文件是 /etc/nginx/ssl/myapp.key

“`nginx
server {
listen 80;
server_name myapp.com www.myapp.com;

# 将 HTTP 请求重定向到 HTTPS
return 301 https://$host$request_uri;

}

server {
listen 443 ssl http2; # 监听 443 端口,启用 SSL 和 HTTP/2
server_name myapp.com www.myapp.com;

# 指定 SSL 证书和私钥文件路径
ssl_certificate /etc/nginx/ssl/myapp.crt;
ssl_certificate_key /etc/nginx/ssl/myapp.key;

# 推荐的 SSL 设置 (增强安全性)
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3; # 只允许安全的 TLS 版本
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS';
ssl_prefer_server_ciphers on;

# OCSP Stapling (可选,提高性能和隐私)
# ssl_stapling on;
# ssl_stapling_verify on;
# resolver 8.8.8.8 8.8.4.4 valid=300s; # Google DNS
# resolver_timeout 5s;

# Strict-Transport-Security 头 (可选,增强安全性,让浏览器强制使用 HTTPS)
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

location / {
    # 这里是你的反向代理或静态文件服务配置
    proxy_pass http://localhost:3000; # 示例:转发给后端应用
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto https; # 重要:告知后端是 HTTPS 连接

    # ... 其他 location 配置
}

}
“`

请将 ssl_certificatessl_certificate_key 的路径替换为你自己的证书文件路径。然后启用配置,测试并重新加载 Nginx。

第十二章:日志记录

Nginx 记录两种主要的日志:访问日志 (Access Log) 和错误日志 (Error Log)。日志对于监控服务器状态、排查问题和分析流量非常重要。

  • access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];: 定义访问日志的路径和格式。通常在 http, server, location 块中使用。
    • path: 日志文件路径。
    • format: 使用 log_format 指令预定义的格式名称(如前面 http 块示例中的 main)。
    • off: 关闭访问日志。
  • error_log path level;: 定义错误日志的路径和级别。可以在 main, http, server, location 块中使用。
    • path: 日志文件路径。
    • level: 错误级别,从低到高依次为 debug, info, notice, warn, error, crit, alert, emerg。只会记录指定级别及更高级别的错误。生产环境通常设置为 warnerror
  • log_format name string ...;: 在 http 块中定义自定义的日志格式。

默认情况下,访问日志通常在 /var/log/nginx/access.log,错误日志在 /var/log/nginx/error.log

示例(在 http 块中定义格式并在 server 块中使用):

“`nginx
http {
# …

log_format my_custom_format '$remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for" '
                            'Request Time: $request_time'; # 添加请求处理时间

server {
    listen 80;
    server_name example.com;

    access_log /var/log/nginx/example.com_access.log my_custom_format; # 使用自定义格式
    error_log /var/log/nginx/example.com_error.log error; # 只记录 error 级别及以上的错误

    # ... location blocks
}

}
“`

第十三章:入门后的进阶方向

本教程涵盖了 Nginx 的基础知识和最常见的应用场景。要更深入地掌握 Nginx,你可以继续学习:

  • 更高级的负载均衡算法和配置
  • Nginx 缓存(Proxy Cache)的配置和优化
  • 使用 Nginx 进行 Gzip 或 Brotli 压缩
  • 限制请求速率和连接数
  • 基本的安全加固,如防止 DDoS 攻击、限制 IP 访问等
  • Nginx 变量的使用
  • 编写复杂的 rewrite 规则
  • 使用 Nginx 处理 FastCGI (如 PHP)、uWSGI (如 Python) 等协议与后端应用通信
  • Lua 模块或其他第三方模块
  • Nginx Plus (商业版) 的更多功能

掌握 Nginx 的最佳方法是实践。尝试在虚拟机或云服务器上搭建环境,修改配置文件,观察 Nginx 的行为,并查阅官方文档。

结论

Nginx 是一款功能强大、性能卓越的 Web 服务器软件。通过本教程的学习,你应该对 Nginx 的基本概念、安装、配置结构、服务静态文件、虚拟主机、Location 匹配、常用指令、反向代理、负载均衡、SSL 配置以及日志记录有了初步的了解。

从处理简单的静态网站到作为复杂分布式系统的入口,Nginx 都能发挥关键作用。掌握 Nginx 不仅能帮助你更好地部署和管理 Web 应用,也能让你对 Web 服务器的工作原理有更深刻的认识。

继续探索,不断实践,你将能充分发挥 Nginx 的强大能力,为你的网站和应用提供高性能和高可靠性的服务。祝你学习顺利!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部