nginx配置web服务器|反向代理|负载均衡

文章目录

Nginx 配置文件通常位于 /etc/nginx/nginx.conf 或者 /usr/local/nginx/conf/nginx.conf,具体位置取决于你的系统和安装方式。配置文件是 Nginx 的核心,用于定义服务器如何运行以及如何处理请求。

http模块

nginx 复制代码
user nginx;
worker_processes auto;

error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections  1024;
}

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

    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;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  65;
    types_hash_max_size 2048;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/mime.types;
}

解释各个部分

  • user:定义运行 Nginx 进程的用户和组。

  • worker_processes:指定 Nginx 应该启动的工作进程数量。

  • error_log:定义错误日志的位置。

  • pid:定义 Nginx 进程 ID 文件的位置。

  • events:配置事件处理模型,如 worker_connections 设置每个工作进程可以同时打开的最大连接数。

  • http:这是 Nginx 配置的主要部分,包括全局设置、虚拟主机配置等。

  • include:用于包含其他配置文件。

  • log_formataccess_log:用于定义访问日志的格式和位置。

  • sendfile, tcp_nopush, tcp_nodelay, keepalive_timeout:这些是提高性能和优化网络传输的选项。

  • types_hash_max_size:用于缓存 MIME 类型的大小限制。

  • include:最后两个 include 语句用于包含额外的配置文件,比如站点配置或模块配置。

server模块(虚拟主机配置)

http 块中,你可以定义多个 server 块来配置不同的虚拟主机。每个 server 块可以有以下参数:

nginx 复制代码
server {
    listen 80;
    server_name example.com;

    root /var/www/example;
    index index.html index.htm;

    # 直接指定"/"可代替上面的"root",能更灵活的配置其他选项
    location / {
        try_files $uri $uri/ =404;
    }

    # 更多 location 块用于更详细的 URL 路径匹配和处理
}
  • listen:定义服务器监听的端口和地址。
  • server_name:定义域名或 IP 地址。可配置二级域名。
  • root:定义网站根目录。
  • index:定义默认索引文件,如果根目录下的默认文件不叫index.html而叫app.html,那么需配置index为app.html。
  • location:定义 URL 的路径匹配规则和处理方式。

location模块

server模块中的 location 块是用来定义如何处理与特定 URL 模式匹配的 HTTP 请求的。location 块允许你针对不同的 URL 路径指定不同的处理逻辑,比如静态文件服务、动态内容处理、重定向、反向代理、负载均衡等。下面详细解释 location 的不同用法和语法:

基本语法

location 块的基本语法如下:

nginx 复制代码
location [=|~|~*|^~] /pattern {
    # 处理逻辑
}

其中 /pattern 是 URL 路径的模式,可以是精确的字符串、正则表达式或其他匹配类型。

匹配类型

假设我在/data/icons/目录下有三个文件favicon1.ico、favicon2.ico、favicon3.ico

等号匹配(=

当使用等号作为前缀时,location 将只匹配完全相等的 URL 路径。这是最高效的匹配类型,因为 Nginx 可以直接查找而无需进行正则表达式匹配。

nginx 复制代码
location = /favicon1.ico {
    root /data/icons;
}
正则匹配(~

使用波浪线作为前缀时,location 将使用正则表达式来匹配 URL 路径。

nginx 复制代码
location ~ /favicon[2-3].ico {
    root /data/icons;
}
忽略大小写的正则匹配(~*

类似正则匹配,但忽略大小写。我们将favicon3.ico改成Favicon3.ico。

nginx 复制代码
location ~* /favicon[2-3].ico {
    root /data/icons;
}

此时按照我们所理解的,访问example.com/favicon3.ico应该能正常显示,其实不然!需要访问example.com/Favicon3.ico才能正常显示。

为什么呢?

因为,只是url和nginx这行配置忽略大小写,让url走这行配置的规则,并不是url和实际访问资源忽略大小写。实际访问的时候还是要和资源名称大小写一致。

常见指令

location 块内,你可以定义一系列指令来处理匹配到的请求。常见的指令包括:

  • root:设置该 location 下的文档根目录。
  • alias:与 root 类似,但是 alias 直接映射 URL 到文件系统路径。
  • try_files:尝试按给定顺序查找文件。如果找不到,可以指定一个默认处理程序,如转发到后端应用。
  • proxy_pass:用于设置反向代理,访问服务而非静态资源用这个。
  • rewrite:用于重写 URL 或重定向请求。
  • return:立即返回一个 HTTP 响应码和可选的内容。

嵌套 location

location 块可以嵌套在另一个 location 块内,允许更精细的控制。例如:

nginx 复制代码
location / {
    root /www/;
    location ~ \.php$ {
        root /var/www/;
        fastcgi_pass   127.0.0.1:9000;
    }
}

在这个例子中,所有请求都默认指向 /www/ 根目录,但 .php 扩展名的请求会被特殊处理,指向 /var/www/ 并通过 FastCGI 发送给 PHP 处理器。

反向代理

假设你有一个后端应用服务器运行在本地的 8000 端口,并且你想通过 Nginx 将所有对 example.com 的请求代理到这个后端服务器,你可以使用以下配置:

nginx 复制代码
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 可选的其他配置
        proxy_redirect off;
        proxy_buffering off;
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
        send_timeout 60s;
    }
}

解释配置

  • listen 80;:监听 80 端口上的请求。
  • server_name example.com;:指定服务器名称,确保只有对 example.com 的请求被处理。
  • location / { ... }:定义所有请求都应该被代理。
  • proxy_pass http://127.0.0.1:8000;:将请求转发到本地的 8000 端口。
  • proxy_set_header:设置代理传递的头部信息。这很重要,因为后端服务器可能需要知道原始客户端的信息。
  • 其他 proxy_ 配置:这些设置用于优化代理连接的性能和可靠性。

负载均衡

在 Nginx 中配置负载均衡可以让你在多台后端服务器之间分配客户端的请求,以提高应用程序的可用性和响应速度,同时也可以增加系统的冗余度。以下是使用 Nginx 配置基于轮询(round-robin)策略的简单负载均衡的步骤和示例配置:

步骤 1: 定义 Upstream 块

首先,你需要定义一个 upstream 块,它将包含一组后端服务器的列表。这个 upstream 块可以被多个 location 块引用,用于负载均衡。

步骤 2: 配置 Server 和 Location 块

接着,在 server 块中使用 location 块来指定哪些请求应该被代理到定义好的 upstream。这样,Nginx 将根据负载均衡策略将请求分发到不同的后端服务器。

示例配置

假设你有两台后端应用服务器,分别运行在 backend1.example.com:8000backend2.example.com:8000,你可以使用以下配置来实现负载均衡:

nginx 复制代码
upstream backend {
    server backend1.example.com:8000;
    server backend2.example.com:8000;
}

server {
    listen 80;
    server_name example.com;

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

解释配置

  • upstream backend { ... }:定义了一个名为 backend 的上游服务器组,包含了两台后端服务器。
  • server backend1.example.com:8000;server backend2.example.com:8000;:指定了后端服务器的地址和端口。
  • proxy_pass http://backend;:告诉 Nginx 将请求代理到 backend 上游服务器组。

负载均衡策略

Nginx 默认使用轮询(round-robin)策略,但你也可以使用其他策略,如最少连接(least connections)或哈希(hash)策略。例如,为了使用最少连接策略,你可以修改 upstream 块如下:

nginx 复制代码
upstream backend {
    least_conn;
    server backend1.example.com:8000;
    server backend2.example.com:8000;
}

在这个配置中,least_conn; 指令告诉 Nginx 选择连接数最少的服务器来处理新的请求。还有其他策略配置可自行百度,这里不做赘述。

以上是我在实际使用nginx时常用的配置,剩余的配置在实际使用后再做持续补充~

Q&A

1.location里root和alias的区别是什么?

在 Nginx 的 location 块中使用 rootalias 指令时,它们之间的主要区别在于如何解析 URL 到实际的文件系统路径。尽管这两个指令都用于指定文件的根目录,但它们的工作方式有所不同。

**root** 指令

root 指令用于设定一个基准目录,当与 location 结合使用时,Nginx 会将请求的 URI(统一资源标识符)附加到 root 目录的后面,然后查找对应的文件或目录。这意味着,如果 root 设定为 /data/icons,并且 URL 请求为 /img/favicon1.ico,那么 Nginx 会尝试在 /data/icons/img/fabicon1.ico 查找文件。

示例:

nginx 复制代码
location / {
    root /data/icons;
    # 请求 /img/favicon1.ico 会查找 /data/icons/img/favicon1.ico
}

**alias** 指令

alias 指令则是用来做 URL 到文件系统路径的直接映射。当使用 alias 时,URL 的路径部分将被完全替换为 **alias** 指定的路径 ,而不是附加到其后。这意味着,如果 alias 设定为 /data/icons/img/,并且 URL 请求为 /img/favicon1.ico,那么 Nginx 将在 /data/icons/img/favicon1.ico 直接查找文件,而不会把 /img/ 加在 alias 指定的路径后面。

示例:

nginx 复制代码
location /img/ {
    alias /data/icons/img/;
    # 请求 /img/favicon1.ico 会查找 /data/icons/img/favicon1.ico
}

选择使用 root 还是 alias 主要取决于你的具体需求。

一般情况下,nginx配置的良好习惯是:

  • 在location /中配置root目录
  • 在location /path中配置alias目录
相关推荐
码林鼠26 分钟前
2026前端面试题(二)
前端
垂直昵称1 小时前
多线程实现网页接口并发压力测试
linux·服务器·windows
JXJD20042 小时前
AI 推理服务器高速连接器线束自动化设备定制指南 全场景互连非标整线方案参考
服务器·人工智能·自动化
王琦03182 小时前
Linux的管理程序
linux·运维·服务器
宿6743 小时前
tsconfig.node.json
前端·javascript·vue.js
QWEDDRFTG3 小时前
家用服务器供电
服务器
小杨互联网3 小时前
Cursor 前端 Dist 自动化逆向框架:/fr 流水线 · 4 脚本 · Vite/Webpack
前端·webpack·自动化·前端逆向框架·ai前端逆向框架
瑞码空间3 小时前
Web应用的多端部署之道:浏览器 · Electron · Docker
前端·docker·electron·浏览器·web
徐奥雯XUAOWEN3 小时前
Codex官网前端可抄吗?从技术视角深度解析与借鉴指南
前端
文艺理科生3 小时前
3 年,8 种方案,1 次重构:LangChain 记忆方案如何从混乱走向清晰
前端·后端·架构