Nginx代理服务基本概述

代理:

代理一词往往并不陌生, 该服务我们常常用到如(代理理财、代理租房、代理收货等等),如下图所示

没有代理情景

在没有代理模式的情况下,客户端和Nginx服务端,都是客户端直接请求服务端,服务端直接响应客户端。

企业场景

那么在互联网请求里面,客户端往往无法直接向服务端发起请求,那么就需要用到代理服务,来实现客户端和服务通信,如下图所示*

Nginx代理服务常见模式

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

正向代理

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

反向代理

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

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

1.区别在于形式上服务的”对象”不一样*

2.正向代理代理的对象是客户端,为客户端服务

3.反向代理代理的对象是服务端,为服务端服务

Nginx代理服务支持协议

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

反向代理使用协议

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

模块总结

反向代理模式与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反向代理配置语法

代理配置语法

Syntax:    proxy_pass URL;
Default: —
Context: location, if in location, limit_except http://localhost:8000/uri/
http://192.168.56.11:8000/uri/
http://unix:/tmp/backend.socket:/uri/

url跳转修改返回location

url跳转修改返回Location[不常用]

参考下载站点:http://test.driverzeng.com/Nginx_File/

Syntax:    proxy_redirect default;
proxy_redirect off;proxy_redirect redirect replacement;
Default: proxy_redirect default;
Context: http, server, location

添加发往后端服务器的请求头信息

Syntax:    proxy_set_header field value;
Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location # 用户请求的时候HOST的值是www.oldboy.com, 那么代理服务会像后端传递请求的还是www.oldboy.com
proxy_set_header Host $http_host;
# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

代理到后端的TCP连接、响应、返回等超时时间

//nginx代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location //nginx代理等待后端服务器的响应时间
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location //后端服务器数据回传给nginx代理超时时间
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location

proxy_buffer代理缓冲区

//nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location //设置nginx代理保存用户头信息的缓冲区大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location //proxy_buffers 缓冲区
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location

常用优化配置

Proxy代理网站常用优化配置如下,将配置写入新文件,调用时使用include引用即可

[root@Nginx ~]# vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60; proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

重复使用配置

代理配置location时调用方便后续多个Location重复使用

代理配置location 时调用方便后速多个location重复使用

location / {
proxy_pass http://127.0.0.1:8080;
include proxy_params;
}

Nginx反向代理场景实践

nginx反向代理配置实例

环境准备

角色 外网****IP(NAT) 内网****IP(LAN) 主机名
Proxy eth0:10.0.0.5 eth1:172.16.1.5 lb01
web01 eth0:10.0.0.7 eth1:172.16.1.7 web01

配置需求

web01服务器,配置一个网站,监听在8080此时网站仅172网段的用户能访问

[root@web01 ~]# cd /etc/nginx/conf.d/
[root@web01 conf.d]# vim web.conf
server {
listen 8080;
server_name localhost; location / {
root /code_8080;
index index.html;kk
deny 10.0.0.0/24;
allow all;
}
}
[root@web01 conf.d]# mkdir /code_8080
[root@web01 conf.d]# echo "web01-7...." >/code_8080/index.html
[root@web01 conf.d]# systemctl restart nginx

配置需求

proxy代理服务,配置监听eth0的80端口,使10.0.0.0网段的用户,能够通过代理服务器访问到后端的172.16.1.7的8080端口站点内容

[root@lb01 ~]# cd /etc/nginx/conf.d/
[root@lb01 conf.d]# vim proxy_web_node1.conf
server {
listen 80;
server_name nginx.oldboy.com; location / {
proxy_pass http://172.16.1.7:8080;
}
} [root@lb01 conf.d]# systemctl enable nginx
[root@lb01 conf.d]# systemctl start nginx

存在问题

抓包结果

从图中可以看出,当我们只用proxy_pass代理的时候,会发现如下问题:

10.0.0.1请求10.0.0.5的时候使用的是域名

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

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

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

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

配置文件如下:

[root@lb01 conf.d]# cat proxy_web_node1.conf
server {
listen 80;
server_name nginx.oldboy.com; location / {
proxy_pass http://172.16.1.7:8080;
proxy_set_header Host $http_host;
}
}

使用http 1.1协议

[root@lb01 conf.d]# cat proxy_web_node1.conf
server {
listen 80;
server_name nginx.oldboy.com; location / {
proxy_pass http://172.16.1.7:8080;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
}
}

记录客户端来源IP

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

还是使用proxy_set_header

优化配置文件如下:

[root@lb01 conf.d]# cat proxy_web_node1.conf
server {
listen 80;
server_name nginx.oldboy.com; location / {
proxy_pass http://172.16.1.7:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 8k;
}
}

配置代理实战

#要求如下
1.部署web01,wordpress ,zh
2.用远端的数据库
3.配置代理
blog.gjy.com 访问:web01的wordpress
zh.gjy.com 访问:web01的zh
两种方式,都能访问到对应的网站
1.加请求头
2.不加请求头

1.环境准备

外网IP 内网IP 主机名
10.0.0.5 172.16.1.5 lb01
10.0.0.7 172.16.1.7 web01
10.0.0.51 172.16.1.51 db01

部署web01

1)在web01上安装nginx和php

[root@web01 ~]# rz -E
[root@web01 ~]# tar xf nginx_php_mariadb.tar.gz
[root@web01 ~]# ll
[root@web01 ~]# cd nginx_php_mariadb
[root@web01 nginx_php_mariadb]# yum install -y ./*rpm

2)创建www用户

[root@web01 nginx_php_mariadb]# groupadd www -g 666
[root@web01 nginx_php_mariadb]# useradd www -u 666 -g 666 -s /sbin/nologin -M

3)修改nginx和PHP启动用户

[root@web01 php]# vim /etc/nginx/nginx.conf
user www;
[root@web01 php]# vim /etc/php-fpm.d/www.conf
user = www
group = www

4)编辑nginx配置文件wordpress和zh

[root@web01 php]# vim /etc/nginx/conf.d/blog.gjy.com.conf
server {
listen 80;
server_name blog.gjy.com;
root /code/wordpress;
index index.php index.html;
access_log /var/log/nginx/blog.drz.com_access.log main; location ~\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
} } [root@web01 php]# vim /etc/nginx/conf.d/zh.gjy.com.conf
server {
listen 80;
server_name zh.gjy.com;
root /code/zh;
index index.php index.html;
access_log /var/log/nginx/zh.drz.com_access.log main; location ~\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
} }

5)创建站点目录并授权

[root@web01 php]# mkdir -p /code/{wordpress,zh}

6)代码上线,上传安装包

[root@web01 code]# tar xf wordpress-5.0.3-zh_CN.tar.gz
[root@web01 code]# unzip WeCenter_3-3-3.zip

7)创建出用户上传目录

[root@web01 code]# mkdir /code/wordpress/wp-content/uploads
[root@web01 php]# chown -R www.www /code/

8)启动nginx和php并加入开机自启

[root@web01 code]# systemctl start nginx php-fpm
[root@web01 code]# systemctl enable nginx php-fpm

部署数据库db01

9)安装数据库

[root@db01 ~]# yum install -y mariadb-server

10)启动数据库

[root@db01 ~]# systemctl start mariadb

11)设置数据库root用户的密码

[root@db01 ~]# mysqladmin -uroot password '1'

12)免交互创建数据库

#创建数据库
[root@db01 ~]# mysqladmin -uroot -p1 create wordpress
[root@db01 ~]# mysql -uroot -p1 -e 'create database zh'
#查看数据库
[root@db01 ~]# mysql -uroot -p1 -e 'show databases'

13)免交互创建程序连接MySQL用户

[root@db01 ~]# mysql -uroot -p1 -e "grant all on wordpress.* to wp@'172.16.1.%' identified by '1'"
[root@db01 ~]# mysql -uroot -p1 -e "grant all on zh.* to zh@'172.16.1.%' identified by '1'"

14)测试远程连接数据库

#远程连接数据库wordpress库
[root@web01 ~]# mysql -uwp -p1 -h172.16.1.51
#远程连接数据库zh库
[root@web01 ~]# mysql -uzh -p1 -h172.16.1.51

代理测试

1)web01部署网站

#准备配置文件
[root@web01 ~]# vim /etc/nginx/conf.d/proxy.conf
server {
listen 80;
server_name proxy.drz.com; location / {
root /code/proxy;
index index.html;
}
} #创建站点目录
[root@web01 ~]# mkdir /code/proxy
#部署代码
[root@web01 ~]# echo 'web01...' > /code/proxy/index.html
#重启nginx
[root@web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 ~]# nginx -s reload
#不加请求头,会访问到code第一个目录,也就是搭建的博客页面
#加请求头,会访问到自定义的 web01...

代理实战

在lb01上安装nginx

[root@lb01 php]# rpm -ivh nginx-1.16.1-1.el7.ngx.x86_64.rpm

1)配置代理

加请求头

[root@lb01 ~]# vim /etc/nginx/conf.d/daili.conf
server {
listen 80;
server_name blog.gjy.com; location / {
proxy_pass http://10.0.0.7;
proxy_set_header HOST $http_host;
}
} [root@lb01 conf.d]# vim zh.conf
server {
listen 80 ;
server_name zh.gjy.com; location / {
proxy_pass http://10.0.0.7;
proxy_set_header HOST $http_host;
}
}

不加请求头,修改端口

#zh修改端口为8888,对应的web服务器也需要修改端口为8888
[root@lb01 conf.d]# vim zh.conf
server {
listen 80 ;
server_name zh.gjy.com; location / {
proxy_pass http://10.0.0.7:8888;
}
} [root@web01 conf.d]# vim zh.gjy.com.conf
server {
listen 8888;
...
}

2)创建www用户

[root@lb01 ~]# groupadd www -g 666
[root@lb01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M

3)修改nginx 启动用户

4)启动nginx

[root@lb01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 ~]# nginx -是reload

小结:1.不加请求头,端口会冲突的情况下,会默认访问到/code目录下第一个目录配置文件。

2.加请求头,会精确访问到所指定的目录

3.不加请求头,指定端口,会精确访问到端口所指定的配置文件位置

注意

反向代理模块http_proxy_module 七层

location / {
proxy_pass http://172.16.1.7;
#调用模块
include proxy_params; } #可以把应用模块都编辑到一个文件中,调用
proxy_params
proxy_set_header HOST $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
chaoshi shijian x3;

最新文章

  1. c++面试题
  2. Please set registry key HKLM\Microsoft\.NET Framework\InstallRoot to point to the .NET Framework
  3. json date convert
  4. Nginx Location配置语法介绍、优先级说明
  5. Crawling is going on - Alpha版本测试报告
  6. 【Web学习日记】——在IIS上发布一个WebService
  7. 【welcome-file-list】让默认页生效
  8. HDOJ1253 胜利大逃亡 BFS
  9. 使用 Require.js 引用第三方框架时遇到的一些情况
  10. Hdu 3341 Lost&amp;#39;s revenge (ac+自己主动机dp+hash)
  11. JS复习:第六章
  12. 高斯消元法(Gauss Elimination)【超详解&amp;模板】
  13. Java基础总结--流程控制
  14. 基于 Hexo + GitHub Pages 搭建个人博客(二)
  15. web前端开发学习路线图
  16. 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求(转)
  17. nonzero
  18. 1、Dreamweaver+php开发网站第一步
  19. Flask-WTF
  20. jQuery 源码分析:当 selector 传来一个函数时,怎么进行处理?

热门文章

  1. 从零开始之uboot、移植uboot2017.01(二、从入口分析流程)
  2. Oracle 设置自启动
  3. 前端每日实战:67# 视频演示如何用纯 CSS 创作单元素点阵 loader
  4. Setting proxy for Windows CMD and Linux Terminal
  5. Hadoop编程调用HDFS(PYTHON)
  6. php strncasecmp()函数 语法
  7. CSS中的一些伪类
  8. spfa模板(洛谷3371)
  9. S1.2 Python开发规范指南
  10. AcWing 312. 乌龟棋 (简单DP)打卡