- 反向代理产生的背景:
在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂拥而入时,会造成服务器忙不过来的局面,可以使用多个服务器来共同分担成千上万的用户请求,这些服务器提供相同的服务,对于用户来说,根本感觉不到任何差别。
- 反向代理服务的实现:
需要有一个负载均衡设备(即反向代理服务器)来分发用户请求,将用户请求分发到空闲的服务器上。服务器返回自己的服务到负载均衡设备。负载均衡设备将服务器的服务返回用户。
什么是反向代理?为什么叫反向代理?什么是正向代理?我们来举例说明
正向代理的过程隐藏了真实的请求客户端,服务器不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替请求。我们常说的代理也就是正向代理。
正向代理中代理的对象是客户端,proxy和client同属一个LAN,对server透明;
反向代理的过程隐藏了真实的服务器,客户不知道真正提供服务的人是谁,客户端请求的服务都被代理服务器处理。
反向代理中代理的对象是服务端,proxy和server同属一个LAN,对client透明。
ngx_http_proxy_module
nginx proxy 具体配置详解
项目 | Value |
---|---|
proxy_pass | 真实服务器的地址,可以是ip也可以是域名和url地址 |
proxy_set_header | 重新定义或者添加发往后端服务器的请求头 |
proxy_set_header X-Real-IP | 启用客户端真实地址(否则日志中显示的是代理在访问网站) |
proxy_set_header X-Forwarded-For | 记录代理地址 |
proxy_connect_timeout | 后端服务器连接的超时时间发起三次握手等候响应超时时间 |
proxy_send_timeout | 后端服务器数据回传时间,就是在规定时间之内后端服务器必须传完所有的数据 |
proxy_read_timeout | nginx接收upstream(上游/真实) server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭。像长连接 |
代理
Syntax: proxy_pass URL; #代理的后端服务器URL
Default: —
Context: location, if in location, limit_except
头信息
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host; #设置真实客户端地址
proxy_set_header Connection close;
Context: http, server, location
超时
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s; #链接超时
Context: http, server, location
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location
Syntax: proxy_send_timeout time; #nginx进程向fastcgi进程发送request的整个过程的超时时间
Default: proxy_send_timeout 60s;
Context: http, server, location
前提:环境两台nginx真实服务器
1、nginx-1 启动网站(内容)(作为网站服务器)·
nginx-1的ip:192.168.62.157
已经编译安装好,检查nginx是否启动是否可以访问
[root@nginx-server ~]# cat /home/www/html/index.html
1000phone
[root@nginx-server ~]# cat /etc/nginx/conf.d/aa.conf
server {
listen 80;
server_name localhost;
location / {
root /home/www/html;
index index.html index.hml;
}
}
2、nginx-2 启动代理程序
nginx-2的ip:192.168.62.159
配置nginx的yum源直接yum安装
启动
编辑nginx的配置文件(编辑之前,删除/注释掉之前的配置):
[root@nginx-server ~]# vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.62.157:80;
proxy_set_header Host $http_host;#填写nginx-1服务器的地址。
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;
}
}
重新加载nginx配置文件
[root@nginx-server ~]# nginx -s reload
3、 使用PC客户端访问nginx-2服务器地址
浏览器中输入http://192.168.62.159/ (也可以是nginx-2服务器的域名),成功访问nginx-1服务器页面
4、 观察nginx-1(192.168.62.157)服务器的日志
192.168.62.159 代理服务器地址
192.168.62.1 客户机地址
访问成功。 记录了客户机的IP和代理服务器的IP
当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。
我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
负载均衡是用反向代理的原理实现的。
首先给大家说下 upstream 这个配置的,这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法。这里的被代理服务器地址有2种写法。
upstream youngfitapp {
server 192.168.62.157:8080;
server 192.168.62.158:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://youngfitapp;
}
}
upstream 支持4种负载均衡调度算法:
轮询(默认)
:每个请求按时间顺序
逐一分配到不同的后端服务器;
weight(权重)
:这种方式比较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利用资源。weight和访问比率成正比,用于后端服务器性能不均的情况。权重越高,在被访问的概率越大。
ip_hash
:每个请求按访问ip的hash
结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题;
url_hash
:此种方式和ip_hash
比较类似,根据url的hash
值进行分配,将url分配到同一个后端服务器,当服务器存在缓存时比较有效
fair(第三方插件)
:这种方式根据后端服务器的响应时间
进行分配,响应快的优先分配请求。必须先下载Nginx的 upstream_fair
模块;
1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB…
upstream myweb {
server 192.168.62.157:8080;
server 192.168.62.158:8080 backup; #热备
}
2、轮询:Nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB…
upstream myweb {
server 192.168.62.157:8080;
server 192.168.62.158:8080;
}
3、加权轮询:根据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB…
upstream myweb {
server 192.168.62.157:8080 weight=1;
server 192.168.62.158:8080 weight=2;
}
4、ip_hash:Nginx会让相同的客户端ip请求相同的服务器。
upstream myweb {
ip_hash;
server 192.168.62.157:8080;
server 192.168.62.158:8080;
}
4、fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}
5、url_hash(第三方):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
upstream myweb {
server 192.168.62.157:8080 weight=2 max_fails=2 fail_timeout=2;
server 192.168.62.158:8080 weight=1 max_fails=2 fail_timeout=1;
}
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
在动静分离的tomcat的时候比较明显,因为tomcat解析静态很慢,其实这些原理的话都很好理解,简单来说,就是使用正则表达式匹配过滤,然后交给不同的服务器。
准备一个nginx代理 两个http 分别处理动态和静态。
192.168.62.159 代理服务器
192.168.62.157 动态资源
192.168.62.155 静态资源
192.168.62.159 代理服务器
1.配置nginx反向代理upstream;
[root@nginx-server conf.d]# cat upstream.conf
upstream static {
server 192.168.62.155:80 weight=1 max_fails=1 fail_timeout=60s;
}
upstream phpserver {
server 192.168.62.157:80 weight=1 max_fails=1 fail_timeout=60s;
}
server {
listen 80;
server_name localhost;
#动态资源加载
location ~ \.(php|jsp)$ {
proxy_pass http://phpserver;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#静态资源加载
location ~ .*\.(html|gif|jpg|png|bmp|swf|css|js)$ {
proxy_pass http://static;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
192.168.62.155 静态资源
#静态资源配置 主配置文件-include /etc/nginx/conf.d/*.conf
# vim /etc/nginx/conf.d/static.conf
server {
listen 80;
server_name localhost;
location ~ \.(html|jpg|png|js|css|gif|bmp|jpeg) {
root /home/www/nginx;
index index.html index.htm;
}
}
[root@nginx-server2 nginx]# cat /home/www/nginx/index.html //模拟静态资源
hello 155
192.168.62.157 动态资源
#动态资源配置:
yum 安装php7.1
[root@nginx-server ~]# rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
[root@nginx-server ~]# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
[root@nginx-server ~]# yum install php71w-xsl php71w php71w-ldap php71w-cli php71w-common php71w-devel php71w-gd php71w-pdo php71w-mysql php71w-mbstring php71w-bcmath php71w-mcrypt -y
[root@nginx-server ~]# yum install -y php71w-fpm
[root@nginx-server ~]# systemctl start php-fpm
[root@nginx-server ~]# systemctl enable php-fpm
编辑nginx的配置文件:
server {
listen 80;
server_name localhost;
location ~ \.php$ {
root /home/nginx/html; #指定网站目录
fastcgi_pass 127.0.0.1:9000; #指定访问地址
fastcgi_index index.php; #指定默认文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #站点根目录,取决于root配置项
include fastcgi_params; #包含nginx常量定义
}
}
[root@nginx-server1 html]# cat /home/nginx/html/index.php //模拟动态资源
dongtai
当访问动态页面时location匹配到 .\php
结尾的文件转发到后端php服务处理请求。
当访问静态页面的时候location 匹配到 (html|jpg|png|js|css|gif|bmp|jpeg)
通过转发到静态服务器,静态服务通过location的正则匹配来处理请求。
虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供web服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响。
nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置。
基于域名的虚拟主机 (server_name来区分虚拟主机——应用:web网站)
基于ip的虚拟主机(一个主机绑定多个ip地址)
基于端口的虚拟主机 (端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台)
1.配置通过域名区分的虚拟机
[root@localhost ~]# cat /etc/nginx/conf.d/aa.conf
server {
listen 80;
server_name www.alan-1.com;
charset utf-8;
location / {
root /var/www/nginx;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name www.alan-2.com;
charset utf-8;
location / {
root /1000phone/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
2.为域名为虚拟机,创建 index 文件
[root@localhost ~]# mkdir -p /var/www/nginx
[root@localhost ~]# mkdir -p /1000phone/html
[root@localhost ~]# vim /1000phone/html/index.html
this is my 1000phone
[root@localhost ~]# vim /var/www/nginx/index.html
hello alan.
3.重新加载配置文件
[root@nginx]# nginx -s reload
4.客户端配置解析
在 C:\Windows\System32\drivers\etc\hosts 文件中添加两行(linux:/etc/hosts)
10.0.105.199 web.testpm.com
10.0.105.199 web.1000phone.com
5. 测试访问
浏览器输入:http://web.testpm.com/
浏览器输入:http://web.1000phone.com/
1.添加 ip
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:17:f1:af brd ff:ff:ff:ff:ff:ff
inet 10.0.0.20/24 brd 10.0.105.255 scope global dynamic ens33
valid_lft 81438sec preferred_lft 81438sec
inet6 fe80::9d26:f3f0:db9c:c9be/64 scope link
valid_lft forever preferred_lft forever
[root@localhost ~]# ifconfig ens33:1 10.0.0.220/24
2、配置通过 ip 区分的虚拟机
[root@localhost ~]# cat /etc/nginx/nginx.conf
server {
listen 80;
server_name 10.0.0.20;
charset utf-8;
location / {
root /var/www/nginx;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name 10.0.0.220;
charset utf-8;
location / {
root /1000phone/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
3.重新加载配置文件
[root@localhost ~]#/usr/local/nginx/sbin/nginx -s reload
4、 测试访问
浏览器输入:http://10.0.0.20
浏览器输入:http://10.0.0.220
1.配置
[root@localhost ~]# cat /etc/nginx/nginx.conf
server {
listen 80;
server_name www.alan-1.com;
charset utf-8;
location / {
root /var/www/nginx;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 8080;
server_name www.alan-2.com;
charset utf-8;
location / {
root /1000phone/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2.重新加载配置文件:
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
3.测试访问:
浏览器输入:http://www.alan-1.com
浏览器输入:http://www.alan-2.com:8080