4-1-面试必备-nginx实现反向代理配置与实战
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4-1-面试必备-nginx实现反向代理配置与实战相关的知识,希望对你有一定的参考价值。
nginx服务有缓存机制,但是要看nginx做为什么服务器来用,才启用缓存,否则自己的压力就非常大了(后端服务器压力小),因为nginx最拿手的是维持连接,缓存可以使用其他服务。
nat服务工作在三层和四层,可以简单理解为工作在四层。
注意:如果能工作在应用层就叫做代理,那么这个服务器就能监听一些端口但不是全部,---意思是服务器具有业务处理能力,一边是客户端(要理解客户端发的内容),一边是服务端(用自己的方式把内容传过去),所以可以有自己的缓存了
上边讲的是正向代理和反向代理的原理,nginx是可以做反向代理的
lvs是四层的负载均衡器,nginx是七层的负载均衡器,原理跟lvs相似
那么代理服务器和后端服务器:
后端服务器的网关不需要指向代理服务器,意思就是两者之间可以跨路由,所以两者之间可以是公网或私网地址,客户端也有可能可以访问后端服务器
CDN:内容分发网络,本身也是代理服务器,带有缓存功能,都是公网地址
nginx一般不作为http服务器,而是作为反代服务器
nginx作为反代服务器,httpd作为后端服务器
代理服务器完全可以有多个主机,靠server来定义,并且可以基于location把请求分发到不同的后端服务器上
下面开始演示nginx的反向代理功能:后端主机名称叫做UPSS1192.168.10.11
ntpdate 172.16.0.1---同步下时间
修改网卡为vmnet1
ifconfig eno1677736 192.168.10.11/24 up
route -n查看路由条目,发现是没有配置网关的
ping 192.168.10.254---在没有网关的情况下,依然可以ping通,因为在同一个网络中
后端服务器安装http服务和mod_ssl模块
yum install -y httpd mod_ssl
vim /var/www/html/index.html
<h1>Upstream Server1</h1>
systemctl start httpd.service
ss -tnl
tcpdump -i eno16777736 tcp port 80---可以看到是谁来访问的后端虚拟主机,全是代理服务器发来的请求
代理服务器也会记录访问日志的,但是为了提高代理性能,有可能关掉日志,后端服务器可########以修改日志的格式,查看真实的客户端地址,1:13:32是为了证明下面课件的2选项
#代理服务器安装nginx服务
代理服务器:172.16.0.6,192.168.10.254
ntpdata 172.16.0.1
yum clean all
yum repolist
yum install nginx
cd /etc/nginx
vim conf.d/ilinux.conf---编辑nginx的配置文件:
server {
listen 80;
server_name www.ilinux.io;
location / {---没有root就没法提供web服务,但是我们是反代服务器,不需要web功能
proxy_pass http://192.168.10.11:80;---可以是域名,可以是ip地址,后边要不要跟斜线,如果没有斜线,是把能匹配到的补到后边,如果有斜线,是替换斜线
proxy_set_header X-Real-IP $remote_addr;---把客户端真实地址添加到报文首部发给后端主机
add_header X-Via $server_addr;---把真实后端服务器地址发给客户端
}
location ~* .(jpg|jpeg|png)$ {---这是另一台后端服务器了UPSS2,使用了正则表达式匹配的话,url后边不能加斜线
proxy_pass http://192.168.10.12:80;
}
}
nginx -t
systemctl start nginx.service
ss -tnl---查看有没有80端口
代理服务器部署好nginx后,外部主机访问172.16.0.6会访问到nginx提供的默认主页,因为我们做的是提供域名的虚拟主机(自己配置的),所以要访问域名www.ilinux.io,并且在外部主机上做域名解析
vim /etc/hosts
172.16.0.6 www.ilinux.io---添加这样一行
再来访问www.ilinux.io就可以看到Upstream Server1了---说明反向代理成功了
注意:作为代理服务器来讲,是可以有多个主机的,每一个主机靠一个server来定义,后端服务器也可能有多个主机,所以需要明确标识后端服务器的每个主机(基于IP、端口或域名)
UPSS2:需要安装httpd
网络类型设置为vmnet1
ifconfig eno16777736 192.168.10.12/24 up
vim /var/www/html/index.html
<h1>Upstream Server2</h1>
find /usr/share -iname "*.jpg" -exec cp {} var/www/html/ ;
systemctl start httpd---客户端就可以访问图片资源了
yum info wireshark(需要在图形环境中打开)---这一步不需要
vim /etc/httpd/conf/httpd.conf
修改为LogFormat "%{X-Real-IP}i %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
httpd -t---检查语法错误
systemctl restart httpd.service
然后客户端强制刷新一次,
tail /var/log/httpd/access_log---就可以看到记录的日志里真实的IP地址
视频中的课件:
ngx_http_proxy_module模块:
1、proxy_pass URL:
Context:location,if in location,limit_except
注意:proxy_pass后面的路径不带url时,其会将location的url传递给后端主机;
server {
...
server_name HOSTNAME;
location /url/ {
proxy http://hos[:port];
}
...
}
http://HOSTNAME/url-->http://host/url
proxy_pass后面的路径是一个url时,其会将location的url替换为proxy_pass的url;
server {
...
server_name HOSTNAME;
location /url/ {
proxy http://host/new_url/;
}
...
}
http://HOSTNAME/url-->http://host/new_url/
如果location定义其url时使用了正则表达式的模式,或在if语句或limit_execept中使用proxy_pass指令,则proxy_pass之后必须不能使用url;用户请求时传递的url将直接附加代理到的服务的之后;
server {
...
server_name HOSTNAME;
location ~|~* /url/ {
proxy http://host;
}
...
}
http://HOSTNAME/url/-->http://host/url/;
2、proxy_set_header field value;
设定发往后端主机的请求报文的请求首部的值;Context:http,server,location
proxy_set_header X-Real-IP $remote_addr;---添加真实的请求IP地址到发往后端主机的请求报文中
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;---代理可以是多级的,追加而不是重设,上边的增强版本
3、proxy_cache_path
定义可用于proxy功能的缓存;Context:http
4、proxy_cache zone | off
指明要调用的缓存,或关闭缓存机制;Context:http,server,location
5、proxy_cahe_key string;
缓存中用于"键"的内容;
默认值:proxy_cache_key $scheme$proxy_host$request_url;
6、proxy_cache_valid [code ...] time;
定义对特定响应码的响应内容的缓存时长;
定义在http{...}中;
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;
定义在需要调用缓存功能的配置段,例如server{...};
proxy_cache pxycache;
proxy_cache_key $request_url;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
7、proxy_cache_use_state
8、proxy_cache_methods GET|HEAD|POST...;
9、proxy_hide_header field;
10、proxy_connect_timeout time;
默认为60s;
ngx_http_headers_modules模块:
向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的值;
1、add_header name value [always];
添加自定义首部;
add_header X-Via $server_addr;
add_header X-Accel $server_name;
2、expires [modified] time;
expires epoch | max|off;
用于定义Expire或Cache-Control首部的值;
以上是关于4-1-面试必备-nginx实现反向代理配置与实战的主要内容,如果未能解决你的问题,请参考以下文章