NGINX高手的终极指南

Nginx 简介

Nginx 是一款强大而高效的 Web 服务器,广泛应用于现代 Web 基础设施。与使用多线程架构的传统 Web 服务器不同,Nginx 采用非线程、事件驱动的架构。这种设计允许 Nginx 同时处理更多连接,非常适合高流量网站。

除了提供静态网页之外,Nginx 还功能多样,可以配置为执行各种角色,包括负载平衡、HTTP 缓存和充当反向代理。这些功能使其成为许多复杂 Web 架构的基石。

正向代理与反向代理

为了理解 Nginx 作为反向代理的作用,首先区分正向代理和反向代理会很有帮助。

  • 正向代理:在传统的 HTTP 连接中,客户端直接向服务器发送请求。但是,使用正向代理(例如 VPN),客户端会将请求发送到代理,然后代理会将其转发到服务器。服务器不知道原始客户端;它只与代理交互。此设置对于隐私和绕过地理限制很有用。

 

  • 反向代理:相反,反向代理位于客户端和多个服务器之间。客户端将请求发送到反向代理,然后反向代理决定哪个服务器应该处理该请求。客户端不知道哪个特定的服务器处理该请求。Nginx 因其效率和灵活性而成为反向代理的热门选择。

例如:

  • /admin请求可以被路由到服务器 1。
  • /settings请求可以被路由到服务器 2。

Nginx 可以有效地处理这些类型的路由,确保正确的服务器根据预定义的规则处理每个请求。

Nginx 的优点

Nginx 提供了几个关键优势,使其成为许多 Web 项目的首选:

  1. 高并发:能够处理10,000+个并发请求。
  2. HTTP 缓存:可以缓存 HTTP 请求,减少服务器负载并提高响应时间。
  3. 反向代理:充当反向代理,将客户端请求路由到适当的服务器。
  4. 负载平衡:在多台服务器之间分配传入的请求以平衡负载。
  5. API 网关:可以充当 API 网关,管理和路由 API 请求。
  6. 静态文件服务:有效地提供和缓存图像和视频等静态文件。
  7. SSL 终止:处理 SSL 证书,为用户提供安全连接。

安装和设置Nginx

  1. 使用Docker:

在本节中,我们将介绍使用 Docker 安装和设置 Nginx、进行配置以及设置示例项目的步骤。

步骤1:使用Docker安装Nginx

要在 Docker 容器中安装 Nginx,请按照以下步骤操作:

docker run -it -p 8080:80 ubuntup

此命令启动一个 Ubuntu 容器并将主机上的端口 8080 映射到容器中的端口 80。

接下来,更新软件包列表并安装 Nginx:

apt-get update
apt-get install nginx

 您可以使用以下方法验证安装:

nginx -v

2. 在主机上: 

sudo apt update
sudo apt install nginx

安装后,你可以使用以下命令启动 Nginx:

sudo systemctl start nginx 

要检查状态:

sudo systemctl status nginx 

Nginx 配置基础

Nginx 的主要配置文件是nginx.conf。它通常位于/etc/nginx/nginx.conf。让我们分解一个简单的 Nginx 配置文件:

worker_processes auto;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    }
}

让我们了解这个文件的每个部分:

worker_processes auto;

此指令告诉 Nginx 启动多少个工作进程。工作进程负责处理请求。将其设置为auto允许 Nginx 根据您的 CPU 核心自动确定最佳数量。

events { worker_connections 1024; }

events块设置连接处理设置。

  • worker_connections 1024;意味着每个 worker 进程可以同时处理 1024 个连接。如果你有 4 个 worker 进程,那么你可以同时处理 4096 个连接。

http { ... }

  • http块是您定义处理 HTTP 请求的设置的地方。您的大多数 Web 服务器配置都驻留在此。

include mime.types;

  • 该指令告诉 Nginx 包含一个名为 的文件mime.types,该文件将文件扩展名映射到 MIME 类型。MIME 类型告诉浏览器如何处理不同类型的文件(例如,.htmltext/html、.jpgimage/jpeg)。

default_type application/octet-stream;

  • 如果 Nginx 无法确定文件的 MIME 类型,它将使用application/octet-stream后备方案,通常意味着“下载此文件”。

sendfile on;

  • 该指令启用sendfile系统调用,允许 Nginx 绕过在缓冲区之间复制数据的需要,更有效地提供文件服务。

keepalive_timeout 65;

  • 此设置决定了 Nginx 关闭连接之前,连接在空闲状态下应保持打开状态的时间(以秒为单位)。默认值为 65 秒。

现在让我们讨论一下文件中最重要的部分服务器块:

 server {
listen 80;
server_name localhost;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}

server { ... }

  • server块定义虚拟服务器的配置,即处理特定域或 IP 地址请求的服务器。

listen 80;

  • 这告诉 Nginx 在端口 80 上监听 HTTP 请求。端口 80 是 HTTP 的默认端口。

server_name localhost;

  • server_name指令指定此服务器块将响应的域名。localhost通常用于本地测试,但在实际情况下,您可以将其替换为您的域名(例如example.com)。

location / { ... }

  • location块用于定义如何响应不同的请求 URI。这/意味着该块将处理对根 URL(例如http://localhost/)的请求。

root /usr/share/nginx/html;

  • root指令指定 Nginx 应在哪个目录中查找要提供的文件。这里,它设置为/usr/share/nginx/html,这是 Nginx 存储 HTML 文件的默认目录。

index index.html index.htm;

  • index指令列出了 Nginx 在请求目录时应查找的文件。例如,如果用户导航到,Nginx 将尝试从根目录http://localhost/提供index.html或服务。index.htm

配置 Nginx

Nginx 安装完成后,会创建一个目录/etc/nginx/,其中最重要的文件是nginx.conf,它包含了 Nginx 的主要配置。

首先,让我们备份原文nginx.conf

mv /etc/nginx/nginx.conf /etc/nginx/nginx-backup.conf

nginx.conf 可以使用文本编辑器创建一个新文件,例如vim

vim /etc/nginx/nginx.conf

在此文件中,您将定义 Nginx 配置。这是一个简单示例:

events {
}

http {
server {
listen 80; listen 80 ;
server_name _ ; # 这意味着它将响应任何服务器名称
location / {
return 200 "Hello from Nginx Conf File" ;
}
}

编辑配置后,您需要重新加载 Nginx 以应用更改:

nginx -s reload 

访问网站:打开浏览器并转到http://localhost:8080。您应该看到“欢迎使用 Nginx”的消息。

让我们了解 NGINX 的一些最常用的块:

Nginx 使用各种块来构造其配置。最常见的三种是serverlocationupstream块。

Server

  • 目的:定义特定域或 IP 地址的配置。
  • 示例:上面的基本配置中已经涵盖。

Location

  • 目的:定义如何响应特定的请求URI。
  • 例子:

location /images/ {
        root /var/www/images;

 Upstream

  • 目的:定义一组用于负载平衡的后端服务器。
  • 例子:

upstream backend {
server backend1.example.com;example.com;
server backend2.example.com;

使用 Nginx 进行反向代理

反向代理位于客户端和后端服务器之间,将客户端请求转发到后端,并将后端的响应发送回客户端。以下是将 Nginx 配置为反向代理的方法:

server {
listen 80;
server_name example.com;

location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;$host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

  • proxy_pass http://backend_server;:这告诉 Nginx 将请求转发到后端服务器。
  • proxy_set_header Host $host;:确保正确的Host标头传递到后端。
  • proxy_set_header X-Real-IP $remote_addr;:将客户端的真实IP地址传递给后端。
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:将客户端的IP添加到X-Forwarded-ForHeader中,以便后端识别原始客户端IP。

使用 Nginx 进行负载平衡

Nginx 可以将流量分配到多个后端服务器之间,以平衡负载。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
    }
}
  • upstream backend { ... }:定义一组后端服务器。
  • server backend1.example.com;:将服务器添加到后端组。
  • proxy_pass http://backend;:将请求转发到后端组中的一台服务器。

使用 SSL/TLS 保护 Nginx

SSL/TLS 加密服务器和客户端之间的数据。以下是在 Nginx 中配置 SSL 的方法:

server {
    listen 443 ssl;listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    location / {
        root /var/www/html;
        index index.html;
    }
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}
  • listen 443 ssl;:告诉 Nginx 在启用 SSL 的情况下监听端口 443(HTTPS 的默认端口)。
  • ssl_certificatessl_certificate_key指定您的 SSL 证书和私钥的路径。
  • return 301 https://$host$request_uri;:将所有 HTTP 请求重定向到 HTTPS。

高级 Nginx 配置

缓存

Nginx 可以缓存来自后端的响应,以加快后续请求的响应时间。

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

  • proxy_cache_path指定缓存的目录和设置。
  • levels=1:2定义缓存的目录结构。
  • keys_zone=my_cache:10mmy_cache创建一个名为10MB内存的共享内存区域。
  • max_size=1g将缓存大小限制为 1GB。
  • inactive=60m如果 60 分钟内没有访问过缓存项,则将其从缓存中删除。

监控和日志记录

Nginx 记录所有请求和错误,这对于故障排除和监控至关重要。

log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$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;

  • log_format main ...:定义一个名为的自定义日志格式main
  • access_log /var/log/nginx/access.log main;:使用日志格式将访问日志存储到指定的文件中main

常见错误

  • 403 Forbidden:通常意味着 Nginx 无法访问请求的文件。
  • 500 内部服务器错误:通常表示后端服务器出现问题或 Nginx 配置错误。

结论

Nginx 是一款功能强大且用途广泛的 Web 服务器,已成为现代 Web 基础架构的基石。它最初是 C10K 问题的解决方案(处理数千个并发连接),现已发展成为一种多功能工具,可以充当反向代理、负载平衡器甚至缓存服务器。它的轻量级架构加上高性能和可靠性,使 Nginx 成为世界上许多最大、流量最大的网站的首选。