Nginx反向代理服务

Nginx代理服务常见模式

Nginx作为代理服务,按照应用场景模式进行总结,代理分为正向代理、反向代理

正向代理

(内部上网)客户端<—>代理->服务端

file

反向代理

客户端->代理<—>服务端,用于公司集群架构中

file

正向代理与反向代理的区别

  • 区别在于形式上服务的"对象"不一样
    • 正向代理的对象是客户端,为客户端服务
    • 反向代理的对象是服务端,为服务端服务

Nginx代理服务支持协议

Nginx作为代理,可支持的代理协议非常的多,具体如下图

file

如果将Nginx作为反向代理服务,常常会用到如下几种代理协议,具体如下图

file

反向代理模块总结

反向代理模式与Nginx代理模块总结如表格所示

反向代理模式 Nginx**配置模块**
http、websocket、https ngx_http_proxy_module
fastcgi ngx_http_fastcgi_module
uwsgi ngx_http_uwsgi_module
grpc ngx_http_v2_module

Nginx反向代理配置

环境准备

主机名 外网**IP(NAT)** 内网**IP(LAN)** 角色 应用
web01 10.0.0.7 172.16.1.7 web网站 nginx、php、wordpress
lb01 10.0.0.5 172.16.1.51 反向代理服务器 nginx
db01 10.0.0.51 172.16.1.51 数据库 MariaDB

安装LNMP环境

# 1.yum下载下来的所有rpm结尾的包
[root@web01 ~]# find /var/cache/yum/ -type f -name '*.rpm'

# 2.开启yum缓存
[root@web01 ~]# vim /etc/yum.conf
[main]
keepcache=1

# 3.添加nginx源
[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

# 4.添加PHP源
[root@web01 ~]# vim /etc/yum.repos.d/php.repo
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0

# 5.安装nginx和php
[root@web01 ~]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm
php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb nginx

# 6.将所有rpm包拷贝到opt目录下
[root@web01 ~]# find /var/cache/yum/ -type f -name '*.rpm'|xargs cp -t /opt/

# 7.进入opt目录打包
[root@web01 ~]# cd /opt/
[root@web01 opt]# tar zcf nginx_php.tgz *.rpm

#### 安装
[root@web02 nginx_php]# rpm -Uvh *.rpm
[root@web02 nginx_php]# yum localinstall -y *.rpm

# 8.安装数据库
[root@db01 ~]# yum install -y mariadb-server

Nginx做代理服务器(lb01)

# 1.安装nginx
[root@lb01 ~]# yum install -y nginx

# 2.添加nginx代理配置文件
[root@lb01 ~]# vim /etc/nginx/conf.d/blog.lw.com_proxy.conf
server {
        listen 80;
        server_name blog.lw.com;

        location /{
                proxy_pass http://172.16.1.7:80;
        }
}

# 3.启动nginx并加入开机自启
[root@lb01 ~]# systemctl start nginx
[root@lb01 ~]# systemctl enable nginx

# 4.域名解析
10.0.0.5 blog.lw.com

以上配置存在的问题:

10.0.0.1请求10.0.0.5的时候使用的是域名
10.0.0.5请求10.0.0.7的时候使用的是IP:port

之前课程中讲到,当访问80端口的时候,没有域名的情况下,默认会去找排在最上面的那个配置文件。

所以我们需要解决这个问题,保留住最开始的请求头部信息。

proxy_set_header,这个模块可以帮我们解决这个问题

[root@lb01 ~]# vim /etc/nginx/conf.d/blog.lw.com_proxy.conf
server {
        listen 80;
        server_name blog.lw.com;

         location /{
         proxy_pass http://172.16.1.7:80;
        ## 在代理服务器中的请求头中,加上域名,携带域名去访问后端的web01服务器
         proxy_set_header Host $host;
        }
}

记录客户端来源IP

在生产环境中,我们必须要记录客户端的来源IP,如果所有的访问日志,全都来源于代理,那么我们根本不知道都有哪些地区的用户访问了我们什么页面。

还是使用proxy_set_header

配置文件如下

server {
        listen 80;
        server_name blog.lw.com;

        location /{
                proxy_pass http://172.16.1.7:80;
                ## 在代理服务器的请求头中,加上域名,携带域名去访问后端的web01服务器
                proxy_set_header Host $host;
                ## 在代理服务器的请求头中,透传用户的真实IP地址给web01
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

我们还可以使用其他模块对配置文件进行优化

## 避免配置文件重复使用
[root@lb01 ~]# vim /etc/nginx/conf.d/zh.zls.com_proxy.conf
server {
        listen 80;
        server_name blog.zls.com;

        location /{
                proxy_pass http://172.16.1.7:80;
                include proxy_params;
        }
}

[root@lb01 ~]# cat /etc/nginx/proxy_params
## 在代理服务器的请求头中,加上域名,携带域名去访问后端的web01服务器
proxy_set_header Host $host;
## 在代理服务器的请求头中,透传用户的真实IP地址给web01
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
## lb01连接web01的超时时间(代理服务器,连接后端服务的超时时间)
proxy_connect_timeout 60s;
## lb01代理服务器读取web01返回的数据超时时间(代理后端的服务器响应代理服务器的超时时间)
proxy_read_timeout 60s;
## 后端服务器回传给代理服务器数据的超时时间
proxy_send_timeout 60s;
## 开启代理服务器的缓冲区,代理服务器接收到web01返回的数据,接收一条,返回给用户一条
proxy_buffering on;
## 开启存放头部信息的缓冲区大小为 32k
proxy_buffer_size 32k;
## 开启4个128k的存放数据主体的缓冲区
proxy_buffers 4 128k;

山林不向四季起誓 荣枯随缘