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
- 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 http://192.168.10.12/ ;
- }
- }
- 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
- 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 http://hostname/url--%3Ehttp://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 首部的值;
来源: http://www.bubuko.com/infodetail-3107266.html