一、实现反向代理
nginx反向代理示意图。

ngx_http_proxy_module模块:
转发请求至另一台主机
1、 proxy_pass URL;
Context:location, if in location, limit_except
注意: proxy_pass后面路径不带uri时,会将location的uri传递(附加)给后端主机
server {
...
server_name HOSTNAME;
location /uri/ {
proxy_pass http://host[:port]; 最后没有/
}
...
}
上面示例: http://HOSTNAME/uri --> http://host/uri
如果上面示例中有 /,即: http://host[:port]/
意味着: http://HOSTNAME/uri --> http://host/ 即置换
nginx服务器反向代理配置配置
[root@centos7 conf.d]# vim a.com.conf
server {
listen 80 default_server;
server_name www.a.com;
root /data/sitea/;
error_page 404 =200 /404.html;
location /404.html {
root /data/sitea/error/;
}
location / {
proxy_pass http://192.168.147.129/;
}
}
后端http服务器页面信息
[root@centos7 html]# cat index.html
welcome to cwj.com
客户端访问,访问的是外部的地址。

查看后端服务器访问日志,发现是中间的代理服务器发起的请求。

前端代理服务器记录了客户端的访问记录

二、实现动静分离
动静分离示意图

静态页面的服务器页面
[root@centos7 html]# ls
images index.html
动态页面的服务器配置
1、安装http+php-fpm+php-mysql+mysql。后端动态服务器配置成fastcgi模式,具体配置详解fastcgi模式配置
[root@centos7 ~]# yum install httpd php-fpm php-mysql mysql
server {
listen 80 default_server;
server_name www.a.com;
root /data/sitea/;
error_page 404 =200 /404.html;
location /404.html {
root /data/sitea/error/;
}
location ~ \.php$ {
proxy_pass http://192.168.147.131;
}
location / {
proxy_pass http://192.168.147.129/;
}
}
静态页面

动态页面

三、反向代理相关配置项
1、proxy_set_header field value;
设定发往后端主机的请求报文的请求首部的值
Context: http, server, location
示例:
1.proxy_set_header X-Real-IP $remote_addr;
2.proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ##解决多层代理问题
请求报文的标准格式如下:
X-Forwarded-For: client1, proxy1, proxy2
$remote_addr
客户端地址
$proxy_add_x_forwarded_for
“ X-Forwarded-For”客户端请求标头字段中附加了$remote_addr变量,并用逗号分隔。 如果客户端请求标头中不存在“ X-Forwarded-For”字段(没有多层代理),则$proxy_add_x_forwarded_for变量等于$remote_addr变量。
添加请求报文首部之前的抓包情况

在发往后端主机的请求报文首部中添加远程客户端IP地址字段
server {
listen 80 default_server;
server_name www.a.com;
root /data/sitea/;
error_page 404 =200 /404.html;
location /404.html {
root /data/sitea/error/;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://192.168.147.129/;
}
}
再次访问并抓包,发现后端主机的请求报文的首部字段中含有自定义添加的X-Real-IP字段。


修改后端主机的日志格式,默认记录的是中间nginx代理服务器的地址。
日志记录的地址是192.168.147.135,即中间代理服务器的地址

修改后端主机的日志格式,把自定义的报文头部字段加入新的日志格式中。
[root@centos7 html]# vim /etc/httpd/conf/httpd.conf
<IfModule log_config_module>
.....
# LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
.....
CustomLog "logs/access_log" combined
.....
</IfModule>
后端的日志信息,可以记录到了真实的客户端IP。

多层代理场景

第一层代理的配置
[root@centos7 conf.d]# cat a_proxy.conf
server {
listen 80;
location / {
#proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.147.135/;
}
}
第二层代理配置
[root@centos7 conf.d]# cat a.com.conf
server {
listen 80 default_server;
server_name www.a.com;
root /data/sitea/;
error_page 404 =200 /404.html;
location /404.html {
root /data/sitea/error/;
}
location / {
#proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.147.129/;
}
}
访问并抓包测试

这是第一层代理服务器发往第二层代理服务器的请求报文头部信息,此时携带上了客户端地址

这是第二层代理服务器到后端应用服务器的请求报文首部,此时携带了客户端和第一层代理服务器的两个地址

再次修改后端应用服务器日志格式
[root@centos7 html]# vim /etc/httpd/conf/httpd.conf
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
后端的日志也显示了客户端和第一层代理服务器的地址

注意:两台代理服务器都要设置proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;才能把中间的代理服务器地址记录上,若只在第一层(即靠近客户端那层设置)则只记录客户端地址。
3、proxy_cache_path;
定义可用于proxy功能的缓存,建议启用;
Syntax: proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size
[inactive=time] [max_size=size] [min_free=size] [manager_files=number]
[manager_sleep=time] [manager_threshold=time] [loader_files=number]
[loader_sleep=time] [loader_threshold=time] [purger=on|off]
[purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default: —
Context: http
4、 proxy_cache zone | off;
默认off,指明调用的缓存,或关闭缓存机制;
Context:http,server, location
5、 proxy_cache_key string;
缓存中用于“键”的内容
默认值: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
6、 proxy_cache_valid [code …] time;
定义对特定响应码的响应内容的缓存时长
Context: http, server, location
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
7、proxy_cache_use_stale;
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504
|http_403|http_404 | off ...
在被代理的后端服务器出现哪种情况下,可以真接使用过期的缓存响应客户端
8、proxy_cache_methods
proxy_cache_methods GET | HEAD | POST ...;
对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存
缓存示例:
在http配置定义缓存信息
[root@centos7 nginx]# vim nginx.conf
user nginx;
worker_processes auto;
#worker_cpu_affinity 0001;
#worker_priority -10;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
proxy_cache_path /var/cache/nginx/proxy_cache
levels=1:2 keys_zone=proxycache:20m
inactive=120s max_size=1g;
sendfile on;
tcp_nopush on;
......
说明:
proxycache:20m proxycache是定义的缓存格式名称,20m是指内存中缓存的大小,主要用于存放key和metadata(如:使用次数)
max_size=1g 指磁盘存入文件内容的缓存空间最大值
根据上面的定义创建缓存目录,只需创建父目录即可
[root@centos7 nginx]# mkdir /var/cache/nginx
[root@centos7 nginx]# ll -d /var/cache/nginx
drwxr-xr-x 2 root root 6 10月 30 23:54 /var/cache/nginx
调用缓存功能,需要定义在相应的配置段中,如在反向代理的虚拟主机的server{…}段中调用。
server {
listen 80 default_server;
server_name www.b.com;
root /data/siteb/;
access_log /var/log/nginx/b_access.log main;
proxy_cache proxycache; ##调用上面定义的缓存,通过名称来调用
proxy_cache_key $request_uri; ##请求的URL被定为key
proxy_cache_valid 200 302 301 1h; ##对200 302 301响应的内容缓存1个小时
proxy_cache_valid any 5m; ##其他内容缓存5分钟
location / {
proxy_pass http://192.168.239.130/;
}
}
访问测试

此时缓存数据已经存放到缓存目录下
[root@centos7 nginx]# ls /var/cache/nginx
proxy_cache
[root@centos7 nginx]# ls /var/cache/nginx/proxy_cache/
9
[root@centos7 nginx]# tree /var/cache/nginx/proxy_cache/
/var/cache/nginx/proxy_cache/
└── 9
└── 7d
└── 6666cd76f96956469e7be39d750cc7d9
2 directories, 1 file
查看缓存内容,就是访问的页面内容
[root@centos7 ~]# cat /var/cache/nginx/proxy_cache/9/7d/6666cd76f96956469e7be39d750cc7d9
ڜ_曟ՒҹX["e-5b2ef1f1be554"
KEY: /
HTTP/1.1 200 OK
Date: Sat, 31 Oct 2020 04:20:21 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sat, 31 Oct 2020 03:29:32 GMT
ETag: "e-5b2ef1f1be554"
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Content-Type: text/html; charset=UTF-8
www.baidu.com
本文详细介绍了如何在Nginx中实现反向代理,包括基本配置、动静分离示例,以及关键配置项如proxy_set_header和proxy_cache的使用。还涉及了多层代理和缓存管理,帮助读者理解并优化服务器架构。
1330

被折叠的 条评论
为什么被折叠?



