AspNetCore+Docker +Nginx 反向代理

docker pull nginx
docker run -d --name nginx -p 12345:80 nginx

第二句是将主机的12345端口绑定到容器的80端口

docker exec -it nginx bash

这里就进入到linux里的控制台了

我们知道 nginx的主配置文件是在/etc/nginx的nginx.conf

使用more命令查看可以看到文件结尾有一句

include /etc/nginx/conf.d/*.conf;

那么 用ls查看该目录只有一个default.conf,于是乎我们就

VI之...

尴尬的是容器里是没有vi命令的,我们就要贯彻我们的核心价值观,安装之...

apt-get update
apt-get install vim

 

upstream demos{
	server {IP地址}:{端口} weight=1;//负载均衡,目前单主机,前面填上需要指向的服务器地址跟端口
}
server{
	listen 80 default_server;
	listen [::]:80 default_server;
	server_name demo;
	location / {
		proxy_pass http://demos;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection keep-alive;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr; //真实的客户端IP
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_cache_bypass $http_upgrade;

	}
}

附上nginx内置变量清单 

$args                      请求中的参数;
$binary_remote_addr        远程地址的二进制表示
$body_bytes_sent           已发送的消息体字节数
$content_length            HTTP请求信息里的"Content-Length"
$content_type              请求信息里的"Content-Type"
$document_root             针对当前请求的根路径设置值
$document_uri              与$uri相同
$host                      请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;    
$http_cookie               cookie 信息 
$http_referer              来源地址
$http_user_agent           客户端代理信息
$http_via                  最后一个访问服务器的Ip地址
$http_x_forwarded_for      相当于网络访问路径。    
$limit_rate                对连接速率的限制          
$remote_addr               客户端地址
$remote_port               客户端端口号
$remote_user               客户端用户名,认证用
$request                   用户请求信息
$request_body              用户请求主体
$request_body_file         发往后端的本地文件名称      
$request_filename          当前请求的文件路径名
$request_method            请求的方法,比如"GET"、"POST"等
$request_uri               请求的URI,带参数   
$server_addr               服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费)
$server_name               请求到达的服务器名
$server_port               请求到达的服务器端口号
$server_protocol           请求的协议版本,"HTTP/1.0"或"HTTP/1.1"
$uri                       请求的URI,可能和最初的值有不同,比如经过重定向之类的

在项目中,我们创建一个中间件

public class ProxyMiddleware
    {
        private readonly RequestDelegate _requestDelegate;

        public ProxyMiddleware(RequestDelegate requestDelegate)
        {
            _requestDelegate = requestDelegate;
        }
        public Task Invoke(HttpContext context)
        {
            var headers = context.Request.Headers;
            if (headers.ContainsKey("X-Forwarded-For"))
            {
                
                var ipAddresses = headers["X-Forwarded-For"].ToString().Split(',', StringSplitOptions.RemoveEmptyEntries);
                context.Connection.RemoteIpAddress = IPAddress.Parse(ipAddresses.FirstOrDefault());
            }
            return _requestDelegate(context);
        }
    }

并在Startup中应用之

app.UseMiddleware();

这样就可以在HttpContext.Connection.RemoteIpAddress中获取到真实的客户端IP了

你可能感兴趣的:(技术原创)