nginx反向代理

什么是反向代理

  • 正向代理:网络代理(代理客户端访问外网)

image.png

  • 反向代理:用于公司集群架构,代理服务端

image.png

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

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

为什么学代理

  • 代理后端语言的服务(PHP、JAVA、Python....)
  • 国外服务器代理国内服务器,方便国外用户上网

image.png

image.png

反向代理模块总结

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

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

nginx反向代理

环境准备

主机名 WanIP LanIP 角色 应用
web01 10.0.0.7 172.16.1.7 web网站 nginx、php、wordpress
lb01 10.0.0.5 172.16.1.5 反向代理服务器 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-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

## 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.创建用户www
[root@web01 ~]# groupadd www -g 666
[root@web01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M

## 7.统一用户
# 修改nginx配置文件
[root@web01 ~]# vim /etc/nginx/nginx.conf
user nginx 改成 user www

# 修改php配置文件
[root@web01 ~]# vim /etc/php-fpm.d/www.conf
user = apache 改成 user = www
group = apache 改成 group = www
;listen = 127.0.0.1:9000
listen = /dev/php.sock
listen.owenr = www
listen.group = www

## 8.配置nginx连接php
[root@web01 ~]# vim /etc/nginx/conf.d/blog.wsh.com.conf
server{
        listen 80;
        server_name blog.zls.com;
        root /blog;
        index index.php index.html;

        location ~ \.php$ {
                fastcgi_pass unix:/dev/php.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        }
}

## 9.启动nginx和php并加入开机自启
[root@web01 ~]# systemctl start nginx php-fpm
[root@web01 ~]# systemctl enable nginx php-fpm

## 10.创建站点目录并授权
[root@web01 ~]# mkdir /blog
[root@web01 ~]# chown -R www:www /blog


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

## 12.启动数据库并加入开机自启
[root@db01 ~]# systemctl start mariadb.service 
[root@db01 ~]# systemctl enable  mariadb.service

## 13..给MySQL的root用户设置密码
[root@db01 ~]# mysqladmin -uroot -p password '123'
Enter password:

## 14.进入MySQL
[root@db01 ~]# mysql -uroot -p
Enter password:

## 15.创建库
MariaDB [(none)]> create database wordpress;

## 16.查看数据库是否创建成功
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| wordpress          |
| wp                 |
+--------------------+
6 rows in set (0.00 sec)

## 17.授权数据库用户
MMariaDB [(none)]> grant all on *.* to wp_user@'172.16.1.%' identified by '123';

## 18.查看用户
MariaDB [(none)]> select user from mysql.user;
+---------+
| user    |
+---------+
| wp_user |
| root    |
| root    |
|         |
| root    |
|         |
| root    |
+---------+

## 19.下载wordpress
[root@web01 blog]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz

## 20.解压
[root@web01 blog]# tar xf latest-zh_CN.tar.gz

## 21.授权
[root@web01 blog]# chown www:www wordpress/

## 22.修改配置文件
[root@web01 blog]# vim /etc/nginx/conf.d/blog.wsh.com.conf
server{
        listen 80;
        server_name blog.wsh.com;
        root /blog/wordpress;
        index index.php index.html;

## 23.重启nginx
[root@web01 blog]# systemctl reload nginx

## 24.## 域名解析到web01
10.0.0.7 blog.wsh.com

## 25.打开浏览器输入域名地址并设置网页

nginx做代理服务器(lb01)

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

# 2.添加nginx代理配置文件
[root@lb01 ~]# vim /etc/nginx/conf.d/blog.wsh.com_proxy.conf
server{
        listen 80;
        server_name blog.wsh.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.wsh.com

## 以上配置存在的问题
lb01 通过 172.16.1.7 80端口访问后端的web01
因为是通过IP访问,所以,配置文件谁在上面,则访问哪个页面

解决方案:将域名加入到,lb01请求web01的请求头中

[root@lb01 ~]# vim /etc/nginx/conf.d/blog.zls.com_proxy.conf
server{
        listen 80;
        server_name blog.wsh.com;
        location /{
                proxy_pass http://172.16.1.7:80;
                # 在代理服务器中的请求头中,加上域名,携带域去访问后端的web01服务器
                proxy_set_header Host $host;
        }

}

172.16.1.5 - - [14/Jun/2022:17:49:30 +0800] "GET /wp-includes/blocks/navigation/view.min.js?ver=009e29110e016c14bac4ba0ecc809fcd HTTP/1.0" 200 8334 "http://blog.wsh.com/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36" "10.0.0.1"

10.0.0.1 - - [14/Jun/2022:17:49:30 +0800] "GET / HTTP/1.1" 200 61968 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36" "-"

## 上面的配置依然存在问题
web01上的nginx日志,只显示lb01的服务器IP地址,无法显示用户的真实IP地址

解决方案:在lb01的请求头中,加上用户真实IP去访问web01

[root@lb01 ~]# vim /etc/nginx/conf.d/blog.zls.com_proxy.conf
server{
        listen 80;
        server_name blog.wsh.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;
        }

}
172.16.1.5 - - [14/Jun/2022:18:08:18 +0800] "GET / HTTP/1.0" 200 61899 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36" "10.0.0.1"

## 优化后的代理配置文件
server {
        listen 80;
        server_name blog.zls.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;
			   
			   ## 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;
        }
}

## 避免配置文件重复使用

[root@lb01 ~]# vim /etc/nginx/proxy_wsh
## 在代理服务器的请求头中,加上域名,携带域名去访问后端的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;