Nginx

Posted 小企鹅推雪球!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx相关的知识,希望对你有一定的参考价值。

server 配置块

  1. nginx 中,一个 server 配置块代表了一个虚拟机主机。

虚拟主机

  1. 虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成多台 “虚拟” 的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的 Internet 服务器功能(WWW、FTP、Email 等等),同一台主机上的虚拟主机之间是完全独立的。
  2. 从网站访问者来看,每一台虚拟主机和一台独立主机完全一样。
  3. 利用虚拟主机,不用为每个要运行的网站提供一台单独的 Nginx 服务器或单独运行一组 Nginx 进程。虚拟主机提供了在同一台服务器、同一组 Nginx 进程上运行多个网站的功能。

Nginx 配置虚拟主机

  1. 在 Nginx 配置文件(nginx.conf)中,最简化的虚拟主机配置如下:

    #user  nobody;
    worker_processes  3;
     
    events 
        #...
    
     
    http 
        #...
        server 
            listen       8080;
            server_name  localhost;
            access_log  logs/host.access.log  main;
            location / 
                root   html;
                index  index.html index.htm;
            
        
        #...
    
    
  2. server 配置块配置了一个监听 8080 端口的虚拟主机

  3. Nginx 通过 listen 指令指定的值监听网络请求,可以是 IP 协议的形式,也可以是 UNIX 域套接字。

  4. 如果不设置 listen 指令,Nginx 在以超级用户运行时则监听 80 端口,以非超级用户运行时则监听 8000 端口

  5. listen用法示例

    http 
        server 
            listen 127.0.0.1:8000;           # 监听127.0.0.18000端口
            listen 127.0.0.1;                # 监听127.0.0.1的默认80端口(root权限)
            listen 8000;                     # 监听本机所有IP的8000端口
            listen *:8000;                   # 监听本机所有IP的8000端口
            listen localhost:8000;           # 监听locahost的8000端口
            listen [::]:8000;                # 监听IPv6的8000端口
            listen [::1];                    # 监听IPv6的回环IP的默认80端口(root权限)
            listen unix:/var/run/nginx.sock; # 监听域套接字文件
            listen *:8000 \\                  # 监听本机的8000端口
                    default_server \\         # 当前服务是http指令域的主服务
                    fastopen=30 \\            # 开启fastopen功能并限定最大队列数为30
                    deferred \\               # 拒绝空数据连接
                    reuseport \\              # 工作进程共享socket这个监听端口
                    backlog=1024 \\           # 请求阻塞时挂起队列数是1024个
                    so_keepalive=on;         # 当socket为保持连接时,开启状态检测功能
        
    
    
  6. server_name 指令主要用于配置基于名称的虚拟主机

    1. server_name 指令在接到客户请求后的匹配顺序分别为
      1. 准确的 server_name 匹配
        server 
             listen       80;
             server_name  domain.com  www.domain.com;
             ...
        
        
      2. 以 * 通配符开始的字符串:
        server 
             listen       80;
             server_name  *.domain.com;
             ...
        
        
      3. 以 * 通配符结束的字符串:
        server 
             listen       80;
             server_name  www.*;
             ...
        
        
      4. 匹配正则表达式
        server 
             listen       80;
             server_name  ~^(?.+)\\.domain\\.com$;
             ...
        
        
    2. Nginx 将按照上面1、2、3、4顺序对 server_name 进行匹配,只要有一项匹配 server_name 后就会停止继续匹配。
  7. access_log指令用来指定日志文件的存放路径、格式(把定义的 log_format 跟在后面)和缓存大小;如果不想启用日志则access_log off ;

  8. location指令的作用是根据用户请求的 URI 来执行不同的操作,也就是根据用户请求的网站 URL 匹配 location 配置块,匹配成功就执行 location 配置块中定义的相关操作

    #user  nobody;
    worker_processes  1;
     
    http 
        #...
        server 
            listen       8080;
            server_name  localhost;
     
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
     
            location / 
                root   html;
                index  index.html index.htm;
            
     
            location ~ \\.php$ 
                proxy_pass   http://127.0.0.1;
            
     
            location ~ \\.php$ 
                root           html;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                include        fastcgi_params;
            
        
        #...
    
    

location 配置块

  1. location 配置块用来配置匹配的不同请求 URL 的处理方式

    http 
        #...
        server 
            listen       8080;
            #...
            location / 
                root   html;
                index  index.html index.htm;
            
            location /example1 
                // 匹配请求 URL 为 /example1 的请求
                // 在这里为该请求定义配置信息
            
            location /example2 
                proxy_pass http://localhost:8080/demo/mng/;
                proxy_cookie_path /demo /;
                proxy_set_header Host $host:$server_port;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_redirect ~^http://localhost:8080/demo/mng/(.*) https://www.demo.com/mng/$1;
                proxy_connect_timeout 4s;
                proxy_read_timeout 60s;
                proxy_send_timeout 8s;
            
        
        #...
    
    
  2. location 配置块只能在 server 配置块中配置

  3. location 指令的功能是用来匹配不同的 URI 请求,进而对请求做不同的处理和响应

  4. location 指令匹配 URI 类型,有四种参数可选,例如

    location [ = | ~ | ~* | ^~ ] /URI 
        # ...
    
    
  5. :location 后没有参数直接跟着标准 URI,表示前缀匹配,代表跟请求中的 URI 从头开始匹配
    7.=:用于标准 URI 前,要求请求字符串与其精准匹配,成功则立即处理,nginx 停止搜索其他匹配

  6. ^~:用于标准URI前,并要求一旦匹配到就会立即处理,不再去匹配其他的那些个正则 URI,一般用来匹配目录

  7. ~:用于正则 URI 前,表示 URI 包含正则表达式,区分大小写

  8. ~*:用于正则 URI 前,表示 URI 包含正则表达式,不区分大小写

  9. @用来定义一个命名location。主要用于内部重定向,不能用来处理正常的请求

    location @/name/ 
        # ...
    
    
    1. @ 定义一个命名的 location,@ 定义的 location 名字一般用在内部定向例如:error_page、try_files

      location / 
          try_files $uri $uri/ @custom
      
       
      location @custom 
          # ...do something
      
      
    2. 当尝试访问 url 找不到对应的文件就重定向到我们自定义的命名 location(此处为 custom),命名 location 中不能再嵌套其它的命名 location。

Nginx URL匹配顺序

  1. nginx 用两层指令匹配请求URL,

  2. 第一层匹配:使用server指令,通过域名,ip和端口来做第一层匹配,当找到匹配的 server 后就进入此 server 的 location 匹配。

  3. 第二层:location 的匹配并不完全按照其在配置文件中出现的顺序来匹配,请求 URI 会按如下规则进行匹配:

    1. 先精准匹配 = , 精准匹配成功则会立即停止其他类型的匹配
    2. 没有精准匹配成功时,进行前缀匹配。先查找带有 ^~ 的前缀匹配,带有 ^~ 的前缀匹配成功则立即停止其他类型匹配
    3. 前缀匹配未成功,再进行普通前缀匹配(不带参数 ^~ )成功则会暂存,继续查找正则匹配
    4. = 和 ^~ 均未匹配成功前提下,查找正则匹配 ~ 和 ~* 。当同时有多个正则匹配时,按其在配置文件中出现的先后顺序优先匹配,命中则立即停止其他类型匹配
    5. 所有正则匹配均未成功时,返回步骤(2)中暂存的普通前缀匹配(不带参数 ^~ )结果;
  4. 匹配规则优先级从高到低依次

    location =    # 精准匹配,优先级最高
    location ^~   # 带参前缀匹配
    location ~    # 正则匹配(区分大小写)
    location ~*   # 正则匹配(不区分大小写)
    location /a   # 普通前缀匹配,优先级低于带参数前缀匹配。
    location /    # 任何没有匹配成功的,都会匹配这里处理,优先级最低
    

Nginx URL匹配顺序样例

location = / 
    # 配置A

 
location / 
    # 配置B

 
location /user/ 
    # 配置C

 
location ^~ /images/ 
    # 配置D

 
location ~* \\.(gif|jpg|jpeg|png)$ 
    # 配置E

  1. 请求 / 精准匹配 A,不再往下查找
  2. 请求 /index.html 匹配 B。首先查找匹配的前缀字符,找到最长匹配是配置 B,接着又按照顺序查找匹配的正则。结果没有找到,因此使用先前标记的最长匹配,即配置 B。
  3. 请求 /user/index.html 匹配 C。首先找到最长匹配 C,由于后面没有匹配的正则,所以使用最长匹配C。
  4. 请求 /user/1.jpg 匹配 E。首先进行前缀字符的查找,找到最长匹配项 C,继续进行正则查找,找到匹配项 E,因此使用 E。
  5. 请求 /images/1.jpg 匹配 D。首先进行前缀字符的查找,找到最长匹配 D。但是,特殊的是它使用了 ^~ 修饰符,不再进行接下来的正则的匹配查找
  6. 请求 /documents/about.html 匹配 B。因为 B 表示任何以 / 开头的 URL 都匹配。在上面的配置中,只有B能满足,所以匹配 B。

location配置块指令

  1. ·proxy_pass指令用于设置代理服务器的映射地址,映射地址可以使用http或者https协议,映射地址可以使用域名,IP,以及可选的端口号

    例如:
    proxy_pass http://localhost:8080/demo/mng/;
    proxy_cookie_path;proxy_cookie_path path replacement;
    在单词 “unix” 之后指定并用冒号括起来的 UNIX 域套接字路径:
    proxy_pass http://unix:/tmp/backend.socket:/uri/;
    
  2. proxy_cookie_path指令用于改变cookie的路径

    语法
    proxy_cookie_path path replacement;
    path:是要替换的路径
    replacement:就是要替换的值
    
    样例
    location /example2 
    proxy_pass http://localhost:8080/demo/mng/;
    proxy_cookie_path /demo /;
    
  3. proxy_connect_timeout指令定义与代理服务器建立连接的超时时间,注意:这个超时时间通常不能超过 75 秒

以上是关于Nginx的主要内容,如果未能解决你的问题,请参考以下文章

将 nginx rtmp 片段发送到 WebRTC

text 有用的nginx命令和片段

linux学习:Nginx--常见功能配置片段与优化-06

HLS NGINX-RTMP [错误] 1281#0:* 58 hls:强制片段拆分:10.002 秒

Nginx 跨域

Nginx配置文件详细介绍