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实现反向代理配置与实战的主要内容,如果未能解决你的问题,请参考以下文章

nginx 反向代理实现负载均衡*配置实战

nginx的项目实战:nginx反向代理微服务端口

4-3-面试必备-nginx与php结合实现web网站及优化

nginx实战反向代理配置缓存及负载均衡

Nginx实战之反向代理WebSocket的配置实例

项目实战02:nginx 反向代理负载均衡动静分离和缓存的实现