分布式 - 服务器Nginx:常见问题总结(二)

文章目录

      • [01. Nginx 虚拟主机怎么配置?](#01. Nginx 虚拟主机怎么配置?)
      • [02. Nginx location 指令的作用?](#02. Nginx location 指令的作用?)
      • [03. Nginx location 指令如何与其他指令一起使用?](#03. Nginx location 指令如何与其他指令一起使用?)
      • [04. Nginx root 命令的作用?](#04. Nginx root 命令的作用?)
      • [05. Nginx if 模块的作用?](#05. Nginx if 模块的作用?)
      • [06. Nginx include 指令的作用?](#06. Nginx include 指令的作用?)
      • [07. Nginx location 指令的语法?](#07. Nginx location 指令的语法?)
      • [08. Nginx 如何禁止访问某个目录?](#08. Nginx 如何禁止访问某个目录?)
      • [09. Nginx 如何定义错误页面?](#09. Nginx 如何定义错误页面?)
      • [10. Nginx error_page 指令的作用?](#10. Nginx error_page 指令的作用?)
      • [11. Nginx 中500、502、503、504 有什么区别?](#11. Nginx 中500、502、503、504 有什么区别?)
      • [12. Nginx 如何精准匹配路径?](#12. Nginx 如何精准匹配路径?)
      • [13. Nginx 路径匹配优先级?](#13. Nginx 路径匹配优先级?)
      • [14. Nginx rewrite 常用的全局变量?](#14. Nginx rewrite 常用的全局变量?)

01. Nginx 虚拟主机怎么配置?

① 在Nginx的配置文件中添加一个server块,用于定义虚拟主机的配置信息。例如:

nginx 复制代码
server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;
    index index.html;
}

其中,listen指定监听的端口号,server_name指定虚拟主机的域名,root指定虚拟主机的根目录,index指定默认的首页文件。

② 如果需要支持多个虚拟主机,则需要在Nginx的配置文件中添加多个server块,每个server块对应一个虚拟主机的配置信息。

③ 配置完成后,需要重新加载Nginx的配置文件,使其生效。可以使用以下命令:

nginx 复制代码
sudo nginx -t # 检查配置文件是否正确
sudo systemctl reload nginx # 重新加载配置文件

02. Nginx location 指令的作用?

在 Nginx 中,location 指令用于匹配请求的 URL 路径,并指定相应的配置指令。它可以用来控制 Nginx 如何处理不同的请求 URL。

具体来说,location 指令可以用来:

① 指定不同的反向代理服务器或 FastCGI 服务器,以便处理不同的请求 URL。

② 指定不同的文件系统路径,以便 Nginx 可以提供静态文件服务。

③ 指定不同的缓存策略,以便 Nginx 可以缓存不同的请求 URL。

④ 指定不同的安全策略,以便 Nginx 可以对不同的请求 URL 进行访问控制。

在 Nginx 配置文件中,location 指令通常与其他指令一起使用,例如 proxy_pass、root、try_files、expires 等。通过合理使用 location 指令,可以使 Nginx 更加灵活和高效地处理不同的请求 URL。

03. Nginx location 指令如何与其他指令一起使用?

在 Nginx 中,location 指令用于匹配请求的 URI,并定义如何处理这些请求。location 指令可以与多个其他指令一起使用,包括 proxy_pass、root、try_files 和 expires 指令。

① 使用 proxy_pass 指令将请求代理到另一个服务器:

nginx 复制代码
location /api {
    proxy_pass http://backend_server;
}

② 使用 root 指令指定文件根目录,并使用 try_files 指令查找文件:

nginx 复制代码
location /static/ {
    root /var/www;
    try_files $uri $uri/ =404;
}

③ 使用 expires 指令设置缓存过期时间:

nginx 复制代码
location /static/ {
    expires 1d;
}

需要注意的是,location 指令的匹配顺序是按照配置文件中出现的顺序进行的。因此,如果有多个 location 指令匹配同一个 URI,将使用第一个匹配的指令。如果没有匹配的指令,则使用默认的 location 指令。

04. Nginx root 命令的作用?

在 Nginx 中,root 指令用于指定服务器的根目录。具体来说,它指定了 Nginx 服务器在处理客户端请求时查找文件的根目录。当客户端请求的 URL 中包含文件路径时,Nginx 会在 root 指定的目录下查找该文件。

例如,如果 root /var/www/html,而客户端请求的 URL 是 http://example.com/index.html,那么 Nginx 会在 /var/www/html/index.html 中查找该文件。如果在 Nginx 的配置文件中没有指定 root 指令,或者指定的目录不存在或不可读,Nginx 将无法找到请求的文件,从而返回 404 错误。

需要注意的是,root 指令只能在 http、server 或 location 块中使用。在 http 块中使用 root 指令会影响所有的 server 块,而在 server 或 location 块中使用 root 指令则只会影响该块中的请求。

例如,公司的 nginx-conf 文件中配置的 root 指令,

nginx 复制代码
server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;
    //...
}

① listen 指令用于指定服务器监听的端口号和协议,这里监听的是 80 端口,同时支持 IPv4 和 IPv6。

② server_name 指令用于指定服务器的域名,这里使用了通配符 _,表示匹配所有域名。

③ root 指令用于指定服务器的根目录,这里设置为 /usr/share/nginx/html,表示访问服务器时默认会访问该目录下的文件。如果您的nginx服务器接收到一个请求 http://example.com/index.html,nginx将在 /usr/share/nginx/html/index.html 路径下查找该文件。

shell 复制代码
[root@master01 ~]# cd /usr/share/nginx/html
[root@master01 html]# ll
total 20
-rw-r--r--. 1 root root 3332 Jun 10  2021 404.html
-rw-r--r--. 1 root root 3404 Jun 10  2021 50x.html
-rw-r--r--. 1 root root 3429 Jun 10  2021 index.html
-rw-r--r--. 1 root root  368 Jun 10  2021 nginx-logo.png
-rw-r--r--. 1 root root 1800 Jun 10  2021 poweredby.png

05. Nginx if 模块的作用?

nginx的 if 模块是一个用于根据条件判断是否执行某些操作的模块。if模块可以根据请求的URI、请求方法、请求头、请求参数等条件进行判断,并根据判断结果执行相应的操作,如重定向、返回特定的HTTP状态码、设置响应头等。

if 模块的语法如下:

nginx 复制代码
if (condition) {
    // do something
}

其中,condition是一个表达式,可以是任何能够返回布尔值的表达式,如比较运算符、逻辑运算符等。如果condition的值为true,则执行if块中的代码;否则跳过if块,继续执行后面的代码。

需要注意的是,if模块的使用应该尽量避免,因为它会影响nginx的性能。在nginx中,if模块的执行是在请求处理阶段进行的,而请求处理阶段是在nginx的事件模型中的一个阶段,它会阻塞其他请求的处理。因此,如果if模块的使用不当,会导致nginx的性能下降。建议使用其他模块,如rewrite模块、map模块等来替代if模块。

nginx的 if 模块可以根据请求的URI、请求方法、请求头、请求参数等条件进行判断。具体的判断条件可以使用nginx提供的变量来实现 :

  • $uri:请求的URI
  • $request_method:请求的方法
  • $http_user_agent:请求头中的User-Agent字段
  • $arg_xxx:请求参数中的xxx字段

① 例如,限制 HTTP 请求方法只能是 GET、POST、PUT、DELETE 或 PATCH,如果请求方法不在这些范围内,就返回 403 状态码,表示禁止访问。

nginx 复制代码
if ($request_method !~ ^(GET|POST|PUT|DELETE|PATCH)$ ) {
    return 403;
}

② 例如,判断请求的URI以/api/开头,并且请求方法为POST,如果满足条件,则执行if语句中的代码块:

nginx 复制代码
if ($uri ~* ^/api/ && $request_method = POST) {
    # 处理/api/开头的POST请求
}

06. Nginx include 指令的作用?

Nginx的include指令用于在Nginx配置文件中包含其他文件的内容。这个指令可以让你将一个大的配置文件分成多个小的文件,使得配置文件更加易于维护和管理。

使用include指令,你可以将其他文件中的配置内容包含到主配置文件中,这些文件可以是任何文本文件,包括其他Nginx配置文件、shell脚本、环境变量等等。这个指令可以在任何Nginx配置块中使用,包括http、server和location等。

① 例如,你可以在Nginx的http块中使用include指令来包含其他文件中的配置内容:

nginx 复制代码
http {
    include /etc/nginx/conf.d/*.conf;
}

这个例子中,Nginx会在/etc/nginx/conf.d/目录下查找所有以.conf结尾的文件,并将它们的内容包含到http块中。

② 例如,通过 include 指令引入了 /etc/nginx/default/view.conf 文件中的配置信息:

nginx 复制代码
server {
	include /etc/nginx/default/view.conf;
}

07. Nginx location 指令的语法?

nginx中location指令用于匹配请求的URI,并指定相应的处理方式。其语法如下:

nginx 复制代码
location [ = | ~ | ~* | ^~ ] uri {
    ... 
}

其中,location为指令名称,uri为要匹配的URI。=、~、~*、^~为匹配符号,具体含义如下:

  • =:精确匹配,只有当请求的URI与指定的uri完全相同时才匹配成功。
  • ~:区分大小写的正则表达式匹配。
  • ~*:不区分大小写的正则表达式匹配。
  • ^~:普通字符匹配,如果请求的URI以指定的uri开头,则匹配成功。

在location块中,可以指定一系列指令来处理匹配成功的请求,例如 proxy_pass、root、alias等。如果有多个location块匹配成功,则会按照定义的顺序选择第一个匹配成功的location块进行处理。

① 示例:

nginx 复制代码
location /AUTH/api/v2/login {
    deny all;
}

它的作用是禁止所有用户访问 /AUTH/api/v2/login 这个路径下的资源。具体来说,它使用了 deny all 指令,表示拒绝所有用户的访问请求。这个指令通常用于保护敏感的登录接口,确保只有授权的用户才能够访问。

② 示例:

java 复制代码
location = /AUTH/api/v2/users/inner/exact {
    deny all;
}

用于限制访问 /AUTH/api/v2/users/inner/exact 这个 URL 路径的资源。具体来说,它使用了 deny 指令,表示拒绝所有访问该路径的请求。因此,任何尝试访问该路径的请求都将被拒绝,并返回一个 403 Forbidden 的 HTTP 响应。

③ 示例:

nginx 复制代码
location = /BFF/api/v1/auth/login {
    proxy_pass http://bff.platform.svc.cluster.local:8082$request_uri;
    proxy_set_header Current-Project-Id fx-projec-62c5c5b97c631a7d274fb1;
}

用于将请求转发到名为"bff.platform.svc.cluster.local"的后端服务的特定路径"/BFF/api/v1/auth/login"。其中,$request_uri变量表示原始请求的URI,会被传递给后端服务。此外,还设置了一个名为"Current-Project-Id"的HTTP头,其值为"fx-projec-62c5c5b97c631a7d274fb1",用于向后端服务传递当前项目的ID。

④ 示例:

nginx 复制代码
location ~ ^/BFF/api/v[0-9]+ {
    proxy_pass http://bff.platform.svc.cluster.local:8082;
}

它的作用是将以/BFF/api/v[0-9]+开头的请求代理到 http://bff.platform.svc.cluster.local:8082这个地址。

具体来说,这个配置使用了正则表达式^/BFF/api/v[0-9]+来匹配请求的URL,其中^表示匹配URL的开头,/BFF/api/是固定的路径,v[0-9]+表示以v开头,后面跟着一个或多个数字的字符串。例如,/BFF/api/v1、/BFF/api/v2等都会被匹配。

当匹配成功后,proxy_pass指令会将请求代理到http://bff.platform.svc.cluster.local:8082这个地址,也就是将请求转发给了一个名为bff的后端服务。

⑤ 示例:

nginx 复制代码
location ~ ^/PORTAL/api/v4 {
    proxy_pass http://portal-go.platform.svc.cluster.local:8082;
}

它的作用是将所有以/PORTAL/api/v4开头的请求转发到http://portal-go.platform.svc.cluster.local:8082这个地址。

具体来说,~表示使用正则表达式匹配URL,^表示匹配URL的开头,/PORTAL/api/v4是要匹配的URL的正则表达式,proxy_pass指令表示将匹配到的请求转发到指定的地址。在这个例子中,所有匹配到的请求都会被转发到http://portal-go.platform.svc.cluster.local:8082这个地址。

⑥ 示例:

nginx 复制代码
# 开放oauth2 client相关的接口
location ~ ^/AUTH/api/v1/oauth2/client {
    proxy_pass http://auth:8081;
}

它将所有以/AUTH/api/v1/oauth2/client开头的请求代理到http://auth:8081这个地址。这个配置的作用是开放OAuth2客户端相关的接口,让客户端可以通过这个接口与认证服务器进行交互,完成OAuth2的认证流程。具体的接口实现需要在http://auth:8081这个地址上进行。

⑦ 示例:

nginx 复制代码
location ~ ^/soc/[-A-Za-z0-9]+/api/v[0-9]+ {

    # 禁止通过nginx直接访问AUTH的接口
    if ($request_uri ~* ^/soc/AUTH/api) {
        return 403;
    }

    #合并bigscreen和overview到report微服务的转发
    if ($request_uri ~* ^/soc/(BIGSCREEN|OVERVIEW|REPORT)/api) {
        proxy_pass http://report.platform.svc.cluster.local:8101;
    }

    if ($request_uri ~* ^/soc/LINKAGE/api) {
        proxy_pass http://linkage:8130;
    }

    #合并VULNERABILITY和NOTIFICATION到INCIDENT微服务的转发
    if ($request_uri ~* ^/soc/(VULNERABILITY|NOTIFICATION|INCIDENT)/api) {
        proxy_pass http://incident:8091;
    }

    if ($request_uri ~* ^/soc/VIEW/api) {
        proxy_pass http://view.platform.svc.cluster.local:8122;
    }
}

用于匹配以/soc/开头,后面跟着一个由字母、数字和破折号组成的字符串,再接着/api/v后面跟着一个数字的请求路径。该配置中包含了一些规则:

  • 禁止直接访问AUTH的接口,如果请求路径中包含/soc/AUTH/api,则返回403错误。
  • 将BIGSCREEN、OVERVIEW和REPORT的请求转发到 report.platform.svc.cluster.local:8101。
  • 将LINKAGE的请求转发到 linkage:8130。
  • 将VULNERABILITY、NOTIFICATION和INCIDENT的请求转发到 incident:8091。
  • 将VIEW的请求转发到 view.platform.svc.clustaer.local:8122。

这些规则可以根据实际需求进行修改和扩展。

08. Nginx 如何禁止访问某个目录?

可以通过在 Nginx 的配置文件中添加如下指令来禁止访问某个目录:

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

    location /path/to/directory {
        deny all;
    }

    # 其他配置项
}

其中,/path/to/directory 是要禁止访问的目录路径。deny all 指令表示拒绝所有访问该目录的请求。当用户访问 example.com/path/to/directory 时,Nginx 会返回 403 Forbidden 错误,表示禁止访问该目录。

09. Nginx 如何定义错误页面?

在Nginx中,可以通过配置错误页面来定义错误提示页面。具体步骤如下:

① 打开Nginx配置文件,一般为/etc/nginx/nginx.conf。

② 在http块中添加以下代码:

nginx 复制代码
error_page 404 /404.html;
location = /404.html {
    root /usr/share/nginx/html;
    internal;
}

上述代码中,error_page指定了错误码为404时的错误页面路径为/404.html,location指定了该路径对应的本地文件路径为/usr/share/nginx/html/404.html。

③ 保存配置文件并重启Nginx服务。

这样,当访问的页面不存在时,Nginx就会自动跳转到定义的404错误页面。同样的,也可以定义其他错误码的错误页面,只需要在http块中添加相应的error_page和location配置即可。

10. Nginx error_page 指令的作用?

nginx 复制代码
server {
    listen       80;
    server_name  example.com;
    root         /usr/share/nginx/html;
    error_page 404 /404.html;
    location = /40x.html {
    }
}
  • root 指定了服务器的根目录为 /usr/share/nginx/html。
  • error_page 404 /404.html 指定了当访问的页面不存在时,返回 /404.html 页面。
  • location = /40x.html {} 指定了当访问的页面为 /40x.html 时,不做任何处理。

在这个Nginx服务器配置中,root指令指定了Nginx服务器的根目录,即服务器上存储网站文件的主目录。root指令将网站文件的根目录设置为/usr/share/nginx/html。这意味着当用户访问example.com时,Nginx服务器将在/usr/share/nginx/html目录中查找网站文件并将其提供给用户。如果在该目录中找不到请求的文件,Nginx服务器将返回一个404错误页面,该页面的位置由error_page指令指定。

11. Nginx 中500、502、503、504 有什么区别?

这些状态码都是指向 Nginx 服务器的错误响应,具体区别如下:

① 500:表示服务器内部错误,通常是由于 Nginx 无法处理请求而导致的。这可能是由于配置错误、程序错误或其他问题引起的。

② 502:表示网关错误,通常是由于 Nginx 作为代理服务器时无法从上游服务器(如应用服务器)获取响应而导致的。这可能是由于上游服务器故障、网络问题或其他问题引起的。

③ 503:表示服务不可用,通常是由于 Nginx 无法处理请求,因为服务器过载或正在进行维护。这可能是由于服务器资源不足、应用程序错误或其他问题引起的。

④ 504:表示网关超时,通常是由于 Nginx 作为代理服务器时无法在预定时间内从上游服务器(如应用服务器)获取响应而导致的。这可能是由于上游服务器响应时间过长、网络问题或其他问题引起的。例如程序需要执行20秒,而nginx最大响应等待时间为10秒,这样就会出现超时。

总的来说,这些状态码都表示服务器或代理服务器无法正常处理请求,但具体原因可能不同。在排除问题时,需要根据具体的状态码和错误信息来确定问题的根本原因。

12. Nginx 如何精准匹配路径?

Nginx可以使用location指令来精准匹配路径。具体来说,可以使用以下几种方式:

① 精确匹配:使用"="前缀,例如:

nginx 复制代码
location = /path/to/resource {
    匹配精确路径 /path/to/resource
}

② 前缀匹配:使用"^~"前缀,例如:

nginx 复制代码
location ^~ /path/to/ {
    # 匹配以 /path/to/ 开头的路径
}

③ 正则表达式匹配:使用"~"或"~*"前缀,例如:

nginx 复制代码
location ~* \.(gif|jpg|jpeg)$ {
    匹配以 .gif、.jpg 或 .jpeg 结尾的路径
}

需要注意的是,Nginx会按照配置文件中location指令的顺序依次匹配请求的路径,因此应该将精确匹配放在前面,以避免被前缀匹配或正则表达式匹配覆盖。

13. Nginx 路径匹配优先级?

在 Nginx 中,路径匹配的优先级如下:

① 精确匹配:如果请求 URI 与某个 location 指令的前缀完全匹配,则使用该 location 指令处理请求。

② 前缀匹配:如果请求 URI 以某个 location 指令的前缀开头,则使用该 location 指令处理请求。

③ 正则表达式匹配:如果请求 URI 与某个 location 指令的正则表达式匹配,则使用该 location 指令处理请求。

如果有多个 location 指令匹配请求 URI,则使用最长的前缀匹配或正则表达式匹配的 location 指令处理请求。如果有多个最长匹配的 location 指令,则使用先定义的 location 指令处理请求。

需要注意的是,如果使用了 rewrite 指令,则重写后的 URI 会再次进行路径匹配,因此可能会匹配到不同的 location 指令

14. Nginx rewrite 常用的全局变量?

Nginx rewrite 常用的全局变量包括:

$args:请求中的参数部分,例如 /index.php?id=1 中的 id=1。
$uri:请求的 URI,例如 /index.php。
$request_uri:请求的 URI 包括参数,例如 /index.php?id=1。
$request_method:存放了客户端的请求方式,如 get,post 等。
$request_filename:存放当前请求的资源文件的路径名。
$document_root:当前请求的文档根目录。
$request_filename:当前请求的文件路径,由 root 或 alias 指令与 URI 组合而成。
$host:请求中的主机名,例如 www.example.com。
$http_user_agent:客户端浏览器的 User-Agent 字符串。
$http_referer:客户端浏览器的 Referer 字符串,表示用户是从哪个页面链接过来的。
$remote_addr:客户端的 IP 地址。
$server_name:当前请求的服务器名。
$server_port:当前请求的服务器端口号。

这些变量可以在 Nginx 的 rewrite 模块中使用,用于重写 URL 或者进行其他的操作。例如,可以使用 $uri 变量来重写 URL,或者使用 $http_user_agent 变量来根据客户端浏览器类型进行不同的处理。

相关推荐
不能再留遗憾了30 分钟前
RabbitMQ 高级特性——消息分发
分布式·rabbitmq·ruby
茶馆大橘39 分钟前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
材料苦逼不会梦到计算机白富美3 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang
想进大厂的小王4 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
Java 第一深情4 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
ZHOU西口5 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
zmd-zk5 小时前
kafka+zookeeper的搭建
大数据·分布式·zookeeper·中间件·kafka
ajsbxi8 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
yx9o11 小时前
Kafka 源码 KRaft 模式本地运行
分布式·kafka
Gemini199511 小时前
分布式和微服务的区别
分布式·微服务·架构