反向代理nginx

23 阅读1分钟

反向代理

server {
	location /proxy {
		proxy_pass http://localhost:10001;

		# 添加响应头部返回给客户端
		add_header X-Real-IP $remote_addr;

		# 传给目标服务器设置的头部信息
		# 源host
		proxy_set_header Host $http_host;
		#上层请求真实IP (一般设置在第一层代理服务器)
		proxy_set_header X-Real-IP $remote_addr;
		# 访问的协议
		proxy_set_header X-Forwarded-Scheme $scheme;
		# 将经过多个代理服务器的ip以 逗号 拼接,最左边是用户真实ip
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

		# Websocket
		proxy_set_header Connection "upgrade";
		proxy_set_header Upgrade $http_upgrade;

		# 目标服务器数据回传超时时间
		proxy_send_timeout 10;
		# 目标服务器响应超时时间
		proxy_read_timeout 30;
		# 和目标服务器连接超时时间
		proxy_connect_timeout 90;
	}
}

简单的写一个后端服务:

const express = require("express");
const app = express();

const port = 10001;
app.use((req, res) => {
	res.json({
		port,
		code: 200,
		msg: "ok",
		url: req.url
	})
})

app.listen(port, () => console.log('server is running on port' + port));

防盗链

valid_referers [none|blocked|server_names|string ...];

  • none:允许空的引用来源(Referer)。
  • blocked:阻止所有的引用来源(Referer)。
  • server_names:允许与服务器名匹配的引用来源(Referer)。
  • string:允许指定字符串的引用来源(Referer),可以使用通配符和正则表达式进行匹配。

下面例子设置了不允许refer为none(不允许单独打开图片),使用正则匹配只允许refer为 general-mac.com 或其任何子域名,其余的都会返回403,

server {
	server_name *.general-mac.com;

	location ~ \.(png|jpg|jpeg|gif|webp)$ {
		valid_referers blocked server_names "~.*general-mac\.com$";

		if ($invalid_referer) {
			return 403;
		}
	}
}