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<ProxyMiddleware>();
这样就可以在HttpContext.Connection.RemoteIpAddress中获取到真实的客户端IP了