nginx搭建反向代理服务器

275 阅读3分钟

一、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长。