nginx笔记
1.正向代理:
当需要实现客户端安全等操作时,用正向代理,可防止服务端知道是哪台服务器发起的请求,如:
server {
listen 80;
resolver 223.5.5.5 8.8.8.8; # 指定DNS服务器IP地址
location / {
proxy_set_header HOST $host;
proxy_http_version 1.1;
proxy_pass $scheme://$http_host$request_uri;
}
}
2.反向代理:
当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取$remote_addr),取得的是nginx的地址,
即$remote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的。
但是,nginx是可以获得用户的真实ip的,也就是说nginx使用$remote_addr变量时获得的是用户的真实ip,
如果我们想要在web端获得用户的真实ip,就必须在nginx里作一个赋值操作,即:
proxy_set_header X-Real-IP $remote_addr;
$remote_addr 只能获取到与服务器本身直连的上层请求ip,所以设置$remote_addr一般都是设置第一个代理上面;
但是问题是,有时候是通过cdn访问过来的,那么后面web服务器获取到的,永远都是cdn 的ip 而非真是用户ip,
那么这个时候就要用到X-Forwarded-For 了,这个变量的意思,其实就像是链路反追踪,从客户的真实ip为起点,穿过多层级的proxy ,
最终到达web 服务器,都会记录下来,所以在获取用户真实ip的时候,这样就能获取所有的代理ip 客户ip,一般就可以设置成:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
3.负载均衡
1)如果你的服务器有用Nginx做负载均衡的话,你需要在你的location里面配置X-Real-IP和X-Forwarded-For请求头。
2)如果需要权重分配,可以使用以下配置,即:
upstream targetserver {
server localhost:81 weight=3;
server localhost:5500 weight=1;
}
server {
listen 8000;
listen localhost:8081;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass $scheme://targetserver;
}
}
实例:
需求:通过请求传递过来的参数 ip和username,实现对不同的服务器发起请求数据
解析:通过携带/is-api/cpdd的请求,携带参数ip和username实现转发
如:请求 http://192.168.3.4:8080/is-api/cpdd/?ip=192.168.3.1&username=张三 (ps:192.168.3.4为代理服务器地址)
最后实际请求是 http://192.168.3.1/login/cpdd?username=张三
server {
listen 8080;
server_name localhost;
location /is-api/cpdd {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass $scheme://$arg_ip/login/cpdd?username=$arg_username;
}
}
Nginx常用的全局指令
user:指定Nginx所使用的系统用户和用户组,默认为nobody;
worker_processes:指定Nginx工作进程的数量,默认为1;
worker_cpu_affinity:指定每个worker进程绑定的CPU核心;
worker_rlimit_nofile:指定每个worker进程允许打开的最大文件数;
pid:指定Nginx进程号存放的位置,默认为/var/run/nginx.pid;
access_log:指定Nginx访问日志存放的位置和格式;
error_log:指定Nginx错误日志存放的位置和格式,常用的格式有 debug, info, notice, warn, error和 crit;
events:指定Nginx事件模块的配置,常见的配置包括 worker_connections(最大连接数)和 use, epoll和 kqueue,以及其他一些事件模块配置;
http:指定Nginx HTTP模块的配置,包括 server_names_hash_max_size(域名哈希表的最大尺寸)、 server_names_hash_bucket_size(每个哈希桶的大小)、 client_max_body_size(前端客户端传输的最大请求体大小)等等;
server:指定Nginx所有server块的配置,包括 listen(服务器监听端口)、 server_name(服务器域名)、 access_log(访问日志路径和格式)等等。
keepalive_timeout:指定HTTP keep-alive连接超时时间。
multi_accept:一个请求是否能够被多个 worker 处理。
gzip:是否启用gzip压缩传输;
ssl:开启SSL支持;
use:添加 nginx 模块;
nginx常用的内置变量
$request_method:所使用的 HTTP 请求方法,如 GET、POST、PUT、DELETE、HEAD 等。
$host: 请求的主机名。
$http_host: 代理的服务器的主机IP。
$http_referer: 请求的 HTTP referer 头部字段。
$http_user_agent: 请求的 User-Agent 头部字段。
$remote_addr: 客户端的 IP 地址。
$request_body: 请求主体的内容。
$request_uri: 请求的 URI 包括参数部分。
$args: 请求中的参数部分,同 $query_string。
$scheme: 请求使用的协议,比如 http 或 https。
$server_name: Nginx 配置中当前虚拟主机的名称。
$server_port: Nginx 监听的端口号