关于nginx:彻底搞懂-Nginx-五大应用场景出去吹牛逼再也不担心了

0次阅读

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

一:HTTP 服务器

Nginx 自身也是一个动态资源的服务器,当只有动态资源的时候,就能够应用 Nginx 来做服务器,如果一个网站只是动态页面的话,那么就能够通过这种形式来实现部署。

1、首先在文档根目录 Docroot(/usr/local/var/www)下创立 html 目录, 而后在 html 中放一个 test.html;

2、配置 nginx.conf 中的 server
user mengday staff;

http {
    server {
        listen       80;
        server_name  localhost;
        client_max_body_size 1024M;

        # 默认 location
        location / {
            root   /usr/local/var/www/html;
            index  index.html index.htm;
        }
    }
}
3、拜访测试
  • http://localhost/ 指向 /usr/local/var/www/index.html, index.html 是装置 nginx 自带的 html
  • http://localhost/test.html 指向 /usr/local/var/www/html/test.html

留神:如果拜访图片呈现 403 Forbidden 谬误,可能是因为 nginx.conf 的第一行 user 配置不对,默认是 #user nobody; 是正文的,linux 下改成 user root; macos 下改成 user 用户名 所在组; 而后从新加载配置文件或者重启,再试一下就能够了,用户名能够通过 who am i 命令来查看。

4、指令简介
  • server : 用于定义服务,http 中能够有多个 server 块
  • listen : 指定服务器侦听申请的 IP 地址和端口,如果省略地址,服务器将侦听所有地址,如果省略端口,则应用规范端口
  • server_name : 服务名称,用于配置域名
  • location : 用于配置映射门路 uri 对应的配置,一个 server 中能够有多个 location, location 前面跟一个 uri, 能够是一个正则表达式, / 示意匹配任意门路, 当客户端拜访的门路满足这个 uri 时就会执行 location 块外面的代码
  • root : 根门路,当拜访 http://localhost/test.html,“/test.html”会匹配到”/”uri, 找到 root 为 /usr/local/var/www/html,用户拜访的资源物理地址 =root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.html
  • index : 设置首页,当只拜访 server_name 时前面不跟任何门路是不走 root 间接走 index 指令的;如果拜访门路中没有指定具体的文件,则返回 index 设置的资源,如果拜访 http://localhost/html/ 则默认返回 index.html
5、location uri 正则表达式
.:匹配除换行符以外的任意字符
?:反复 0 次或 1 次
+:反复 1 次或更屡次
*:反复 0 次或更屡次
\d:匹配数字
^:匹配字符串的开始
$:匹配字符串的完结
{n}:反复 n 次
{n,}:反复 n 次或更屡次:匹配单个字符 c
[a-z]:匹配 a - z 小写字母的任意一个
(a|b|c) : 属线示意匹配任意一种状况,每种状况应用竖线分隔,个别应用小括号括括住,匹配合乎 a 字符 或是 b 字符 或是 c 字符的字符串
\ 反斜杠:用于本义特殊字符

小括号 () 之间匹配的内容,能够在前面通过 $1 来援用,$2 示意的是后面第二个 () 里的内容。正则外面容易让人困惑的是 \ 本义特殊字符。

二、动态服务器

在公司中常常会遇到动态服务器,通常会提供一个上传的性能,其余利用如果须要动态资源就从该动态服务器中获取。

1、在 /usr/local/var/www 下别离创立 images 和 img 目录,别离在每个目录下放一张 test.jpg

http {
    server {
        listen       80;
        server_name  localhost;


        set $doc_root /usr/local/var/www;

        # 默认 location
        location / {
            root   /usr/local/var/www/html;
            index  index.html index.htm;
        }

        location ^~ /images/ {root $doc_root;}

       location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {root $doc_root/img;}
    }
}

自定义变量应用 set 指令,语法 set 变量名值; 援用应用变量名值; 援用应用变量名; 这里自定义了 doc_root 变量。

动态服务器 location 的映射个别有两种形式:

  • 应用门路,如 /images/ 个别图片都会放在某个图片目录下,
  • 应用后缀,如 .jpg、.png 等后缀匹配模式

拜访 http://localhost/test.jpg 会映射到 $doc_root/img

拜访 http://localhost/images/test.jpg 当同一个门路满足多个 location 时,优先匹配优先级高的 location,因为 ^~ 的优先级大于 ~, 所以会走 /images/ 对应的 location

常见的 location 门路映射门路有以下几种:

  • = 进行一般字符准确匹配。也就是齐全匹配。
  • ^~ 前缀匹配。如果匹配胜利,则不再匹配其余 location。
  • ~ 示意执行一个正则匹配,辨别大小写
  • ~* 示意执行一个正则匹配,不辨别大小写
  • /xxx/ 惯例字符串门路匹配
  • / 通用匹配,任何申请都会匹配到
location 优先级

当一个门路匹配多个 location 时到底哪个 location 能匹配到时有优先级程序的,而优先级的程序于 location 值的表达式类型无关,和在配置文件中的先后顺序无关。雷同类型的表达式,字符串长的会优先匹配。

以下是按优先级排列阐明:

  • 等号类型(=)的优先级最高。一旦匹配胜利,则不再查找其余匹配项,进行搜寻。
  • ^~ 类型表达式,不属于正则表达式。一旦匹配胜利,则不再查找其余匹配项,进行搜寻。
  • 正则表达式类型(~ ~*)的优先级次之。如果有多个 location 的正则能匹配的话,则应用正则表达式最长的那个。
  • 惯例字符串匹配类型。按前缀匹配。
  • / 通用匹配,如果没有匹配到,就匹配通用的

优先级搜寻问题:不同类型的 location 映射决定是否持续向下搜寻

  • 等号类型、^~ 类型:一旦匹配上就进行搜寻了,不会再匹配其余 location 了
  • 正则表达式类型(~ ~*), 惯例字符串匹配类型 /xxx/ : 匹配到之后,还会持续搜寻其余其它 location,直到找到优先级最高的,或者找到第一种状况而进行搜寻

location 优先级从高到底:

(location =) > (location 残缺门路) > (location ^~ 门路) > (location ~,~* 正则程序) > (location 局部起始门路) > (/)
location = / {
    # 准确匹配 /,主机名前面不能带任何字符串 /
    [configuration A]
}
location / {
    # 匹配所有以 / 结尾的申请。# 然而如果有更长的同类型的表达式,则抉择更长的表达式。# 如果有正则表达式能够匹配,则优先匹配正则表达式。[configuration B]
}
location /documents/ {
    # 匹配所有以 /documents/ 结尾的申请,匹配合乎当前,还要持续往下搜寻。# 然而如果有更长的同类型的表达式,则抉择更长的表达式。# 如果有正则表达式能够匹配,则优先匹配正则表达式。[configuration C]
}
location ^~ /images/ {
    # 匹配所有以 /images/ 结尾的表达式,如果匹配胜利,则进行匹配查找,进行搜寻。# 所以,即使有合乎的正则表达式 location,也不会被应用
    [configuration D]
}

location ~* \.(gif|jpg|jpeg)$ {
    # 匹配所有以 gif jpg jpeg 结尾的申请。# 然而 以 /images/ 结尾的申请,将应用 Configuration D,D 具备更高的优先级
    [configuration E]
}

location /images/ {
    # 字符匹配到 /images/,还会持续往下搜寻
    [configuration F]
}


location = /test.htm {
    root   /usr/local/var/www/htm;
    index  index.htm;
}

留神:location 的优先级与 location 配置的地位无关

三、反向代理

反向代理应该是 Nginx 应用最多的性能了,反向代理 (Reverse Proxy) 形式是指以代理服务器来承受 internet 上的连贯申请,而后将申请转发给外部网络上的服务器,并将从服务器上失去的后果返回给 internet 上申请连贯的客户端,此时代理服务器对外就体现为一个反向代理服务器。

简略来说就是实在的服务器不能间接被内部网络拜访,所以须要一台代理服务器,而代理服务器能被内部网络拜访的同时又跟实在服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。

反向代理通过 proxy_pass 指令来实现。

启动一个 Java Web 我的项目,端口号为 8081

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass http://localhost:8081;
        proxy_set_header Host $host:$server_port;
        # 设置用户 ip 地址
         proxy_set_header X-Forwarded-For $remote_addr;
         # 当申请服务器出错去寻找其余服务器
         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; 
    }

} 

当咱们拜访 localhost 的时候,就相当于拜访 localhost:8081 了

四、负载平衡

负载平衡也是 Nginx 罕用的一个性能,负载平衡其意思就是摊派到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业要害应用服务器和其它要害工作服务器等,从而共同完成工作工作。

简略而言就是当有 2 台或以上服务器时,依据规定随机的将申请散发到指定的服务器上解决,负载平衡配置个别都须要同时配置反向代理,通过反向代理跳转到负载平衡。而 Nginx 目前反对自带 3 种负载平衡策略,还有 2 种罕用的第三方策略。

负载平衡通过 upstream 指令来实现。

1. RR(round robin : 轮询 默认)

每个申请按工夫程序逐个调配到不同的后端服务器,也就是说第一次申请调配到第一台服务器上,第二次申请调配到第二台服务器上,如果只有两台服务器,第三次申请持续调配到第一台上,这样循环轮询上来,也就是服务器接管申请的比例是 1:1,如果后端服务器 down 掉,能主动剔除。轮询是默认配置,不须要太多的配置

同一个我的项目别离应用 8081 和 8082 端口启动我的项目

upstream web_servers {  
   server localhost:8081;  
   server localhost:8082;  
}

server {
    listen       80;
    server_name  localhost;
    #access_log  logs/host.access.log  main;


    location / {
        proxy_pass http://web_servers;
        # 必须指定 Header Host
        proxy_set_header Host $host:$server_port;
    }
 }

拜访地址依然能够取得响应 http://localhost/api/user/log…,这种形式是轮询的

2. 权重

指定轮询几率,weight 和拜访比率成正比, 也就是服务器接管申请的比例就是各自配置的 weight 的比例,用于后端服务器性能不均的状况, 比方服务器性能差点就少接收点申请,服务器性能好点就多解决点申请。

upstream test {
    server localhost:8081 weight=1;
    server localhost:8082 weight=3;
    server localhost:8083 weight=4 backup;
}

示例是 4 次申请只有一次被调配到 8081 上,其余 3 次调配到 8082 上。backup 是指热备,只有当 8081 和 8082 都宕机的状况下才走 8083

3. ip_hash

下面的 2 种形式都有一个问题,那就是下一个申请来的时候申请可能散发到另外一个服务器,当咱们的程序不是无状态的时候(采纳了 session 保留数据),这时候就有一个很大的很问题了,比方把登录信息保留到了 session 中,那么跳转到另外一台服务器的时候就须要从新登录了,所以很多时候咱们须要一个客户只拜访一个服务器,那么就须要用 iphash 了,iphash 的每个申请按拜访 ip 的 hash 后果调配,这样每个访客固定拜访一个后端服务器,能够解决 session 的问题。

upstream test {
    ip_hash;
    server localhost:8080;
    server localhost:8081;
}
4. fair(第三方)

按后端服务器的响应工夫来调配申请,响应工夫短的优先调配。这个配置是为了更快的给用户响应

upstream backend {
    fair;
    server localhost:8080;
    server localhost:8081;
}
5. url_hash(第三方)

按拜访 url 的 hash 后果来调配申请,使每个 url 定向到同一个后端服务器,后端服务器为缓存时比拟无效。在 upstream 中退出 hash 语句,server 语句中不能写入 weight 等其余的参数,hash_method 是应用的 hash 算法

upstream backend {
    hash $request_uri;
    hash_method crc32;
    server localhost:8080;
    server localhost:8081;
}

以上 5 种负载平衡各自实用不同状况下应用,所以能够依据理论状况抉择应用哪种策略模式, 不过 fair 和 url_hash 须要装置第三方模块能力应用。

五、动静拆散

动静拆散是让动静网站里的动静网页依据肯定规定把不变的资源和常常变的资源辨别开来,动静资源做好了拆分当前,咱们就能够依据动态资源的特点将其做缓存操作,这就是网站动态化解决的外围思路。

upstream web_servers {  
       server localhost:8081;  
       server localhost:8082;  
}

server {
    listen       80;
    server_name  localhost;

    set $doc_root /usr/local/var/www;

    location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {root $doc_root/img;}

    location / {
        proxy_pass http://web_servers;
        # 必须指定 Header Host
        proxy_set_header Host $host:$server_port;
    }

    error_page 500 502 503 504  /50x.html;  
    location = /50x.html {root $doc_root;}

 }

六、其余

1.return 指令

返回 http 状态码 和 可选的第二个参数能够是重定向的 URL

location /permanently/moved/url {return 301 http://www.example.com/moved/here;}
2. rewrite 指令

重写 URI 申请 rewrite,通过应用 rewrite 指令在申请解决期间屡次批改申请 URI,该指令具备一个可选参数和两个必须参数。

第一个 (必须) 参数是申请 URI 必须匹配的正则表达式。

第二个参数是用于替换匹配 URI 的 URI。

可选的第三个参数是能够进行进一步重写指令的解决或发送重定向 (代码 301 或 302) 的标记

location /users/ {rewrite ^/users/(.*)$ /show?user=$1 break;
}
3. error_page 指令

应用 error_page 指令,您能够配置 NGINX 返回自定义页面以及错误代码,替换响应中的其余错误代码,或将浏览器重定向到其余 URI。在以下示例中,error_page 指令指定要返回 404 页面错误代码的页面(/404.html)。

error_page 404 /404.html;
4. 日志

拜访日志:须要开启压缩 gzip on; 否则不生成日志文件,关上 log_format、access_log 正文

log_format  main  '$remote_addr - $remote_user [$time_local]"$request"''$status $body_bytes_sent "$http_referer" ''"$http_user_agent""$http_x_forwarded_for"';

access_log  /usr/local/etc/nginx/logs/host.access.log  main;

gzip  on;
5. deny 指令
# 禁止拜访某个目录
location ~* \.(txt|doc)${
    root $doc_root;
    deny all;
}   
6. 内置变量

nginx 的配置文件中能够应用的内置变量以美元符 $ 开始,也有人叫全局变量。其中,局部预约义的变量的值是能够扭转的。

  • $args:# 这个变量等于申请行中的参数,同 $query_string
  • $content_length:申请头中的 Content-length 字段。
  • $content_type:申请头中的 Content-Type 字段。
  • $document_root:以后申请在 root 指令中指定的值。
  • $host:申请主机头字段,否则为服务器名称。
  • $http_user_agent:客户端 agent 信息
  • $http_cookie:客户端 cookie 信息
  • $limit_rate:这个变量能够限度连贯速率。
  • $request_method:客户端申请的动作,通常为 GET 或 POST。
  • $remote_addr:客户端的 IP 地址。
  • $remote_port:客户端的端口。
  • $remote_user:曾经通过 Auth Basic Module 验证的用户名。
  • $request_filename:以后申请的文件门路,由 root 或 alias 指令与 URI 申请生成。
  • $scheme:HTTP 办法(如 http,https)。
  • $server_protocol:申请应用的协定,通常是 HTTP/1.0 或 HTTP/1.1。
  • $server_addr:服务器地址,在实现一次零碎调用后能够确定这个值。
  • $server_name:服务器名称。
  • $server_port:申请达到服务器的端口号。
  • $request_uri:蕴含申请参数的原始 URI,不蕴含主机名,如:”/foo/bar.php?arg=baz”。
  • $uri:不带申请参数的以后 URI,$uri 不蕴含主机名,如”/foo/bar.html”。
  • $document_uri:与 $uri 雷同

作者:vbirdbest
blog.csdn.net/vbirdbest/article/details/80913319

正文完
 0