首页 > 代码库 > Nginx整理

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

 

Nginx整理