一、mac电脑启动两个nginx服务
下载nginx包在downloads文件中,使用cp命令将该包复制两份到nginx目录下(自己建的一个目录, 方便存储所有的nginx代码,两份nginx包起不同的名称),分别编译出两个项目:nginx-demo、nginx-demo1,更改nginx-demo端口为8000,nginx-demo1端口为3000,启动即可。
只要多个nginx服务的监听端口不一样就可以启动多个nginx服务。
二、搭建反向代理
我在本地启了两个nginx项目:nginx-demo、nginx-demo1。
对应的index.html的内容分别是:我是nginx-demo呀、我是nginx-demo1呀。
nginx-demo监听的端口是8000,nginx-demo1监听的端口是3000。
我想让nginx-demo1作为nginx-demo的上游服务器,在nginx-demo的nginx.conf中配置:
upstream local {
server 127.0.0.1:3000;
}
server {
......
location / {
proxy_pass http://local;
}
......
}
这里使用proxy_pass将所有的请求转发到上游服务器,upstream 定义上有服务器的列表。其中一台上游服务器监听的为127.0.0.1:3000。
上游服务器中nginx.conf中的listen指令值改为: listen 127.0.0.1:3000,并重新启动。
两个服务都重启之后,访问http://localhost:8000/,或者http://127.0.0.1:8000/得到的是:我是nginx-demo1呀,代表反向代理成功。
这个upstream之后的local为对应的服务器列表的名称,proxy_pass中的local就是upstream中的local。
当这个服务器列表中有一个服务器,就会去访问其他的服务器。
注意:
请求http://localhost:8000/src/index.html时,在location /src 块中,如果proxy_pass为http://local,那么代理后的请求为http://local/src/index.html;如果proxy\_pass为http://local/index.html;
三、传递用户端信息到上游服务器
一个请求从用户端到反向代理服务器,反向代理服务器将其转发到上游服务器,在这个过程中,上游服务器想拿到用户请求的信息要怎么做呢?
可以在反向代理服务器中配置:
location / {
proxy_set_header Host host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $proxy-add_x_forwarded_for;
......
}
这样上游服务器就可以获取到用户真实的host、ip、x-forwarded-for。
四、对静态资源进行缓存
一般情况下,反向代理并不是会将所有的请求都转发给上游服务器,因为有一些静态资源,每个用户访问到的都一样,所以反向代理服务器可以将这类资源进行缓存,当用户再请求这类资源时,直接从反向代理服务器的缓存中取回,减少上游服务器的压力。
nginx-demo中增加配置:
proxy_cache_path temp_cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=2d use_temp_path=off;
.......
server {
.......
location / {
proxy_cache my_cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 302 1d;
}
}
配置好之后,重启nginx-demo,并且关闭nginx-demo1服务,但是访问http://localhost:8000/,还是能请求到数据,此时的数据就是从nginx-demo的缓存中取的。
当我们在实际项目中使用时,在需要的location下加就可以了。
指令介绍:
-
proxy_cache_path:定义缓存的目录和参数。
-
temp_cache:这个我自己定义的存储缓存的目录。
-
levels:定义的是缓存的目录层级,例如:1:2即/temp_cache/2/f3,具体的缓存文件名是一个md5值。
-
keys_zone:定义缓存的名称。
-
max_size:定义缓存空间的大小。
-
inactive:当超过inactive设置的时间没有访问缓存数据时,缓存数据就会被从缓存中删除。
-
use_temp_path:当设定为off时,使用指定文件存储缓存。
-
proxy_cache_key:定义缓存的key,根据key来获取对应的缓存。
-
proxy_cache_valid:指定哪些状态码的请求要进行缓存,缓存的时间是多长。
proxy_cache使用LRU(最近最少使用)算法。
五、proxy_cache_valid和inactive对比
proxy_cache_valid虽然设置了缓存时间,但是过期之后,缓存的数据并不会删除,而inacive的数据会被删除,所以inactive的时间要设置的比proxy_cache_valid长。