Nginx使用经验总结,好记性不比烂笔头(键盘)

16,802次阅读
没有评论

共计 7851 个字符,预计需要花费 20 分钟才能阅读完成。

基础知识

  1.  配置文件中以 # 开始的行,或者是前面有若干空格或者 TAB,然后再跟 # 的行,都被认为是注释
  2. 在 nginx.conf 中,包含若干配置项。每个配置项由配置指令和指令参数 2 个部分构成。指令参数也就是配置指令对应的配置值。
    •  配置指令是一个字符串,可以用单引号或者双引号括起来,也可以不括。但是如果配置指令包含空格,一定要引起来。
    • 指令的参数使用一个或者多个空格或者 TAB 字符与指令分开。指令的参数有一个或者多个 TOKEN 串组成。TOKEN 串之间由空格或者 TAB 键分隔。
    • 这个是一个简单配置项:error_page 500 502 503 504 /50x.html;
  3. 使用 if 指令时,if 和 {} 中间需要一个空格;

Server 语句

每个虚拟主机一个对应的 server 配置项,配置项里面包含该虚拟主机相关的配置。在提供 mail 服务的代理时,也可以建立若干 server,每个 server 通过监听的地址来区分。

SSL 相关配置

### 以下为 ssl 相关配置
ssl_certificate      cert.pem;    // 指定 pem 文件路径
ssl_certificate_key  cert.key;  // 指定 key 文件路径
ssl_session_cache    shared:SSL:1m;  // 指定 session cache 大小
ssl_session_timeout  5m;  // 指定 session 超时时间
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   // 指定 ssl 协议
ssl_ciphers  HIGH:!aNULL:!MD5;  // 指定 ssl 算法
ssl_prefer_server_ciphers  on;  // 优先采取服务器算法 s 

全局变量

  1. $args,$query_string  请求中的参数, 如 www.123.com/1.php?a=1&b= 2 的 $args 就是 a =1&b=2
  2. $content_length  http 请求信息里面的“Content-Length”
  3. $conten_type  http 请求信息里面的“Content-Type”
  4. $document_root  nginx 虚拟主机配置文件中的 root 参数对应的值
  5. $document_uri  当前请求中不包含指令的 URI,如 www.123.com/1.php?a=1&b= 2 的 $document_uri 就是 1.php,不包含后面的参数。
  6. $host  主机头,也就是域名。
  7. $http_user_agent  客户端的详细信息,也就是浏览器的标识。
  8. $http_cookie  客户端的 cookie 信息
  9. $limit_rate  如果 nginx 服务器使用 limit_rate 配置了显示网络速率,则会显示,如果没有设置,则显示为 0.
  10. $remote_addr  客户端的公网 ip
  11. $remote_port  客户端的 port
  12. $remote_user  如果 nginx 有配置认证,该变量代表客户端认证的用户名
  13. $request_body_file  做反向代理时发给后端服务器的本地资源的名称
  14. $request_uri  请求的连接,包括 $document_uri 和 $args
  15. $request_method 请求的方法,GET、POST 等
  16. $scheme  请求的协议,如 ftp,http,https
  17. $server_protocol  客户端请求资源用的协议的版本,如 HTTP/1.0,HTTP/1.1,HTTP/2.0
  18. $server_addr  服务器 ip 地址
  19. $server_name  服务器的主机名
  20. $server_port  服务器的端口号
  21. $uri  和 $document_uri 相同
  22. $http_referer  客户端请求时的 referer, 通俗讲就是该请求时通过哪个连接跳进来的,也就是我们在百度搜一个关键字,然后可以点击条目跳进一个网站,点击的那个链接就是你的 referer,用 curl - e 可以指定。

IF 语句

提示

可以使用 =、!= 比较字符串是否相等,进行比较时字符串不需要加引号,IF 跟括号之间必须有一个空格。

在 server 和 location 两种配置块内可以使用 nginx 的 IF 条件判断,当条件成立时执行指定的指令,条件可以为以下几种:

1. 正则表达式

# ~ 为区分大小写匹配;
# ~* 为不区分大小写匹配;
# !~ 不匹配某个区分大小写的正则;
# !~* 不匹配某个不区分大小写的正则;
#下面设定 nginx 在用户使用 ie 的使用重定向到 /nginx-ie 目录下:if ($http_user_agent ~ MSIE) {rewrite ^(.*)$ /nginx-ie/$1 break;
 }

整个正则表达式字符串一般不需要加引号 但如果含有右花括号 } 或者分号 ; 字符时 必须要给整个正则表达式添加引号

2. 文件目录匹配

#- f 和!- f 判断是否存在文件
# - d 和!- d 判断是否存在目录
#- e 和!- e 判断是否存在文件或目录
#- x 和!- x 判断文件是否可执行
#设定 nginx 在文件和目录不存在的时候重定向:if (!-e $request_filename) {proxy_pass http://127.0.0.1/;}

Return 语句

该指令一般用于对请求的客户端直接返回响应状态码。在该作用域内return 后面的所有 nginx 配置都是无效的。可以使用在 server、location 以及 if 配置中。除了支持跟状态码,还可以跟字符串或者 url 链接,该语句只会影响当前所在的代码块。

#301 重定向,直接带 server 块内使用,后面的所有指令都不会执行
return 301 https://nicen.cn$request_uri;
#输出 HTML 也行
return 200 "";

Deny 语句

Deny 用于拒绝访问,可在 sever 和 location 中使用

deny all; #拒绝访问
allow 208.97.167.194; #允许指定 IP 访问

Rewrite 命令

  1. 它可以用在 server, location 和 IF 条件判断块中,格式为:rewrite 正则表达式 替换目标 flag 标记
  2. flag 标记可以用以下几种格式
    last – 停 止当前这个请求,并根据 rewrite 匹配的规则重新发起一个请求。新请求又从第一阶段开始执行…
    break – 中止 Rewirte,不在继续匹配,相对 last,break 并不会重新发起一个请求,只是跳过当前的 rewrite 阶段,并执行本请求后续的执行阶段…
    redirect – 重定向到指定的链接,返回临时重定向的 HTTP 状态 302
    permanent – 重定向到指定的链接,返回永久重定向的 HTTP 状态 301

Set 语句

set 指令是用于定义一个变量,并且赋值,可在 server、location、if 代码块中使用。

Nginx 配置文件中文详解:https://www.w3cschool.cn/nginx/nginx-d1aw28wa.html

try_files 命令

try_files是 nginx 中 http_core 核心模块所带的指令,主要是能替代一些 rewrite 的指令,提高解析效率。

  1. 它可以用在 server, location 和 IF 条件判断块中,格式为:rewrite 正则表达式 替换目标 flag 标记
  2. 按指定的 file 顺序查找存在的文件,并使用第一个找到的文件进行请求处理,如果给出的 file 都没有匹配到,则重新请求最后一个参数给定的 uri,就是新的 location 匹配;
    location / {try_files $uri $uri/ /index.php?$query_string;}
    location ~ .*.(php|php5)?$
    {
        fastcgi_pass  127.0.0.1:9000;
         fastcgi_index index.php;
    }
    

    当用户请求 http://localhost/example 时,这里的 $uri 就是 /example。

    try_files 会到硬盘里尝试找这个文件。如果存在名为 /root/example(其中 root 是项目代码安装目录)的文件,就直接把这个文件的内容发送给用户。

    显然,目录中没有叫 example 的文件。然后就看 uri/,增加了一个 /,也就是看有没有名为 /root/example/ 的目录。

    又找不到,就会 fall back 到 try_files 的最后一个选项 /index.php,发起一个内部“子请求”,也就是相当于 nginx 发起一个 HTTP 请求到 http://localhost/index.php

    这个请求会被 location ~ .*.(php|php5)?$ {…} catch 住,也就是进入 FastCGI 的处理程序。而具体的 URI 及参数是在 REQUEST_URI 中传递给 FastCGI 和 PHP 程序的,因此不受 URI 变化的影响。

break 命令

该指令用于中断当前相同作用域中的其他 Nginx 配置

与该指令处于同一作用域的 Nginx 配置中 位于它前面的指令配置生效 位于后面的指令配置无效

Nginx 服务器在根据配置处理请求的过程中遇到该指令时 回到上一层作用域继续向下读取配置 该指令可以在 server 块和 location 块以及 if 块中使用 其语法结构为:break;

问题总结

  1. location 的匹配存在优先级的问题,前面比后面先匹配;绝对比正则先匹配。往往重写不生效时就是没有匹配到指定的块。(例如重写一个 PHP 文件的请求时,在 PHP-CGI 块的后面,所以一直返回 404)。
  2. 修改配置文件后,一定要重启 NGINX。

正向代理和反向代理

在 Nginx 的环境下,通过不同协议访问时可代理 http、https 等不同的协议。

正向代理:局域网的主机访问互联网的资源;(proxy_pass 指令,目标为外网地址)

反向代理:互联网主机访问局域网内某台主机的资源(proxy_pass 指令,目标为局域网地址)。

反向代理 websocket 时,默认情况下,如果代理服务器在 60 秒内没有传输任何数据,连接将被关闭。

1.proxy_hide_header field  指令

其中,field 为需要隐藏的头域。该指令可以在 http 块、server 块或者 location 块中进行配置。

2.proxy_pass_header field 指令

默认情况下,Nginx 服务器在发送响应报文时,报文头中不包含「Date」、「Server」、「X-Accel」等来自被代理服务器的头域信息。该指令可以设置这些头域信息以被发送,其语法结构为:

3.proxy_pass_request_body 指令

该指令用于配置是否将客户端请求的请求体发送给代理服务器,其语法结构为:proxy_pass_request_body on|off;默认设置为开启(on),开关可以在 http 块、server 块或者 location 块中进行配置。

4.proxy_pass_request_headers on|off

该指令用于配置是否将客户端请求的请求头发送给代理服务器,其语法结构为:

5.proxy_set_header  field value 指令

该指令可以更改 Nginx 服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给被代理的服务器,field 为指定的字段,value 为字段值。

6.proxy_set_body value

该指令可以更改 Nginx 服务器接收到的客户端请求的请求体信息,然后将新的请求体发送给被代理的服务器;

7.proxy_bind address

官方文档中对该指令的解释是,强制将与代理主机的连接绑定到指定的 IP 地址,通俗来讲就是,在配置了多个基于名称或者基于 IP 的主机的情况下,如果我们希望代理连接由指定的主机处理,就可以使用该指令进行配置,address 为指定的 IP;

8.proxy_connect_timeout time

指令,该指令配置 Nginx 服务器与后端被代理服务器尝试建立连接的超时时间。默认为 60s;

9.proxy_read_timeout time

该指令配置 Nginx 服务器向后端被代理服务器组发出 read 请求后等待响应的超时时间,time 默认为 60s;

10.proxy_send_timeout time

该指令配置 Nginx 服务器向后端被代理服务器组发出 write 请求后等待响应的超时时间,time 默认为 60s;

11.proxy_http_version version

该指令用于设置用于 Nginx 服务器提供代理服务的 HTTP 协议版本,默认设置为 1.0 版本,1.1 版本支持 upsteam 服务器组设置中的 keepalive 指令;

12.proxy_method method

该指令用于设置 Nginx 服务器请求被代理服务器时使用的请求方法,一般为 POST 或者 GET。设置了该指令,客户端的请求方法将被忽略。

13.proxy_ignore_client_abort on | off

该指令用于设置在客户端中断网络请求时,Nginx 服务器是否中断对被代理服务器的请求,默认设置为 off,当客户端中断网络请求时,Nginx 服务器中断对被代理服务器的请求。

14.proxy_ignore_headers field …

该指令用于设置一些 HTTP 响应头中的头域,Nginx 服务器接收到被代理服务器的响应数据后,不会处理被设置的头域。其中,field 为要设置的 HTTP 响应头的头域,例如「X-Accel-Redirect」、「X-Accel-Expires」、「Expires」、「Cache-Control」或「Set-Cookie」等。

15.proxy_redirect 指令

该指令用于修改被代理服务器返回的响应头中的 Location 头域和「Refresh」头域,与 proxy_pass 指令配合使用。比如,Nginx 服务器通过 proxy_pass 指令将客户端的请求地址重写为被代理服务器的地址,那么 Nginx 服务器返回给客户端的响应头中「Location」头域显示的地址就应该和客户端发起请求的地址相对应,而不是代理服务器直接返回的地址信息,否则就会出问题。该指令解决了这个问题,可以把代理服务器返回的地址信息更改为需要的地址信息。其语法结构为:

proxy_redirect redirect replacement; 
proxy_redirect default; 
proxy_redirect off;

redirect,匹配「Location」头域值的字符串,支持变量的使用和正则表达式。
replacement,用于替换 redirect 变量内容的字符串,支持变量的使用。

对于第 1 个结构,>假设被代理服务器返回的响应头中「Location」头域为:

Location: http://localhost:8081/proxy/some/uri/

该指令设置为:

proxy_redirect  http://localhost:8081/proxy/  http://myweb/frontend/;

Nginx 服务器会将「Location」头域的信息更改为:

Location: http://myweb/frontend//some/uri/

这样,客户端收到的响应信息头部中的「Location」头域也就被更改了。

结构 2 使用 default,代表使用 location 块的 uri 变量作为 replacement,并使用 proxy_pass 变量作为 redirect。请看下面两段配置,它们的配置效果是等同的。

location /server/
{
    proxy_pass http://proxyserver/source/;proxy_redirect default;}
location /server/
{
    proxy_pass http://proxyserver/source/;proxy_redirect http://proxyserver/source/ /server/;}

使用结构 3 可以将当前作用域下所有的 proxy_redirect 指令配置全部设置为无效。

17.proxy_intercept_errors on | off;

该指令用于配置一个状态是开启还是关闭。在开启该状态时,如果被代理的服务器返回的 HTTP 状态代码为 400 或者大于 400,则 Nginx 服务器使用自己定义的错误页(使用 error_page 指令);如果是关闭该状态,Nginx 服务器直接将被代理服务器返回的 HTTP 状态返回给客户端。

18.proxy_headers_hash_ max _size size

该指令用于配置存放 HTTP 报文头的哈希表的容量,size 为 HTTP 报文头哈希表的容量上限,默认为 512 个字符,即:proxy_headers_hash_ max _size 512;Nginx 服务器为了能够快速检索 HTTP 报文头中的各项信息,比如服务器名称、MIME 类型、请求头名称等,使用哈希表存储这些信息。Nginx 服务器在申请存放 HTTP 报文头的空间时,通常以固定大小为单位申请,该大小由 proxy_headers_hash_bucket_size 指令配置。在 Nginx 配置中,不仅能够配置整个哈希表的大小上限,对大部分的内容项,也可以配置其大小上限,比如 server_names_hash_max_size 指令和 server_names_hash_bucket_size 指令用来设置服务器名称的字符数长度。

19.proxy_headers_hash_bucket_size size;

该指令用于设置 Nginx 服务器申请存放 HTTP 报文头的哈希表容量的单位大小。该指令的具体作用在上面 proxy_headers_hash_max_size 指令的使用中已经说明。size 为设置的容量,默认为 64 个字符。

20.proxy_next_upstream status …;

在配置 Nginx 服务器反向代理功能时,如果使用 upstream 指令配置了一组服务器作为被代理服务器,服务器组中各服务器的访问规则遵循 upstream 指令配置的轮询规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一个组内服务器处理。status 为设置的服务器返回状态,可以是一个或者多个。这些状态包括 error,在建立连接、向被代理的服务器发送请求或者读取响应头时服务器发生连接错误。
timeout,在建立连接、向被代理的服务器发送请求或者读取响应头时服务器发生连接超时。
invalid_header,被代理的服务器返回的响应头为空或者无效。
http_500 | http_502 | http_503 | http_504 | http_404,被代理的服务器返回 500、502、503、504 或者 404 状态代码。
off,无法将请求发送给被代理的服务器。与被代理的服务器进行数据传输的过程中发送错误的请求,不包含在该指令支持的状态之内。

21.proxy_ssl_session_reuse on | off

该指令用于配置是否使用基于 SSL 安全协议的会话连接(“https://”)被代理的服务器,默认设置为开启(on)状态。如果我们在错误日志中发现「SSL3_GET_FINISHED:digest check failed」的情况,可以将该指令配置为关闭(off)状态。

问题总结

  1. 使用腾讯云 CDN 时,进行 websokect 反向代理时,由于 cdn 链接最多保持 10s,将会导致 websokect 中断。

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-10发表,共计7851字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)