Nginx进阶

第 2 章 Nginx进阶

2.1 Nginx快速入门

学习目标:

应用 nginx环境部署

记住 nginx配置结构及其访问原理

应用 server配置段常见配置项

应用 location配置格式

了解 location配置规则的优先级

2.1.1 Nginx简介

Nginx(发音同 engine x)是一款基于异步框架的轻量级/高性能的Web 服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔·赛索耶夫)所开发,最初供俄国大型网站Rambler.ru及搜寻引擎Rambler使用。

 

Nginx特点

优点:

高并发量:基于 epoll/kqueue 模型开发,支持高并发量,官方说其支持高达 5w 并发连接数的响应

内存消耗少:善于处理静态文件,相较于其他web(比如:apache),占用更少的内存及资源

简单稳定:配置简单(一个conf文件),运行简单(nginx命令),而且运行稳定

模块化程度高:功能模块插件化设计,可以自由配置相应的功能。

支持Rwrite重写规则:能够根据域名、URL等请求关键点,实现定制化的高质量分发。

低成本:Nginx的负载均衡功能很强大而且免费开源,相较于几十万的硬件负载均衡器成本相当低。 

支持多系统:Nginx代码完全用C语言从头写成,可以在各系统上编译并使用。

缺点:

动态处理差:nginx善于处理静态文件,但是处理动态页面相较于Apache之类重量级的web软件能力稍欠缺。

rewrite弱:虽然nginx支持rewrite功能,但是相较于Apache之类重量级的web软件能力稍欠缺。

2.1.2 Nginx部署

Nginx软件部署

安装Nginx软件

方法一:快

apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-dev

apt-get install nginx -y

 

方法二:定制标准高

编译安装

检查效果:

netstat -tnulp | grep nginx

 

浏览器查看

服务相关命令

systemctl start|stop|reload|... nginx

/etc/init.d/nginx start|stop|reload|...

/usr/sbin/nginx ...

nginx -V

#nginx服务相关命令

nginx -V

nginx -v

nginx -s stop

nginx -s reload

nginx -t                   #检查默认配置文件

nginx -t -c file.conf           #指定配置文件进行检查

 

 

移除相关命令:

查看和nginx相关软件

dpkg --get-selections|grep nginx

 

移除nginx,包括相关文件

apt-get --purge remove nginx

apt-get --purge remove nginx-common

apt-get --purge remove nginx-core

 

 

Nginx配置简介

nginx软件目录:

工作目录:/etc/nginx

执行文件: /usr/sbin/nginx

日志目录:/var/log/nginx

启动文件:/etc/init.d/nginx

web目录:/var/www/html/,首页文件是index.nginx-debian.html

 /usr/share/nginx/html/ 首页文件是index.html

 

nginx配置文件:

默认文件:

/etc/nginx/nginx.conf

其他目录:

/etc/nginx/{sites-available/sites-enabled/conf.d}

 

文件结构:

       全局配置段

       http{配置段

           server{配置段          项目或者应用

              location{配置段    url配置
          
          }
        }
      }

 

 

Nginx访问原理

 

2.1.3 配置详解

全局配置段

主要是全局性的和服务级别的属性配置,常见的主要有以下几种设置:

user                    #设置使用用户(worker)

worker_processes       #进行增大并发连接数的处理 跟cpu保持一致 八核设置八个

error_log               #nginx的错误日志

pid                    # nginx服务启动时候pid

events                  #定义事件相关的属性

worker_connections    #一个进程允许处理的最大连接数

use                  # 定义使用的内核模型 

http配置段

主要配置server通用的一些配置

include mime.types;                       # 文件扩展名与文件类型映射表

default_type application/octet-stream;      # 默认文件类型

sendfile on;                                # 开启高效文件传输模式。

autoindex on;                               # 开启目录列表访问,合适下载服务器,默认关闭。

tcp_nopush on;                              # 防止网络阻塞

tcp_nodelay on;                            # 防止网络阻塞

keepalive_timeout 120;                      # 长连接超时时间,单位是秒

gzip on;                                    # 开启gzip压缩输出 

Server常见配置属性

常见样式

server {

    listen 端口;

    server_name 主机名;

    ...

}

 

server配置段最重要的属性是listen和server_name。它们都是用于匹配并处理请求的。

listen属性

作用:定义Server监听的ip和port,当ip/port匹配时候才进行下一步匹配

表现形式:

形式

描述

示例

完整示例

IP:Port

地址精确表示样式

listen 10.10.10.10:99

listen 10.10.10.10:99

IP

自动监听 IP:80地址

listen 10.10.10.10

listen 10.10.10.10:80

Port

自动监听 全地址:Port

listen 99或 [::]:99

listen 0.0.0.0:99

default_server

自动使用默认的地址

listen default_server

listen localhost:80

使用原则:

首先将所有样式补全成IP:Port,然后匹配,匹配Server多,那么接着使用Server_name匹配

server_name属性

作用:定义Server监听的域名,当域名匹配时候才进行下一步操作

表现形式:

格式

完整样式

前缀正则样式

后缀正则样式

禁止非法域名或IP

形式

www.example.com

*.example.com

www.example.*

_

使用原则:

优先使用完整样式,然后使用前缀正则样式,最后使用后缀正则样式,如果正则样式相同的时候,匹配最长,否则就走非法规则。

非法域名/IP,表示请求到该主机上一个不存在的IP或者域名

root属性

作用:定义Server相应请求的html文件所在路径

表现形式:

root /var/www/html;

index属性

作用:定义响应请求后返回的文件名称或格式

表现形式:

index index.html index.htm index.nginx-debian.html;

return属性

作用:定义响应请求后返回的http状态码

表现形式:

return       444;

 

location常见配置属性

location主要是根据Server匹配到的请求路径和关键字去响应和处理。

语法:

location optional_modifier location_match { ... }

location @name { ... }

其中:optional_modifier是匹配条件,location_match是匹配的样式,{}是要执行的操作。匹配条件主要有两种:正则/前缀字符。

 

匹配规则

正则匹配

类型

含义

匹配方式

优先级

样式

~|!~

普通正则-敏感|不敏感

正则符号

3

location ~ .(jpe?g)$ {}

~*|!~*

普通正则-不敏感|敏感

正则符号

3

location ~* .(jpe?g)$ {}

普通匹配

类型

含义

匹配方式

优先级

样式

=/路径

精确匹配

前缀

1

location = /image {}

^~

优先匹配

前缀

2

location ^~ /page {}

@

内部重定向

前缀

 

location @name {}

空 /

通用匹配

前缀

4

location / {}

使用原则:

前提:根据请求url,获取uri即除了域名/IP之外的部分,用于location匹配

如果有精确匹配,即 =/路径,找到匹配项后,结束匹配。

location = 路径 {}  或者  location 完整路径 {}

如果有优先匹配,即 ^~,找到匹配项后,结束匹配。

location ^~ 路径

如果有正则匹配,即 ~|!~|~*|!~*,找到匹配项后,不会终止继续匹配,直到找到合适的

location ~* 正则字符 {}

如果匹配到多个,则使用location_match最长的。

匹配示例

常见示例:

 

location = / {                location ~ \.(gif|jpg|png|js|css)$ {      location !~* \.xhtml$ {

   #精确规则A                       #正则规则D                                 #正则规则G

}                               }                                            }

location = /login {           location ~* \.png$ {                      location / {

   #精确规则B                       #正则规则E                                 #通用规则H

}                               }                                            }

location ^~ /static/ {       location !~ \.xhtml$ {

   #优先规则C                       #正则规则F

}                               }

访问效果如下:

访问根目录/, 比如http://a.com/ 将匹配规则A

访问 http://a.com/login 将匹配规则B

访问 http://a.com/static/a.html 将匹配规则C

访问 http://a.com/a.gif, http://a.com/b.png 规则D和E均适合,按顺序优先使用规则D,而 http://a.com/static/c.png 则优先匹配到规则C

       访问 http://a.com/a.PNG 则匹配规则E,因为规则E不区分大小写。

       访问 http://a.com/a.XHTML 使用规则F。

访问 http://a.com/category/id/1111 则最终匹配到规则H。

 

@name示例

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

location / {

    try_files $uri $uri/ @custom

}

location @custom {

    # ...do something

    # custom 命名的 location中不能再嵌套其它的命名location

}

 

关于URL尾部的/有如下注意事项:

1 location中的location_match字符有无"/"不受影响。/user/等同/user。

2 对于访问网站域名(http://sswang.com/),尾部有无"/"不受影响。因为浏览器会自动补全"/"。

3 对于访问网站域名后面的路径(http://sswang.com/other/)。尾部的"/"很重要。

URL尾部的"/"表示目录,没有"/"表示文件,而且文件找不到的话,会发生重定向。

/other/:表示服务器会自动去该目录下找对应的默认文件。

/other:表示服务器会先去找other文件,找不到的话会将other当成目录,重定向到/other/,去该目录下找默认文件。

 

location常见动作:

在location内部常用的功能属性非常多,常见的基本属性、临时跳转、访问控制、目录列表等。

基本属性

location / {

    root   /var/www/html;                   # 指定响应请求的文件所在路径

    index  index.php index.html index.htm;   # 指定响应请求的默认文件名称

    expires 7d;                             # 指定响应请求的文件过期时间,一般用于静态文件

    try_files $uri $uri/ =404;              # 如果root指定的路径下有查找的文件,就返回,否则报错

}

临时跳转

location = /test/ {

    return 302 http://sswang.com/;           # 访问旧url的时候,临时跳转到新url,两个url均不失效 

}

访问控制

location /nginx-status {

    stub_status on;                          # 开启nginx的状态页面,默认关闭

    allow 192.168.8.14;                      # 允许的访问地址

    deny all;                                # 默认禁止所有访问

}

注意:

    该功能依赖于ngx_http_stub_status_module 模块(默认没有安装,需要定制化安装)

目录列表

location /upload {

    alias   /var/www/upload;     # 指定查看文件列表路径(绝对路径)

    autoindex on;                  # 开启目录自动索引

    autoindex_exact_size off;    # 默认on,显示文件确切大小(bytes)。off表示显示文件的大概大小(kB/MB/...)

    autoindex_localtime on;      # 默认off,显示的文件时间为GMT时间。on表示显示文件的服务器时间

}

注意:

    该alias指定的目录下,不允许出现index属性指定的文件。

 

root VS alias

root 和 alias 所起的作用都是指定响应请求所用文件的路径,只是他们有些许的区别

    root   表示 location 匹配内容的相对路径

    alias 表示 一个绝对路径,而且必须以"/"结尾

一般情况下,在location /中配置root,在location /other中配置alias

效果一:                                 效果二:

location /img/ {                            location /img/ {

    alias /var/www/image/;                    root /var/www/image;

}                                             }

效果一:访问http://localhost/img/,nginx找/var/www/image/目录下的文件

效果二:访问http://localhost/img/,nginx找/var/www/image/img/目录下的文件

 root与alias配置路径时文件夹与路径名为一一对应关系;

/ ---> /html/

/img/ ---> /html/img/ 目录

location核心动作

Nginx的配置语法灵活,可控制度非常高。在0.7以后的版本中加入了一个try_files指令,配合命名location,可以部分替代原本常用的rewrite配置方式,提高解析效率。

指令语法

try_files file ... uri

try_files file ... =code

作用:

响应时按顺序查找file,找到则返回file内容,否则的话进行内部重定向(uri)或返回状态码(code)。

常见示例

如果能找到指定的uri那么就返回相应的内容,否则的话返回错误状态码404

try_files $uri $uri/ =404;

如果能找到指定的文件1/2.html那么就返回相应的内容,否则的话返回6.html文件内容

try_files 1.html 2.html /6.html;

如果能找到指定的uri那么就返回相应的内容,否则的话就内部重定向到后端名称为@backup的location

try_files $uri @backup;

注意:

如果最后一个地址是一个uri的话,那么这个uri必须是存在的,否则的话就出事了

 

2.2 Nginx进阶知识

学习目标:

了解 正向代理和反向代理

应用 nginx反向代理实践

应用 nginx负载均衡实践

应用 nginx日志定制实践

2.2.1 反向代理

代理是什么?

简单来说,我找一个中间人,代替我去做一件事情,只要他给我结果就可以。

代理一般分为两种:正向代理、反向代理

 

正向代理&反向代理

示意图

 

 

 

区别

从用途上来讲:

    正向代理-为局域网客户端向外访问Internet服务。可以使用缓冲特性减少网络使用率。

  反向代理-为局域网服务器向外提供Internet服务。可以使用负载平衡提高客户访问量。还可以基于高级URL策略和管理技术对服务进行高质量管控。

从安全性来讲:

  正向代理-必须采取安全措施确保内网客户端通过它访问外部网站。隐藏客户端的身份[A1] 

  反向代理-对外提供服务是透明的,客户端并不知道自己访问的是一个代理。隐藏服务端的身份[A2] 

 

nginx 代理模块

官方介绍

  官方资料:http://www.nginx.cn/doc/standard/httpproxy.html

  官方的代理属性很多,我们主要介绍proxy_pass和proxy_set_header属性

官方代码示例

  location / {

  : proxy_pass        http://localhost:8000;       # 设定请求跳转后的地址,可以使用hostname或IP:Port形式

  : proxy_set_header  X-Real-IP  $remote_addr;   # 后端请求携带原始请求的真实IP地址

  }

属性详解:

  proxy_pass 指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式

 

proxy_pass关键点

  proxy_pass后面的路径最后的/作用很重要!!!

示例代码:

  location /html/ {

    1 proxy_pass http://proxy.com;

      2 proxy_pass http://proxy.com/;

  }

假设我们访问的url是 http://domain.com/html/test.js,如何理解上述两种proxy_pass的区别呢?

对于 1 来说 proxy.com后面没有"/",表示"/html/" 请求(包括自己)后续的路径及其参数等关键字都由http://a.com/来处理,代理后的样式如下:

  http://proxy.com/html/test.js    

对于 2 来所 proxy.com后面有"/",表示"/html/" 请求后续的路径及其参数等关键字都由http://a.com/来处理,代理后的样式如下:

  http://proxy.com/test.js

nginx代理实践

代理的配置文件

~# vim /etc/nginx/conf.d/proxy.conf

server {

  listen 192.168.8.14:80;

  server_name www.sswang.com;

  location / {

    proxy_pass http://192.168.8.14:9999/hello/;

  }

}

后端服务配置文件

~# vim /etc/nginx/conf.d/hello.conf

server {

  listen 192.168.8.14:9999;

  location /hello/ {

    alias /var/www/html/hello/;

    try_files $uri $uri/ =404;

  }

}

准备后端服务文件

mkdir -p /var/www/html/hello/

echo '<h1>proxy_backend</h1>' > /var/www/html/hello/index.html

检查nginx配置后重载服务

/usr/sbin/nginx -t

systemctl reload nginx

netstat -tnulp | grep nginx

查看效果

 

 

 

2.2.2 负载均衡

负载均衡是什么?

我们之前使用proxy_pass的方式实现了nginx代理请求到后端的效果,随着我们的网站访问量越来越多,一个后端就不现实了,那么接下来我们应该如果在访问量日渐增大的情况下,满足线上业务的稳定呢?

解决方法就是:负载均衡

负载均衡简单说来人多力量大,打群架。

在nginx中的负载均衡主要有两种:四层负载(IP:Port)、七层负载(http://xxx)

 

nginx upstream模块

官方介绍

官方资料:http://www.nginx.cn/doc/standard/httpupstream.html

官方的代理属性很多,我们主要介绍upstream和ip_hash属性

官方代码示例

upstream backend  {

  server backend1.example.com weight=5;

  server backend2.example.com:8080;

  server unix:/tmp/backend3;

}

 

server {

  location / {

    proxy_pass  http://backend;

  }

}

属性详解:

upstream 主要是定义一个后端服务地址的集合列表,每个后端服务使用一个server命令表示

upstream {} 和 Server {} 两部分内容属于平级关系。

后端服务状态

在upstream模块中,可以使用server命令指定后端服务器的地址,同时还可以设置后端服务器在负载均衡调度中的状态,常用的状态有以下几种:

down: 表示当前server主机暂时不参与负载均衡。

backup:后备主机,当所有非backup机器出现故障或者繁忙的时候,才会请求backup机器。

max_fails:允许请求的最大失败数,默认为1,配合fail_timeout一起使用

fail_timeout:经历max_fails次失败后,暂停服务的时间,默认为10s。

 

nginx负载均衡实践

负载均衡配置文件

~# vim /etc/nginx/conf.d/upstream.conf

upstream backends {

  server 192.168.8.14:10086;

  server 192.168.8.14:10087;

  server 192.168.8.14:10088;

}

server {

  listen 80;

  server_name localhost;

  location / {

    proxy_pass http://backends;

  }

}

后端代理配置文件

~# vim /etc/nginx/conf.d/backend.conf

server {

  listen 192.168.8.14:10086;

  location / {

    root /var/www/html/hello/;

    try_files $uri $uri/ =404;

  }

}

server {

  listen 192.168.8.14:10087;

  location / {

    root /var/www/html/nihao/;

    try_files $uri $uri/ =404;

  }

}

server {

  listen 192.168.8.14:10088;

  location / {

    root /var/www/html/huanying/;

    try_files $uri $uri/ =404;

  }

}

准备后端服务文件

mkdir -p /var/www/html/hello/

echo '<h1>backend_hello</h1>' > /var/www/html/hello/index.html

mkdir -p /var/www/html/nihao/

echo '<h1>backend_nihao</h1>' > /var/www/html/nihao/index.html

mkdir -p /var/www/html/huanying/

echo '<h1>backend_huanying</h1>' > /var/www/html/huanying/index.html

检查nginx配置后重载服务

/usr/sbin/nginx -t

systemctl reload nginx

netstat -tnulp | grep nginx

注意:

因为课堂演示配置文件过多,而且重载次数过多,所以推荐每次进行新实践的时候,pkill nginx后再来启动,使用新的内存环境。

查看效果

~# for i in {1..100};do curl http://192.168.8.14;done

<h1>backend_hello</h1>

<h1>backend_nihao</h1>

<h1>backend_huanying</h1>

...

<h1>backend_hello</h1>

<h1>backend_nihao</h1>

<h1>backend_huanying</h1>

 

负载均衡调度算法

官方资料:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#example

Nginx提供的负载均衡策略有两种:

内置策略:nginx自带的算法

雨露均沾型:轮训、加权轮训、哈希

定向服务型:ip_hash、least_conn、cookie、route、lean、

商业类型:ntlm、least_time、queue、stick

扩展策略:各种结合业务场景自定义的算法或者第三方算法

自定义算法

第三方算法:fairurl_hash

常用算法简介:

轮询(默认):请求按顺序逐一分配到不同的后端服务器。

weight:指定轮询权重,值越大,分配到的几率就越高,适用于后端服务器性能不均衡情况。

ip_hash:按访问IP的哈希结果分配请求,分配后访客访问固定后端服务器,有效的解决动态网页会话共享问题。

fair:基于后端服务器的响应时间来分配请求,响应时间短的优先分配。

url_hash:按访问URL的哈希结果分配请求,使同URL定向到同一台后端服务器,可提高后端缓存服务器的效率。

 

加权轮训实践

修改负载均衡配置文件

~# vim /etc/nginx/conf.d/upstream.conf

upstream backends {

  server 192.168.8.14:10086 backup;

  server 192.168.8.14:10087 weight=1;

  server 192.168.8.14:10088 weight=2;

}

...

检查nginx配置后重载服务

/usr/sbin/nginx -t

systemctl reload nginx

netstat -tnulp | grep nginx

查看效果

~# for i in {1..100};do curl http://192.168.8.14;done

<h1>backend_nihao</h1>

<h1>backend_huanying</h1>

<h1>backend_huanying</h1>

...

<h1>backend_nihao</h1>

<h1>backend_huanying</h1>

<h1>backend_huanying</h1>

 

ip_hash实践

修改负载均衡配置文件

~# vim /etc/nginx/conf.d/upstream.conf

upstream backends {

  ip_hash;

  server 192.168.8.14:10086 ;

  ...

}

...

检查nginx配置后重载服务

/usr/sbin/nginx -t

systemctl reload nginx

netstat -tnulp | grep nginx

查看效果

~# for i in {1..100};do curl http://192.168.8.14;done

<h1>backend_huanying</h1>

...

<h1>backend_huanying</h1>

2.2.3 日志解析

日志功能简介

日志简介

Nginx默认提供了两个日志文件 access.log和error.log,通过access.log可以得到用户请求的相关信息;通过error.log可以获取某个web服务故障或其性能瓶颈等信息。

而且nginx的日志支持定制化格式,这样我们就可以根据实际的业务情况更好的高效工作。最常见的场景就是获取客户端的IP,记录用户访问量。

官方介绍:http://nginx.org/en/docs/http/ngx_http_log_module.html

基本配置

# cat /etc/nginx/nginx.conf -n

    40       access_log /var/log/nginx/access.log;

    41       error_log /var/log/nginx/error.log;

注意:

    nginx日志属性设置的完整格式是:

        属性名称 access_log 

        存储位置 /var/log/nginx/access.log

        日志格式 位置为空表示使用默认的combined 日志格式。它是通过log_format设置的

 

默认日志格式

log_format combined '$remote_addr - $remote_user [$time_local] '

                    '"$request" $status $body_bytes_sent '

                    '"$http_referer" "$http_user_agent"';

注意:

log_format是有一批nginx内置变量组合而成的。

 

日志样式:

# tail /var/log/nginx/access.log

192.168.8.14 - - [12/Nov/2018:08:24:18 -0800] "GET /favicon.ico HTTP/1.0" 404 580 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"

 

nginx常用内置变量

nginx常用的内置变量主要是用来分析日志中的http记录的,我们可以根据内置的变量精确的获取相关的信息

默认变量

$remote_addr        前一台主机的ip地址,不一定是真实的客户端IP

$remote_user        用于记录远程客户端的用户名称(一般为“-”)

$time_local         用于记录访问时间和时区

$request            用于记录请求的url以及请求方法

$status             响应状态码,例如:200成功、404页面找不到等。

$body_bytes_sent    给客户端发送的文件主体内容字节数

$http_referer       可以记录用户是从哪个链接访问过来的

$http_user_agent    用户所使用的代理(一般为浏览器)

 

其他常用变量

$request_uri        包含请求参数的原始URI,不包含主机名

$uri                不带请求参数的当前URI,不包含主机名

$http_x_forwarded_for 可以记录客户端IP,通过代理服务器来记录客户端的ip地址

$http_x_real_ip     可以记录客户端IP,通过代理服务器来记录客户端的ip地址

$args               这个变量等于请求行中的参数,同$query_string

$host               请求主机头字段,否则为服务器名称。

$scheme         HTTP方法(如http,https)

$document_uri       与$uri相同

$document_root      当前请求文件配置文件中html的根目录即root值

$request_filename   当前请求的文件路径,由root或alias指令与URI请求生成

 

示例:

例:http://localhost:10086/sswang1/sswang2/test.txt

$host               localhost

$server_port        10086

$request_uri        /sswang1/sswang2/test.txt

$document_uri       /sswang1/sswang2/test.txt

$document_root      /var/www/html

$request_filename   /var/www/html/sswang1/sswang2/test.txt

 

自定义日志实践

需求:

基于代理方式访问app1应用,日志存放在/var/logs/nginx/app1/access.log,要求能从日志中获取客户端的IP地址

因为是获取代理前面客户端的真实IP,需要nginx开启 --with-http_realip_module 功能,使用nginx -V来检查,ubuntu默认安装的已经开启了该功能。

设置日志格式

 ~# vim /etc/nginx/nginx.conf

    ##

    # Logging Settings

    ##  设定日志格式的方法: log_format 格式名称 "日志表现样式"

     log_format proxy_format '$remote_addr - $remote_user [$time_local] '

                    '"$request" $status $body_bytes_sent "$http_referer"'

                    '"$http_user_agent" "$http_x_real_ip" "$http_x_forwarded_for"';

 

 

使用日志格式:

access_log 日志路径 格式名称;

负载均衡配置文件

~# vim /etc/nginx/conf.d/upstream.conf

upstream backends {

  server 192.168.8.14:10086;

}

server {

  listen 80;

  server_name localhost;

  location / {

    proxy_pass http://backends;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  }

}

后端代理配置文件

~# vim /etc/nginx/conf.d/backend.conf

server {

  listen 192.168.8.14:10086;

  root /var/www/html/app1/;

  access_log /var/log/nginx/app1/access.log proxy_format;

  real_ip_header X-Forwarded-For;

  set_real_ip_from 192.168.0.0/16;

  real_ip_recursive on;

  location / {

    try_files $uri $uri/ =404;

  }

}

 

准备后端服务文件

mkdir -p /var/www/html/app1/

echo '<h1>backend_app1</h1>' > /var/www/html/app1/index.html

mkdir /var/log/nginx/app1 -p

检查nginx配置后重载服务

/usr/sbin/nginx -t

systemctl reload nginx

netstat -tnulp | grep nginx

查看效果

在多台主机上执行如下命令

curl http://192.168.8.14

查看日志:

app1日志

192.168.8.1 - - [12/Nov/2018:18:28:46 -0800] "GET / HTTP/1.0" 200 22 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" "192.168.8.1" "192.168.8.1"

192.168.8.14 - - [12/Nov/2018:18:29:30 -0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.47.0" "192.168.8.14" "192.168.8.14"

192.168.8.15 - - [12/Nov/2018:18:31:43 -0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.29.0" "192.168.8.15" "192.168.8.15"

注意:

因为我们的虚拟机使用的是nat网络模型,所以我们用外部的宿主机来访问的话,是通过VMnat8网卡IP来访问nginx代理的,所以记录的是192.168.8.1

 

注意:

如果生产中出现了多级代理,

在第一层代理上添加 proxy_set_header X-Real-IP $remote_addr;属性

在所有代理上必须添加 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;属性

真实主机上使用 real_ip_header X-Forwarded-For;属性

posted @ 2020-08-16 00:02  sewen  Views(350)  Comments(0)    收藏  举报