NGINX 路由配置与参数详解(https配置、跨域配置、socket配置)

一、概述

Nginx 是一个高性能的开源Web服务器,也可以用作反向代理服务器、负载均衡器和HTTP缓存。它的设计目标是提供高并发、低内存消耗和高度可伸缩性,使其成为处理大量并发连接的理想选择。

NGINX 基础部分可以参考我这篇文章:NGINX - 高级负载均衡器、Web服务器、反向代理

二、https 配置

配置 Nginx 支持 HTTPS 通常涉及到以下几个步骤:

1)获取 SSL 证书

你需要从可信任的证书颁发机构(CA)获取 SSL 证书。这可以是免费的证书,比如 Let's Encrypt 提供的证书,也可以是购买的商业证书。

2)安装 SSL 证书

将获取的 SSL 证书文件(通常包括证书文件和私钥文件)上传到服务器。确保证书私钥文件的权限设置为安全。

3)Nginx 配置修改

修改 Nginx 配置文件,通常是 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf。以下是一个简单的 HTTPS 配置示例:

bash 复制代码
server {
    listen 80;
    server_name your_domain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name your_domain.com;

    ssl_certificate /path/to/your_domain.crt;
    ssl_certificate_key /path/to/your_domain.key;

    # 配置 SSL 协议和加密算法
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';

    # 配置其他 SSL 选项
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # 配置 SSL 证书验证和安全性选项
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;

    # 配置其他 Nginx 选项
    # ...

    location / {
        # 配置用于处理 HTTPS 请求的其他指令
        # ...
    }
}

替换 your_domain.com/path/to/your_domain.crt/path/to/your_domain.key 为你的域名和证书路径。

4)重新加载 Nginx 配置

保存配置文件后,重新加载 Nginx 以应用更改。

bash 复制代码
# 检查语法
nginx -t
# 重新加载配置
nginx -s reload

确保在配置 SSL 证书时遵循最佳实践和安全性建议,以确保通信的安全性。此外,你还可以使用在线工具来检查你的 SSL 配置,例如 SSL Labs。

三、nginx 跨域配置

要在 Nginx 中配置跨域资源共享(CORS),你可以使用 add_header 指令设置必要的 CORS 头。以下是一个简单的 Nginx 配置示例,用于允许所有来源的跨域请求:

bash 复制代码
server {
    listen 80;
    server_name your_domain.com;

    location / {
        # 允许跨域的请求,可以自定义变量$http_origin,*表示所有
        add_header 'Access-Control-Allow-Origin' *;
        # 允许携带cookie请求
        add_header 'Access-Control-Allow-Credentials' 'true';
        # 允许跨域请求的方法:GET,POST,OPTIONS,PUT
        add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT';
        # 允许请求时携带的头部信息,*表示所有
        add_header 'Access-Control-Allow-Headers' *;
        # 允许发送按段获取资源的请求
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        # 一定要有!!!否则Post请求无法进行跨域!
        # 在发送Post跨域请求前,会以Options方式发送预检请求,服务器接受时才会正式请求
        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain; charset=utf-8';
            add_header 'Content-Length' 0;
            # 对于Options方式的请求返回204,表示接受跨域请求
            return 204;
        }
    }

}

请注意,上述配置中的 Access-Control-Allow-Origin 设置为 '*',表示允许所有来源的请求。在实际应用中,你可能需要根据你的需求将其设置为具体的域名。此外,如果你的跨域请求包含其他自定义头部,你需要将它们添加到 Access-Control-Allow-Headers 中。

最后,记得保存配置文件并重新加载 Nginx 以使更改生效:

bash 复制代码
# 检查语法
nginx -t
# 重新加载配置
nginx -s reload

四、nginx socket 配置

Nginx 中配置 WebSocket(WebSocket over HTTP)涉及到一些特殊的配置,因为 WebSocket 协议和传统的 HTTP 协议有些不同。

  1. 默认 proxy_http_version 1.0'websocket' 是建立在 '1.1' 的基础

  2. nginx 默认'不会'为客户端'转发'Upgrade、Connection标头

bash 复制代码
# 指定用于与后端服务器通信的 HTTP 协议版本。WebSocket 需要使用 HTTP/1.1 协议。
proxy_http_version 1.1;
# Upgrade: protocols  #Upgrade 头指定'一项或多项'协议名,按'优先级'排序,以'逗号'分隔
proxy_set_header Upgrade $http_upgrade;
# Connection: Upgrade #设置 Connection 头的值为 "Upgrade" 来指示这是一个'升级'请求
proxy_set_header Connection "upgrade";

以下是一个简单的 Nginx 配置示例,用于支持 WebSocket

bash 复制代码
server {
    listen 80;
    server_name your_domain.com;

    location / {
        # 配置其他 Nginx 选项
        # ...

        # 开启 WebSocket 支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 配置反向代理到 WebSocket 后端
        proxy_pass http://websocket_backend;

        # 配置其他用于处理请求的指令
        # ...
    }

    # 配置与 WebSocket 后端的连接
    upstream websocket_backend {
        # WebSocket 后端的地址和端口
        server backend_server_ip:backend_server_port;

        # 可以添加多个后端服务器
        # server backend_server2_ip:backend_server2_port;
        # ...
    }
}

请替换以下内容:

  • your_domain.com:你的域名。
  • backend_server_ipbackend_server_port:WebSocket 后端服务器的地址和端口。

上述配置使用了 proxy_http_versionproxy_set_header Upgradeproxy_set_header Connection 指令来支持 WebSocketproxy_pass 指令用于将请求代理到 WebSocket 后端。

最后,记得保存配置文件并重新加载 Nginx 以使更改生效:

bash 复制代码
# 检查语法
nginx -t
# 重新加载配置
nginx -s reload

五、NGINX 路由配置

在 Nginx 中进行路由配置通常涉及使用 location 指令,该指令允许你根据请求的 URI(Uniform Resource Identifier)来分发请求到不同的后端服务或处理逻辑。以下是一些基本的 Nginx 路由配置示例:

1)基本的 URI 匹配

bash 复制代码
server {
    listen 80;
    server_name your_domain.com;

    location / {
        # 处理根路径请求的配置
        # ...
    }

    location /app1 {
        # 处理以 /app1 开头的 URI 请求的配置
        # ...
    }

    location /app2 {
        # 处理以 /app2 开头的 URI 请求的配置
        # ...
    }

    # 其他 location 配置
    # ...
}

2)nginx 中斜杠(/)

在 Nginx 配置中,location 块和 proxy_pass 指令的斜杠使用方式可能涉及四种情况,取决于是否以斜杠结尾,以及是否在 URI 处理中使用正则表达式。以下是这四种情况的示例:

1、location 以斜杠结尾,proxy_pass 不以斜杠结尾

bash 复制代码
location /app/ {
    # 匹配以 /app/ 开头的路径
    # ...
    proxy_pass http://backend_server;
}

location 解释:

  • 匹配以 /app/ 开头的路径,例如 /app/foo
  • 如果请求为 /app/foo$uri 变量的值为 /foo

proxy_pass 解释:

  • proxy_pass 后面没有斜杠,表示请求会被直接转发到 http://backend_server
  • 对于请求 /app/foo,Nginx 会将请求转发到 http://backend_server/foo

2、location 不以斜杠结尾,proxy_pass 以斜杠结尾

bash 复制代码
location /app {
    # 匹配以 /app 开头的路径
    # ...
    proxy_pass http://backend_server/;
}

location 解释:

  • 匹配以 /app 开头的路径,例如 /app/foo
  • 如果请求为 /app/foo$uri 变量的值为 /foo

proxy_pass 解释:

  • proxy_pass 后面有斜杠,表示请求会被转发到 http://backend_server/
  • 对于请求 /app/fooNginx 会将请求转发到 http://backend_server/foo

3、location 以斜杠结尾,proxy_pass 也以斜杠结尾

bash 复制代码
location /app/ {
    # 匹配以 /app/ 开头的路径
    # ...
    proxy_pass http://backend_server/;
}

location 解释:

  • 匹配以 /app/ 开头的路径,例如 /app/foo
  • 如果请求为 /app/foo$uri 变量的值为 /foo

proxy_pass 解释:

  • proxy_pass 后面有斜杠,表示请求会被转发到 http://backend_server/
  • 对于请求 /app/fooNginx 会将请求转发到 http://backend_server/foo

4、location 不以斜杠结尾,proxy_pass 也不以斜杠结尾

bash 复制代码
location /app {
    # 匹配以 /app 开头的路径
    # ...
    proxy_pass http://backend_server;
}

location 解释:

  • 匹配以 /app 开头的路径,例如 /app/foo
  • 如果请求为 /app/foo$uri 变量的值为 /foo

proxy_pass 解释:

  • proxy_pass 后面没有斜杠,表示请求会被直接转发到 http://backend_server
  • 对于请求 /app/fooNginx 会将请求转发到 http://backend_server/foo

注意事项:如果使用了 aliasroot 指令,$uri 变量的值可能会受到影响,需要根据实际情况调整。要确保后端服务的路径配置与 Nginx 转发的路径匹配。

3)nginx root 与 alias 字段区别

rootaliasNginx 中用于指定服务器块(server)或位置块(location)的文件系统路径的两个指令。它们在配置静态文件服务时经常使用,但有一些区别。

1、root 指令

root 用于指定服务器或位置的文件系统根目录。当 root 指令用于服务器块时,该路径会成为该服务器上所有位置块的基础路径,除非在某个位置块中使用了 alias 指令。

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

    root /path/to/website;

    location / {
        # 请求 /foo 会映射到 /path/to/website/foo
        # ...
    }
}

在这个例子中,root 指定了服务器的根目录为 /path/to/website。所有对该服务器的请求将从这个目录开始寻找文件。

2、alias 指令

alias 用于定义服务器或位置的别名,指定服务器或位置的文件系统路径的替代位置。与 root 不同,alias 允许为某个特定的位置块指定不同的根目录。

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

    location /images/ {
        alias /path/to/images/;
        # 请求 /images/foo.png 会映射到 /path/to/images/foo.png
        # ...
    }

    location /static/ {
        alias /path/to/static/;
        # 请求 /static/bar.css 会映射到 /path/to/static/bar.css
        # ...
    }
}

在这个例子中,location /images/location /static/ 分别定义了不同的别名,使得它们可以映射到不同的文件系统路径。

区别总结:

root

  • 用于指定服务器或位置的文件系统根目录。
  • 在服务器块中使用时,作为全局的根目录。
  • 在位置块中使用时,将路径追加到服务器块中 root 指定的路径后。

alias

  • 用于定义服务器或位置的别名,指定不同的文件系统路径。
  • 允许为不同的位置块指定不同的根目录,实现更灵活的路径映射。

4)nginx 正则路由

Nginx 中,正则路由指的是通过正则表达式匹配 URL 路径的一种路由配置方式。正则路由通常用于灵活地匹配多个 URL 地址,具有强大的模式匹配功能。以下是一些关于 Nginx 正则路由的详解:

1、基本的正则路由配置:

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

    location ~ ^/user/(\d+)$ {
        # 匹配形如 /user/123 的路径,并提取其中的数字
        set $user_id $1;
        # ...
    }
}

在这个例子中,location ~ ^/user/(\d+)$ 使用正则表达式 ^/user/(\d+)$ 匹配形如 /user/123 的路径,并提取其中的数字。$1 是正则表达式中括号捕获的内容,可以赋值给变量 $user_id

2、正则路由中的限定符

正则表达式中的一些常用限定符,例如 *+?{},在 Nginx 的正则路由中也可以使用。例如:

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

    location ~ ^/images/.*\.jpg$ {
        # 匹配以 /images/ 开头,以 .jpg 结尾的路径
        # ...
    }
}

在这个例子中,location ~ ^/images/.*\.jpg$ 使用 .* 匹配任意字符(零次或多次),\. 匹配点号,最后 $ 表示以 .jpg 结尾。

3、正则路由中的位置匹配顺序

在 Nginx 中,正则路由的匹配是按照配置文件中出现的顺序进行的。因此,如果有多个正则路由匹配到同一个 URL,将匹配到第一个满足条件的路由。

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

    location ~ ^/user/(\d+)$ {
        # 匹配形如 /user/123 的路径
        # ...
    }

    location ~ ^/user/(\w+)$ {
        # 匹配形如 /user/john 的路径
        # ...
    }
}

在这个例子中,如果请求的路径是 /user/123,将匹配到第一个 location,如果路径是 /user/john,将匹配到第二个 location

4、正则路由中的变量

可以在正则路由中使用正则表达式中的捕获组提取内容,并将其赋值给变量。这样,可以在后续的配置中使用这些变量。

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

    location ~ ^/post/(\d+)$ {
        # 匹配形如 /post/123 的路径,并提取其中的数字
        set $post_id $1;
        # ...
    }
}

在这个例子中,set $post_id $1; 将路径中的数字赋值给变量 $post_id,可以在后续的配置中使用。

六、localhost 加载顺序与默认路由

在 Web 开发中,"localhost" 是一个常用的域名,用于访问本地主机上的网站。在 Nginx 中,"localhost" 通常与默认服务器块(server block)相关联。以下是关于 "localhost" 加载顺序和默认路由的一些说明:

1)默认服务器块的加载顺序

默认服务器块是 Nginx 配置文件中未指定 server_name 的服务器块。当请求进入 Nginx 服务器时,如果请求的域名在配置文件中找不到对应的 server_nameNginx 将会使用默认服务器块。

bash 复制代码
server {
    listen 80 default_server;
    server_name _;

    # ... 配置内容 ...
}

上述配置中,server_name _; 表示匹配所有域名。因此,当请求进入时,如果找不到匹配的 server_name,将会使用这个默认服务器块。

2)"localhost" 的加载顺序

当你在浏览器中访问 "localhost" 时,实际上是通过域名来请求 Nginx 服务器。此时,Nginx 将根据域名查找匹配的 server_name。

bash 复制代码
server {
    listen 80;
    server_name localhost;

    # ... 配置内容 ...
}

上述配置中,server_name localhost; 表示当请求的域名是 "localhost" 时,将使用这个服务器块进行处理。

3)加载顺序总结

  • 如果在配置文件中找到匹配的 server_name,将使用对应的服务器块进行处理。
  • 如果找不到匹配的 server_name,将使用默认服务器块进行处理。
  • 默认服务器块通常会使用 listen 80 default_server; 和 server_name _; 来设置。

注意事项:

  • 在配置文件中,加载顺序是按字母顺序从上到下的,因此确保默认服务器块在其他服务器块之前定义,以确保正确的加载顺序。
  • 如果有多个服务器块定义了相同的 server_name将使用第一个匹配的服务器块
  • 通过配置默认服务器块和相应的 server_name,可以确保在 "localhost" 或其他未匹配到域名的情况下,Nginx 能够使用合适的配置进行处理。

NGINX 路由配置与参数详解(https配置、跨域配置、socket配置)就先到这里了,有任何疑问也可关注我公众号:大数据与云原生技术分享,进行技术交流,如本篇文章对您有所帮助,麻烦帮忙一键三连(点赞、转发、收藏)~

相关推荐
xujiangyan_3 小时前
nginx的反向代理和负载均衡
服务器·网络·nginx
viqecel17 小时前
网站改版html页面 NGINX 借用伪静态和PHP脚本 实现301重定向跳转
nginx·php·nginx重定向·301重定向·html页面重定向
硪就是硪21 小时前
内网环境将nginx的http改完https访问
nginx·http·https
ak啊1 天前
Nginx 安全加固详细配置指南
nginx
沐土Arvin1 天前
Nginx 核心配置详解与性能优化最佳实践
运维·开发语言·前端·nginx·性能优化
haoranyyy2 天前
mac环境中Nginx安装使用 反向代理
linux·服务器·nginx
ak啊2 天前
Nginx 高级缓存配置与优化
nginx
再学一丢丢2 天前
Keepalived+LVS+nginx高可用架构
nginx·架构·lvs
xujiangyan_2 天前
nginx的自动跳转https
服务器·nginx·https
tingting01193 天前
k8s 1.30 安装ingress-nginx
nginx·容器·kubernetes