Nginx整理
nginx获取真实IP方式
开启方式
先用nginx -V检查是否安装过realip模块
如果没有安装又是线上环境客户不愿意安装模块
可以先在logformat中增加$http_x_forward_for变量来输出真实IP
注意点:由于经过多个PROXY都会记录在xff头上,可能会有多个IP,记录的顺序
格式: X-Forwarded-For: client, proxy1, proxy2
安装reali模块后可以用XFF里的IP来取代remoteip
需要加入配置:
set_real_ip_from 0.0.0.0/0 // 信任所有的来源, 因为 RS 是直接挂载在 SLB 后面的, 所以不需要考虑安全问题
real_ip_header X-Forwarded-For; // 使用 X-Forwarded-For 中的 IP 来替代 Client Address
real_ip_recursive off; // 不使用`set_real_ip_from`指定的 IP 进行筛选, 这个是默认值可以不指定
nginx日志出现大量499错误。
117.37.64.103 - - [03/Dec/2015:12:06:39 +0800] "POST /music/api/index_music HTTP/1.1" 499 4998 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30" "-" "0.114" "--LsiVAbT1-aiEN2EqHx-V0cNYYx4O2-1OebXb\x0D\x0AContent-Disposition: form-data; name=\x22_secdata\x22\x0D\x0AContent-Type: text/plain; charset=UTF-8\x0D\x0AContent-Transfer-Encoding: 8bit\x0D\x0A\x0D\x0AC4nvB3JX0lpcbeEXmVgyZkTQaGWUgEs1QvxqSEI8c9qNi0a4LDkFTY1qf3H3kSzA8E1eOgtjiwbkvhEBoyTSmZYxMxvTwYZg2p1rDenejFDLj2uP9C8PVIQYdzbEzjYtlvqvUqIYixC3bYOBJV57yK7z0oh_vrcUTQcaKsnyd9zdGP8nYxY_uqj5yN3tMDbq7k5v6d-j321MLJ2pirirMv7AWaplJbLkuuw8dnvgGslScDb2dTAWBi8MXZB6FvdBSc-PucRky2nb3NYLO8CcEMyYrr7yTZXQKp-_2UqGkxQp_F00YTgd9mpDexBQBZCR4yv0nSwVUhRXq2tCRlVGVd0ekTxagP9z8K4iA28PtsvW680aYo9AmQ..\x0D\x0A--LsiVAbT1-aiEN2EqHx-V0cNYYx4O2-1OebXb\x0D\x0AContent-Disposition: form-data; name=\x22limit\x22\x0D\x0AContent-Type: text/plain; charset=UTF-8\x0D\x0AContent-Transfer-Encoding: 8bit\x0D\x0A\x0D\x0A30\x0D\x0A--LsiVAbT1-aiEN2EqHx-V0cNYYx4O2-1OebXb\x0D\x0AContent-Disposition: form-data; name=\x22page\x22\x0D\x0AContent-Type: text/plain; charset=UTF-8\x0D\x0AContent-Transfer-Encoding: 8bit\x0D\x0A\x0D\x0A1\x0D\x0A--LsiVAbT1-aiEN2EqHx-V0cNYYx4O2-1OebXb--\x0D\x0A"
180.117.130.55 - - [03/Dec/2015:12:06:39 +0800] "POST /widget/api/get_slides HTTP/1.1" 499 271 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30" "-" "0.069" "--PAMIR3msiYnFTdK9hkrpwE5OpK1PUFuZL\x0D\x0AContent-Disposition: form-data; name=\x22_secdata\x22\x0D\x0AContent-Type: text/plain; charset=UTF-8\x0D\x0AContent-Transfer-Encoding: 8bit\x0D\x0A\x0D\x0As-Mtm0PwQUxF_ArURcbwH3aYulFsHP-YVvEmcv8cj1lL_TBwTM-6ZShB-kZMjZWRxGj87-vy2A-iA6BozD9HJsdvB3eowhbJvLZUXZq4HB3-f3j13mxwgbwpWRIAGh_QDLB_i6n8gEmmVsoHTmqCP0iRoc2owv1ufkIYdMmANAWgw4PWBelqWEYTrpY_ynArIMKYqIzAEWFvGGa98fe6w-QlGcbBc4T4yPClU_dibDgJLHdGzZfqC1TJrL_dEFaKkbS8vjk9l98lmNWlZHRhOIfLONhRtfzYF4PBoonF-yFWcOHSKGhI2y9lDwGwdfNaPTVRGDmxYezZLpmzcW_TpOi2bsEELOcEZL9Vcc79zcU8Z_CRuJdeNWxLqoX7RTfBAm_tLQ..\x0D\x0A--PAMIR3msiYnFTdK9hkrpwE5OpK1PUFuZL\x0D\x0AContent-Disposition: form-data; name=\x22limit\x22\x0D\x0AContent-Type: text/plain; charset=UTF-8\x0D\x0AContent-Transfer-Encoding: 8bit\x0D\x0A\x0D\x0A1\x0D\x0A--PAMIR3msiYnFTdK9hkrpwE5OpK1PUFuZL\x0D\x0AContent-Disposition: form-data; name=\x22posid\x22\x0D\x0AContent-Type: text/plain; charset=UTF-8\x0D\x0AContent-Transfer-Encoding: 8bit\x0D\x0A\x0D\x0A1\x0D\x0A--PAMIR3msiYnFTdK9hkrpwE5OpK1PUFuZL--\x0D\x0A"
首先要先了解客户conf里设置的proxy_ignore_client_abort on 作用是什么?
默认情况下proxy_ignore_client_abort 这个在nginx里关闭,如果on后以后,即表示代理服务端不要主要主动关闭客户端连接,这里注意,是服务器不主动关闭客户端,但是如果本身客户端在本地网络不畅,导致连接到server断开,这个也会有499,跟文景沟通了下,这个不影响访问。
nginx报错502
NGINX 502 Bad Gateway错误是FastCGI有问题,造成nginx 502错误的可能性比较多。,先从FastCGI配置入手:
1.查看FastCGI进程是否已经启动NGINX 502错误的含义是sock、端口没被监听造成的。我们先检查fastcgi是否在运行
2.检查系统Fastcgi进程运行情况除了第一种情况,fastcgi进程数不够用、php执行时间长、或者是php-cgi进程死掉也可能造成nginx的502错误运行以下命令判断是否接近FastCGI进程,如果fastcgi进程数接近配置文件中设置的数值,表明worker进程数设置太少
netstat-anpo|grep"php-cgi"|wc-l
3.FastCGI执行时间过长根据实际情况调高以下参数值
fastcgi_connect_timeout300;
fastcgi_send_timeout300;
fastcgi_read_timeout300;
4.头部太大 nginx和apache一样,有前端缓冲限制,可以调整缓冲参数
fastcgi_buffer_size32k;
fastcgi_buffers832k;
如果你使用的是nginx的负载均衡Proxying,调整
proxy_buffer_size 16k;
proxy_buffers 416k;
5.https转发配置错误正确的配置方法
server_name www.mydomain.com;
location/myproj/repos{
set$fixed_destination $http_destination;
if($http_destination~*^https(.*)$)
{
set$fixed_destination http$1;
}
proxy_set_headerHost$host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_headerDestination$fixed_destination;
proxy_pass http://subversion_hosts;
}
Nginx反向代理配置
upstream tornado {
server 127.0.0.1:8888;
}
server {
listen 80;
root /root/nmapp2_venv;
index index.py index.html;
server_name server;
location / {
#if (!-e $request_filename) {
# rewrite ^/(.*)$ /index.py/$1 last;
#}
}
location ~ /index\.py {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://tornado;
}
}
Nginx 反向代理的指令不需要新增额外的模块,默认自带 proxy_pass 指令,只需要修改配置文件就可以实现反向代理。
配置后端跑 apache 服务的 ip 和端口,也就是说,实现通过 http://ip:port 能访问到网站。
只要新建一个 vhost.conf,加入如下内容(记得修改 ip 和域名为你的 ip 和域名)。修改nginx.conf,添加 include quancha.conf 到http{}段, reload nginx就可以了。
Nginx 反向代理模板:
## Basic reverse proxy server ##
upstream apachephp {
server ip:8080; #Apache
}
## Start www.nowamagic.net ##
server {
listen 80;
server_name www.nowamagic.net;
access_log logs/quancha.access.log main;
error_log logs/quancha.error.log;
root html;
index index.html index.htm index.php;
## send request back to apache ##
location / {
proxy_pass http://apachephp;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
apache伪静态与nginx伪静态最根本区别
apache 伪静态最基本原则 RewriteCond 后面跟筛选条件 RewriteRule 跳转规则
nginx 使用rewrite配置跳转规则
如果发现客户.htaccess文件中用的是rewrite,说明是nginx伪静态规则,让客户转换成apache伪静态规则就可以。工单遇到过此类问题,引导一下客户。
nginx 访问提示 400 Bad Request
一般情况下:
nginx 400 Bad request是request header过大所引起,request过大,通常是由于cookie中写入了较大的值所引起。在nginx.conf中,将client_header_buffer_size和large_client_header_buffers都调大,可缓解此问题。
client_header_buffer_size:默认是1k,所以header小于1k的话是不会出现问题的。
large_client_header_buffers:该命令用于设置客户端请求的Header头缓冲区的大小,默认值为4KB。客户端请求行不能超过large_client_header_buffers指令设置的值,客户端请求的Header头信息不能大于large_client_header_buffers指令设置的缓冲区大小,否则会报“Request URL too large”(414)或者“Bad-request”(400)错误,如果客户端Cookie信息较大,则须增加缓冲区大小。
建议您参考上面的方法进行一下调试。
Linux下如何查看定位当前正在运行的Nginx的配置文件
如果客户运行有多个Nginx,如何查看定位当前正在运行的Nginx的配置文件?
1. 查看nginx的PID,以常用的80端口为例:
netstat -anop | grep 0.0.0.0:80
2. 通过相应的进程ID(比如:4562)查询当前运行的nginx路径:
ll /proc/4562/exe
3. 获取到nginx的执行路径后,使用-t参数即可获取该进程对应的配置文件路径,如:
# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful