zoukankan      html  css  js  c++  java
  • nginx configuration

    Beginner's Guide

     

    proxies    代理人,保险代理人,是干活的哪个哥们。(本文中称作 “后台代理”)
    
    proxy    代理,保险代理公司,是业务,代理业务。(本文中称作 “代理”)
    
    nginx    配置文件有一堆堆的指令构成,指令分为 简单指令和快指令。指令由参数名(指令名)和参数构成。

    关于选项和参数的概念,在本文描述的 nginx 配置与 Linux 命令行命令,以及 Windows 命令行命令是一致的。(argor 个人认为的^_^)

     

       

      

    配置文件的结构

    • 配置文件由容器指令和简单指令组成。
    • 简单指令,由空格分隔指令名和参数,以分号结尾。
    • 容器指令,由一对大括号代替分号。
    • 井号开头行,表示注释。
      # 这是主容器
      events {
      
      }
      
      http {
          server {
              location {
      
              }
          }
      }
      

        主容器包含:events、http。……

     

    静态资源发布

    • 响应 http://localhost/images/demo1.png 请求,返回 /data/images/demo1.png
    • 响应 URI 不是以 /images 开头的请求,返回 /data/www 下的内容
    • 请求 http://localhost/hello.index,在 /data/www 下没有 hello.index 时返回 404
    • 请求 http://localhost,没有 index.html 时,返回 403
      server {
          location / {
              root /data/www;
          }
      
          location /images/ {
              root /data;
          }
      }
      

         location 响应时,会把 uri 加到 root 指令的参数上去。
         location 响应请求时,最长匹配优先。

    • 官方文档

     

    设置简单代理服务器

    • 配置代理服务,响应请求转发到后台代理。
    • 设定一个后台代理
      server {
          listen 8080;
          root /data/up1;
      
          location / {
          }
      }
    • 创建 server 块指令,放入 proxy_pass 指令。

      server {
          location / {
              proxy_pass http://localhost:8080;
          }
      
          location ~ .(gif|jpg|png)$ {
              root /data/images;
          }
      }
      

        代理模式:响应请求 http://localhost/ 会被发送到后台代理由 http://localhost:8080 来响应并返回。
        图片匹配:响应请求 http://localhost/demo1.png 会返回本地目录 /data/images/demo1.png
        location 优先最长精确匹配,然后查找正则表达式,最后迁就短匹配。
        这个代理配置,过滤请求 .gif、.png、.jpg 由本地目录响应。转发其他请求到后台代理。

    •  官方文档  

     

    fastCGI代理 

     

     

     

    Admin's Guide

     

    Configuring Nginx as a Web Server

    • 虚拟主机用 server 指令定义在 http 容器。
    • 虚拟主机常常包含 listen 指令,用来指定监听的地址和端口(Unix 套接字和路径)。
      1.没有指定端口,使用默认端口 80。没有地址,默认监听全部地址。
      2.根本就没有 listen 指令,标准端口 80/tcp,默认端口 8000/tcp 被启用在全部 ip 端口。
      3.连 server 都没有,……?自己测,上边叙述的关于 listen 的情况是有 server 的。
      server {
          listen 127.0.0.1:8001;
      }
      

        

    • 当有多个 server 匹配了一致的 IP address 和 port 时,nginx 依据 http 请求头的 Host 信息检查 server_name 指令。
      server_name 的参数允许写全名、通配符、正则表达式。匹配顺序参考官方文档,略……
      server {
          listen 80;
          server_name *.argor.cn;
      }
      

        

      依据 server_name 指令,仍然没有匹配到合适的 server 响应请求,默认主机出场。
      默认主机的:带了 default_server 参数的 listen 指令,或者没有指定时,位于 nginx.conf 第一个 server 就是。
      server {
          listen 80 default_server;
          # xixi
      }
      

       

    • nginx 有本事把流量转发给不同的后台代理,亦或为不同的 URI 响应不一样的 本地文件。这一切都全靠 server 中的 location 指令。
      location 的本事是把特定的请求发送到相应的后台代理,发送其他请求到该去……,响应该交付的本地文件。
      location 可以完全解读【请求头】信息。该指令有两类参数:pathname、正则表达式。
      location /data/ {
          # pathname...
      }
      
      location ~ .html? {
          # re
      }
      

       匹配优先级参与官文。 

      在 location 指令块中,可以定义如何解读一个 request(是响应本地静态资源,还是转发请求到后台代理)。

      server {
          # 静态资源本地处理,采用 pathname 的方式,有个暗语:start with。
          location /images/ {
              root /data;
          }
      
          # ……转发后台代理
          location / {
              proxy_pass http://www1.argor.cn;
          }
      }
      

        root 指令,指定文件系统路径 /data/images 来响应静态资源。
             proxy_pass 指令,转发 location 匹配的请求到后台代理,并且指明后台代理如何匹配。

      使用 return 指令,可以立即返回错误代码、或者重定型信息。

      server {
          location /error/ {
              return 403;
          }
      
          location /baidu/ {
              return 301 https://baidu.com;
          }
      }
      

        

    • 请求地址重写 rewrite 指令,该指令允许在【location 中】,或【server 中】多次出现。
      rewrite 包含一个选项两个参数。头一个参数为正则匹配,后一个参数是替换。选项作为第三个参数,表示动作【放弃处理、继续重写、转发】。

    • HTTP响应重写 sub_filter 指令。
      location / {
          sub_filter        'href="http://127.0.0.1:8080/'        'href="https://$host/';
          sub_filter        'img src="http://127.0.0.1:8080/'   'href="https://$host/';
          sub_filter_once on; #连续处理 sub_filter
      }
      

              把 http 响应修改为 https,私网地址修改为 hostname。
              相同的处理项目,不会被后续配置覆盖。

    • 异常处理 error_page

     

    Serving Static Content

    • 根指令 root,允许出现在 http{ }、server{ }、location{ } 指令块。
      在 root 没有被覆盖设定的情况下,逐级继承。
      #以继承的视角,理解下这个配置
      server {
          root /data/www;
      
          location / {
          }
      
          location /images/ {
          }
      
          location ~ .(mp3|mp4)$ {
              root /www/media;
          }
      
      }
      

        该虚拟主机,以 /images/ 开头的 URI 继承了 server 的 root 指令参数。
             而以 .mp3 或 .mp4 结尾的 URI 重写了 root 的指令参数。

       
    • 索引指令 index,定义索引文件名,默认 index.html。
      # 首页索引文件
      location / {
          index main.html;
      }
      
      # 目录浏览
      location /iso {
          root /data/;
          autoindex on;
      }
      

        
      index 指令允许指定多个参数,Nginx 对多个索引名逐一搜索检查是否存在。把最先找到的 index 参数追加到 URI 进行内部重定向。
      内部重定向,有可能导致结果发生断崖式逆转。

      location / {
          root /data;
          index index.html index.php;
      }
      
      location ~ .php {
          fastcgi_pass localhost:8000;
          #...
      }
      

        当 index.html 不存在时,却找到了 index.php,这个时候的内部重定向,会导致本次请求的 URI 被转发出去。

    • try_files 指令,可以检查是否存在某个指定的文件或目录。
      存在,内部重定向。不存在,返回状态码。

     

    Nginx Reverse Proxy 

    • Passing a Request to a Proxied Server
      在 location 中使用 proxy_pass 指令,转发请求到 HTTP 后台代理。
      #转发http时,可以附带 uri
      location /php {
          proxy_pass http://www1.argor.cn/link/;
      }
      
      #还可以附带 端口
      location /java {
          proxy_pass http://argor.top:8080;
      }
      

        代理转发时带有 uri,请求 http://localhost:80/php/getList 被转发到 http://www1.argor.cn/link/getList。
        没有 uri,转发完整的 uri,不会发生替换。

      转发非http时,使用 **_pass 指令。
      proxy_pass 还可以指向一个后台代理服务器组。

    • Passing Request Headers
      默认情况下,Nginx 会重写两个请求头参数:Host、Connection。并且,剪除空值参数。
      代理会把 connection 关闭。
      代理会重写 Host 为代理自己的信息。通常需要阻止一下:
      location /some/path/ {
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          #proxy_pass .....;
      }
      

        因为代理的默认行为,要是需要不传递某个请求头参数时,就可以选择性置空。

      location /some/path/ {
          proxy_set_header Accept-Encoding "";
          #proxy_pass http://......
      }
      

        

    • Choosing an Outgoing IP Address
      location /app1/ {
          proxy_bind 127.0.0.1;
          proxy_pass http://example.com/app1/;
      }
      
      location /app2/ {
          proxy_bind 127.0.0.2;
          proxy_pass http://example.com/app2/;
      }
      
      location /app3/ {
          proxy_bind $server_addr;
          proxy_pass http://example.com/app3/;
      }
      

        

       

    Nginx SSL 

    • HTTPS
      在 server 的 listen 指令附加 ssl 参数,并且使用 ssl_certificate、ssl_certificate_key 指定证书名称和密钥名称(相对路径为nginx配置的root)。
      server {
          listen              443 ssl;
          server_name         www.example.com;
          ssl_certificate     www.example.com.crt;
          ssl_certificate_key www.example.com.key;
      # 下边两项为 nginx 默认值。 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; #... }

        

    • SSL 会消耗额外的 cpu 资源。存在大量的客户端时,会伴随大量的 SSL 握手过程。
      worker_processes auto;
      
      http {
          # 加缓存、延长超时
      # 1m的缓存,大概可容纳 4000 个会话。 ssl_session_cache shared:SSL:10m;
      # 如果配置超时 4h,大概需要 20MB 缓存。 ssl_session_timeout 10m; server { listen 443 ssl; server_name www.argor.cn; keepalive_timeout 70;
      # 握手超时默认 60s。太长会导致失败等待过久,太短会导致握手失败。
      ssl_handshake_timeout 10s; ssl_certificate www.argor.cn.crt; ssl_certificate_key www.argor.cn.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; #... } }

        

    • 接受 tcp 连接的负载均衡 ssl

      stream {
          upstream stream_backend {
               server backend1.example.com:12345;
               server backend2.example.com:12345;
               server backend3.example.com:12345;
          }
      
          server {
              listen                443 ssl;
              proxy_pass            stream_backend;
      
              ssl_certificate       /etc/ssl/certs/server.crt;
              ssl_certificate_key   /etc/ssl/certs/server.key;
              ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
              ssl_ciphers           HIGH:!aNULL:!MD5;
              ssl_session_cache     shared:SSL:20m;
              ssl_session_timeout   4h;
              ssl_handshake_timeout 30s;
              #...
           }
      }
      

        

       

     

    高可用

    • 基于 Keepalived 实现 Nginx 的高可用。 
    • 有些长,请移步...

     

     

     

    一切代码都是为了生活,一切生活都是调剂
  • 相关阅读:
    JavaScript教程——JavaScript 的基本语法(标识符)
    ECMAScript 6 入门——ES6 声明变量的六种方法
    JavaScript教程——数据类型概述
    对称机密算法与非对称机密算法
    C语言提高 (2) 第二天 用指针对字符串进行操作
    C语言提高 (1) 第一天 数据类型本质与内存四区
    关于内存地址和内存空间的理解(转)
    为什么对数组处理的函数需要传递数组长度
    Unicode编码,解释UCS、UTF、BMP、BOM等名词
    上海
  • 原文地址:https://www.cnblogs.com/argor/p/7919232.html
Copyright © 2011-2022 走看看