标签 nginx 下的文章

Nginx 414 Request-URI Too Large报错解决方法

症状:前台客户端发送大量请求或发送的数据包太大的时候,nginx会报nginx 414 Request-URI Too Large错误,如下图
1.png
检查Log里面显示有大量报错

2019/04/09 15:03:32 [error] 21197#0: *90489 client intended to send too large body: 1470779 bytes, client: 124.74.25.254, server: zt-test.xxx.cn, request: "POST /cinema/salesman/save HTTP/1.1", host: "zt-test.xxx.cn:8080", referrer: "http://zt-test.xxx.cn:8080/index"
2019/04/09 15:22:37 [error] 21200#0: *90745 client intended to send too large body: 1376065 bytes, client: 114.86.94.252, server: zt-test.xxx.cn, request: "POST /cinema/salesman/save HTTP/1.1", host: "zt-test.xxx.cn:8080", referrer: "http://zt-test.xxx.cn:8080/index"
2019/04/10 09:08:46 [error] 21200#0: *91741 client intended to send too large body: 1470779 bytes, client: 124.74.25.254, server: zt-test.xxx.cn, request: "POST /cinema/salesman/save HTTP/1.1", host: "zt-test.xxx.cn:8080", referrer: "http://zt-test.xxx.cn:8080/index


---阅读剩余部分---

Centos7.6快速编译安装Nginx-1.14.2 及Php7.3.0

PHP7.3.png
操作系统版本:

cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

安装扩展包并更新系统内核:

yum install epel-release -y
yum update -y

安装基础依赖组件

yum install wget vim pcre pcre-devel openssl openssl-devel libicu-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap jemalloc-devel cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel openssl openssl-devel -y

---阅读剩余部分---

Nginx记录请求分发日志及后端负载的IP

前端nginx接收到请求之后, 需把请求分发到后端WEB服务集群,需要记录分发日志, 来分析后端每台WEB服务器处理的请求数目,日志里面需要记录客户端IP、每个URL请求是哪个后端处理的,nginx配置文件如下:

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
              '$connection $upstream_addr '
              'upstream_response_time $upstream_response_time request_time $request_time ';
    access_log  logs/access.log  main;

参数说明:

$server_name:虚拟主机名称。
$remote_addr:远程客户端的IP地址,请求者IP。
-:空白,用一个“-”占位符替代,历史原因导致还存在。
$remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白。
[$time_local]:访问的时间与时区,比如07/Jun/2016:08:54:27 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。
$request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
$status:记录请求返回的http状态码,比如成功是200。
$uptream_status:upstream状态,比如成功是200.
$body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。
$http_referer:记录从哪个页面链接访问过来的。
$http_user_agent:客户端浏览器信息
$http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
$ssl_protocol:SSL协议版本,比如TLSv1。
$ssl_cipher:交换数据中的算法,比如RC4-SHA。
$upstream_addr:upstream的地址,即真正提供服务的主机地址。
$request_time:整个请求的总时间。
$upstream_response_time:请求过程中,upstream的响应时间。

---阅读剩余部分---

平滑升级Nginx到最新版本

Nginx目前爆出在HTTP/2 和 MP4 模块中存在安全漏洞,容易被DOS攻击。
8cf51541726528.jpg

Nginx官方于11月6日发布了新版本,用于修复影响 1.15.6, 1.14.1 之前版本的多个安全问题,被发现的安全问题有一种这样的情况 —— 允许潜在的攻击者触发拒绝服务(DoS)状态并访问敏感的信息,见官方公告:http://nginx.org/en/security_advisories.html
低版本升级到目前最新版nginx-1.14.1方法步骤如下:
1、查看原来安装nginx的版本以及编译的参数:

[root@xshell ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
built with OpenSSL 1.0.2o  27 Mar 2018
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/data/lnmp1.5-full/src/openssl-1.0.2o

2、下载nginx最新稳定版本

wget http://nginx.org/download/nginx-1.14.1.tar.gz

3、解压ningx压缩包并编译make

tar xvf nginx-1.14.1.tar.gz
cd nginx-1.14.1
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/data/lnmp1.5-full/src/openssl-1.0.2o
make

4、make编译完后会在安装目录下生成一个objs目录且在该目录下有一个nginx执行文件

[root@xshell nginx-1.14.1]# ll
total 756
-rw-r--r-- 1 www  www  287441 Nov  6 21:52 CHANGES
-rw-r--r-- 1 www  www  438114 Nov  6 21:52 CHANGES.ru
-rw-r--r-- 1 www  www    1397 Nov  6 21:52 LICENSE
-rw-r--r-- 1 root root    376 Nov  9 10:56 Makefile
-rw-r--r-- 1 www  www      49 Nov  6 21:52 README
drwxr-xr-x 6 www  www    4096 Nov  9 10:55 auto
drwxr-xr-x 2 www  www    4096 Nov  9 10:55 conf
-rwxr-xr-x 1 www  www    2502 Nov  6 21:52 configure
drwxr-xr-x 4 www  www    4096 Nov  9 10:55 contrib
drwxr-xr-x 2 www  www    4096 Nov  9 10:55 html
drwxr-xr-x 2 www  www    4096 Nov  9 10:55 man
drwxr-xr-x 3 root root   4096 Nov  9 11:00 objs
drwxr-xr-x 9 www  www    4096 Nov  9 10:55 src
[root@xshell nginx-1.14.1]# ll objs/
total 10348
-rw-r--r-- 1 root root    52252 Nov  9 10:56 Makefile
-rw-r--r-- 1 root root    17763 Nov  9 10:55 autoconf.err
-rwxr-xr-x 1 root root 10394568 Nov  9 11:00 nginx
-rw-r--r-- 1 root root     5341 Nov  9 11:00 nginx.8
-rw-r--r-- 1 root root     7555 Nov  9 10:56 ngx_auto_config.h
-rw-r--r-- 1 root root      657 Nov  9 10:55 ngx_auto_headers.h
-rw-r--r-- 1 root root     8401 Nov  9 10:55 ngx_modules.c
-rw-r--r-- 1 root root    89712 Nov  9 11:00 ngx_modules.o
drwxr-xr-x 9 root root     4096 Nov  9 10:55 src

5、备份老的nginx文件,复制新文件

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak
cp objs/nginx /usr/local/nginx/sbin/

6、检测配置文件是否正常

/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

7、使用make upgrade替换老的nginx进程

make upgrade
/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
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

8、执行/usr/local/nginx2/sbin/nginx -V查看nginx最新的版本及编译的参数

/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
built with OpenSSL 1.0.2o  27 Mar 2018
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/data/lnmp1.5-full/src/openssl-1.0.2o

9、重新reload服务

/usr/local/nginx/sbin/nginx -s reload

至此平滑升级完成

Nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in nginx.conf解决之热更新

Nginx如果未开启SSL模块,配置Https时提示错误

nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf

是因为nginx缺少http_ssl_module模块,编译安装的时候带上--with-http_ssl_module参数
Nginx开启SSL模块步骤:
安装openssl支持

yum install openssl openssl-devel -y

查看nginx原有的模块

/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx 

增加--with-http_ssl_module参数

/usr/local/nginx/sbin/nginx --prefix=/usr/local/nginx --with-http_ssl_module
make

这里不要进行make install,否则就是覆盖安装
备份原有已安装好的nginx

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

复制源码目录下的 objs/nginx 覆盖/usr/local/nginx/sbin/nginx

cp ./objs/nginx /usr/local/nginx/sbin/

对新安装的进行语法测试,显示successfully表示成功

/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

/usr/local/nginx/sbin/nginx -s reload  重新加载,实现平滑升级

查看是否已经加入成功新编译的参数:

/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-zlib=/opt/zlib-1.2.11 --with-pcre=/opt/pcre-8.42 --with-http_stub_status_module --with-http_realip_module --with-http_gzip_static_module --with-http_ssl_module

提取jks证书配置Nginx使其支持https

证书配置在nginx上,对外提供https服务,内部和tomcat做反向代理走http,提取jks证书步骤如下:
提取jks证书(keytool命令安装jdk以后就默认安装了)
查看jks文件中的entry

keytool -list -keystore server.jks

查看是否有entries,如果有下个命令需要加 -srcalias 参数指定entry

转换jks文件为p12

keytool -importkeystore -srckeystore server.jks -destkeystore server.p12 -deststoretype PKCS12

查看新格式(pkcs12)证书库

keytool -deststoretype PKCS12 -keystore server.p12 -list

使用openssl提取证书并合并

openssl pkcs12 -in server.p12 -nokeys -clcerts -out server-ssl.crt
openssl pkcs12 -in server.p12 -nokeys -cacerts -out gs_intermediate_ca.crt

server-ssl.crt是SSL证书,gs_intermediate_ca.crt是中级证书,合并到一起才是nginx所需要的证书

cat server-ssl.crt gs_intermediate_ca.crt > server.crt

提取私钥及免密码

openssl pkcs12 -nocerts -nodes -in server.p12 -out server.key

避免重启是总是要输入私有key的密码

openssl rsa -in server.key -out server.key.unsecure

配置nginx


worker_processes  8;

error_log  logs/error.log  notice;

pid        logs/nginx.pid;


events {
    worker_connections  65535;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout 300;
    proxy_read_timeout 300;
    add_header Access-Control-Allow-Origin *;
    client_max_body_size    1000m;
    client_header_buffer_size 100m;
    large_client_header_buffers 4 102400k;
    set_real_ip_from  10.201.21.199;
    real_ip_header    X-Forwarded-For;
    real_ip_recursive on;
    ssl_certificate   /etc/pki/cn/server.crt;
    ssl_certificate_key /etc/pki/cn/server.key;
    include gzip.conf;
    include apmweb_upstream.conf;


    server {
        listen       80;
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate   /etc/pki/cn/server.crt;
        ssl_certificate_key /etc/pki/cn/server.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_prefer_server_ciphers on;
        ssl_session_timeout 1d;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security max-age=15768000;

        #proxy_redirect http:// $scheme://;
        proxy_redirect ~^http://inamp.xxx.com/(.*)$  https://inamp.xxx.com/$1;

        port_in_redirect on;
        proxy_set_header Host $host:$server_port;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;

        location / {
            root   /data/apm_static;
            index  index.html index.htm;
        }

       location ~*  ^/$ {
        rewrite ^/$ http://inamp.xxx.com/enrolment_web/enrolment/index.htm ;
       }

        include apmweb_tomcat.conf;

        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }

}

apmweb_tomcat.conf内容

           location ~* ^/management_service.*$ {
           include deny.conf;

           proxy_pass http://apmserapp6300;
           include proxy.conf;

           error_log  logs/apm_management_service_error.log error;
           access_log  logs/apm_management_service_access.log  main;
       

apmweb_upstream.conf内容

    upstream apmwebapp6300 {
      server 10.101.1.160:6300 weight=1 max_fails=2 fail_timeout=10s;
      server 10.101.1.161:6300 weight=1 max_fails=2 fail_timeout=10s;
      server 10.101.1.162:6300 weight=1 max_fails=2 fail_timeout=10s;
    }
.......

gzip.conf

gzip on;
gzip_comp_level 2;
gzip_http_version 1.1;
gzip_proxied any;
gzip_min_length 1;
gzip_buffers 16 8k;
gzip_types text/plain text/css application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript application/jsp application/html application/htm;

Nginx请求报Not Allowed 405解决方法

nginx不允许向静态文件提交post方式的请求,否则会返回“HTTP/1.1 405 Method not allowed”错误,
405.jpg
解决方法有三种:
一、重定向405错误码到200
在nginx server{}里面添加以下内容,root为站点的根目录

   location ~ (.*\.json) {
        root  html;
        error_page 405 =200 $1;
   }

最后reload nginx即可。
二、转换静态文件接收的POST请求到GET方法

upstream static80 {
    server localhost:80;
}

server {
    listen 80;
    ...

    error_page 405 =200 @405;
    location @405 {
        root  html;
        proxy_method GET;
        proxy_pass http://static80;
    }
}

三、安装编译的时候修改源码(不推荐此方法)
源码文件位于/nginx源码目录/src/http/modules/ngx_http_static_module.c,找到如下代码:

if (r->method & NGX_HTTP_POST) {
     return NGX_HTTP_NOT_ALLOWED;
}

整段注释掉,然后重新编译 make,不需要make install,把编译生成的nginx文件复制到sbin下的nginx文件,重启nginx即可。

Nginx报The plain HTTP request was sent to HTTPS port 400错误解决方法

nginx在配置https以后,使用http访问系统,报400错误The plain HTTP request was sent to HTTPS port
原因主要是nginx.conf里面打开了ssl on参数

ssl on;

ssl on会将整个virtual server都开启成ssl,会造成http请求也转发到了https上造成400错误,所以http访问的时候回报400错误,参见官方文档http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl
要http和https共存可以用下面这个方法:

    server {
        listen       80;
        listen       443 ssl;
    #ssl on;
        server_name  localhost;
        ......
        ......

即可http和https共存,都能访问系统·

安装sticky模块报错问题解决

sticky 模块在编译进nginx的时候,在以上nginx0.9版本会报错,需要修改源文件:

编译时出现错误:
cc1: warnings being treated as errors
ngx_http_sticky_module.c: In function ‘ngx_http_get_sticky_peer’:
/ngx_http_sticky_module.c:333: 警告:赋值时将整数赋给指针,未作类型转换
ake[1]: *** [objs/addon/nginx-sticky-module-1.1/ngx_http_sticky_module.o] 错误 1

ngx_http_sticky_misc.c 的281行修改如下

digest->len = ngx_sock_ntop(in, digest->data, len, 1);

改后

digest->len = ngx_sock_ntop(in, sizeof(struct sockaddr_in), digest->data, len, 1);

ngx_http_sticky_module.c文件也进行修改
第6行添加:

#include <nginx.h>

2f811f7c-f464-3291-b40d-1b2e6529e760.jpg

第340行左右修改(iphp->rrp.current = iphp->selected_peer;)为:

if (peer && selected_peer >= 0) {
                 ngx_log_debug(NGX_LOG_DEBUG_HTTP, pc->log, 0, "[sticky/get_sticky_peer] peer found at index %i", selected_peer);
#if defined(nginx_version) && nginx_version >= 1009000
                 iphp->rrp.current = peer;
#else
                 iphp->rrp.current = iphp->selected_peer;
#endif

195434_cnGd_2611077.jpg

h.png

最后重新编译即可。
来源:
https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/commits/51efa124a4330e194ef651e597a6038a6f7979dc

Nginx sticky模块实现基于cookie的负载均衡

在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信,我们势必使用长连接。使用什么方式来实现这种连接呢,常见的有使用nginx 自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端是cdn,或者说一个局域网的客户同时访问服务器,导致出现服务器分配不均衡,以及不能 保证每次访问都粘滞在同一台服务器。如果基于cookie会是一种什么情形,想想看, 每台电脑都会有不同的cookie,在保持长连接的同时还保证了服务器的压力均衡,nginx sticky值得推荐。

如果浏览器不支持cookie,那么sticky不生效,毕竟整个模块是给予cookie实现的.

nginx sticky 模块工作流程图
sticky-0.jpg

下载安装nginx sticky
下载地址:http://code.google.com/p/nginx-sticky-module/downloads/list
安装nginx + sticky模块

wget http://nginx-sticky-module.googlecode.com/files/nginx-sticky-module-1.1.tar.gz
tar -xzvf nginx-sticky-module-1.1.tar.gz
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar -xvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --prefix=/usr/local/nginx-1.12.2 --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=../nginx-sticky-module-1.1
make
make install

平滑无缝升级Nginx并安装nginx + sticky模块
nginx每次安装一个新的模块都需要重新编译一次,编译完成之后将nginx这一个文件拷贝到sbin下面覆盖即可;

/usr/local/nginx/sbin/nginx -V  //需要查看原来安装的nginx的版本以及编译的参数
--with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=../nginx-sticky-module-1.1  //原有参数基础之上增加参数
 
//--with-http_gzip_static_module        启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)
//--with-http_stub_status_module                   启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态)
//--with-http_ssl_module                  启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)
//--with-http_realip_module            启用ngx_http_realip_module支持(这个模块允许从请求标头更改客户端的IP地址值,默认为关)
//--add-module=PATH                启用外部模块支持
 
make  //编译完,在objs目录下有一个nginx执行文件,不要make install,否则就是覆盖安装;
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/nginx
make upgrade       //替换老的nginx进程
再次执行:/usr/local/nginx/sbin/nginx -V 将会显示新的nginx的版本及编译的参数。
/usr/local/nginx/sbin/nginx -v  查看nginx版本号

配置nginx sticky

upstream pdapp {
     sticky;
     server 192.168.100.20:7100 weight=1 max_fails=2 fail_timeout=10s;
     server 192.168.100.21:7100 weight=1 max_fails=2 fail_timeout=10s;
}

最后reload nginx即可。
nginx sticky其他语法

sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];
name: 可以为任何的string字符,默认是route
domain:哪些域名下可以使用这个cookie
path:哪些路径对启用sticky,例如path/test,那么只有test这个目录才会使用sticky做负载均衡
expires:cookie过期时间,默认浏览器关闭就过期,也就是会话方式。
no_fallbackup:如果设置了这个,cookie对应的服务器宕机了,那么将会返回502(bad gateway 或者 proxy error),建议不启用

备注:每台后端真实服务器都会有一个唯一的route值,所以不管你真实服务器前端有几个装了sticky的nginx代理,他都是不会变化的. 这个cookie是会话方式的,所以你浏览器关闭了,服务器会给你重新分配一台服务器。

nginx sticky模块不能与ip_hash同时使用

官方文档:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#sticky
http://code.google.com/p/nginx-sticky-module/wiki/Documentation

Nginx解决超长请求串(413 request Entity too Large错误解决办法)

nginx作为反向代理服务器,小文件上传可以,大文件上传会报413,400,414(如 413 request Entity too Large)等状态码,这是因为请求长度超过了nginx默认的缓存大小和最大客户端最大请求大小,增加或修改以下参数,一般可解决此类问题:
http段:

    keepalive_timeout 300;
    proxy_read_timeout 300;
    add_header Access-Control-Allow-Origin *;
    client_max_body_size    1000m;
    client_header_buffer_size 100m;
    large_client_header_buffers 4 512k;

nginx目录下的*temp要有写入权限,请求超出缓冲区大小时会写缓存文件;
location段:

      location ~* ^/OCC_DataCollection_Web/.*$ {
           include deny.conf;

           proxy_pass http://clcapp7300;
           proxy_set_header Host $http_host;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Scheme $scheme;
           proxy_set_header X-Script-Name /octoprint;
           client_max_body_size    1000m;

           error_log  logs/clc_OCC_DataCollection_Web_error.log error;
           access_log  logs/clc_OCC_DataCollection_Web_access.log  main;
       }

upstream段:

    upstream clcapp7300 {
      ip_hash;
      server 10.254.0.21:7300 weight=1 max_fails=2 fail_timeout=300s;
      server 10.254.0.22:7300 weight=1 max_fails=2 fail_timeout=300s;
    }

Nginx中使用Realip模块获取用户真实IP地址

Web服务器前端有代理服务器或者nginx做了二次转发或CDN时日志中的$remote_addr可能就不是客户端的真实IP了,IP默认会显示为前端代理的IP了,要获取到真实IP,常用的解决方法有以下三种:
1、使用CDN自定义IP头来获取
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
缺点:需要CDN厂商提供
CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:

proxy_set_header remote-user-ip $remote_addr;

后端将会收到remote_user_ip的http头,直接读取HTTP_REMOTE_USER_IP的内容基是客户端真实IP





---阅读剩余部分---

通过Nginx、Uwsgi快速部署Django

uwsgi:是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
运行过程:
nginx作为服务器的最前端,它将接受WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是nginx的强项,静态文件像我们django博客项目中的static文件夹下面的图片,css,js)。



---阅读剩余部分---

nginx的location及rewrite正则表达式

rewrite使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用.

rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:

1、执行server块的rewrite指令
2、执行location匹配
3、执行选定的location中的rewrite指令



---阅读剩余部分---

Nginx启用gzip压缩及参数说明

gzip(GUN-ZIP)是一种压缩技术,经过gzip压缩后的页面大小可以变成原来的30%或者更小。用户浏览页面的时候速度也会更快,gzip的压缩页面需要服务端于浏览器同时支持,服务端压缩传到浏览器进行解压并解析,现在大多数的浏览器都已经支持解析gzip过的页面
gzip使用环境:http,server,location,if(x),一般定义在nginx.conf的http{…..}之间;


---阅读剩余部分---

Linux系统消除未被及时释放的TIME_WAIT状态的TCP连接

Linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。

[root@web1 ~]netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 1280
FIN_WAIT1 7
SYN_SENT 1
FIN_WAIT2 7
ESTABLISHED 247
LAST_ACK 1

我们只用关心TIME_WAIT的个数,在这里可以看到,有1280多个TIME_WAIT,这样就占用了1280多个端口,端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接,就需调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。

vi /etc/sysctl.conf 增加如下内容:

net.ipv4.tcp_syncookies = 1   #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1    #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1  #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout = 30    #修改系統默认的 TIMEOUT 时间。

sysctl -p 让内核参数生效
流量小的机器一般就可以了,如果是大流量机器增加如下参数:


---阅读剩余部分---

Nginx的upstream负载均衡参数说明

nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了,才剔除:
nginx的upstream目前支持的5种方式的分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream backserver { 
server 10.10.5.3:8000 max_fails=3 fail_timeout=10s; 
server 10.10.5.4:8000 max_fails=3 fail_timeout=10s;
}



---阅读剩余部分---

Nginx限制某个IP访问

限制某个IP对站点访问,这个有很多方法,比如硬件防火墙、IPTABLES、Web服务器上,也可以在应用里面设置允许的IP,此处以Nginx为例设置,也就是经常说的白名单或黑名单:
ip段说明:
  段位从小到大排列,如127.0.0.0/24 下面才能是10.10.0.0/16
  24表示子网掩码:255.255.255.0
  16表示子网掩码:255.255.0.0
  8表示子网掩码:255.0.0.0
设置某个IP或IP段禁止访问站点:
新建deny.conf,加入以下内容:

deny 192.168.1.1;
deny 10.10.0.0/16;

在nginx的server段引用include deny.conf; reload后192.168.1.1这个IP和10.10.0.0/16这个段的IP无法访问站点;
如果要设置某个目录直接在location下面引用即可:如下

       location ~* ^/plart/.*$ {
         include deny.conf;
         proxy_pass http://static;
         include proxy.conf;
         error_log  logs/plart_error.log info;
         access_log  logs/plart_access.log  main;
       }

只允许某个IP访问,其他IP都不允许:
在deny.conf里面加入:

allow 192.168.1.2;
allow 192.168.0.0/24;
deny all;

这样写,只允许192.168.1.2和192.168.0.0段的IP访问,其他IP全部拒绝;
设置不允许访问以后的提示:

error_page 403 /error.html;
    location = /error.html {
    root  html;
    allow all;
}

这样设置以后不允许访问的IP,访问站点的时候会显示error.html文件的内容。

Nginx日志记录post请求详细参数及header内容

nginx中默认没有记录post请求的body参数,修改log_format部分,打开记录,增加$request_body部分,如下所示:

    log_format  main  '$proxy_add_x_forwarded_for  $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$request_body"'
                      '"$http_user_agent" "$http_x_forwarded_for" '
                      '$http_head $request_time '
                      '"$http_range" "$sent_http_content_range"'
                      'upstream: $upstream_addr';

reload后tail查看accesslog,已经详细记录下了post发送过来的所有参数请求,一般用于调试程序,平常不推荐记录,以免泄露敏感信息。

nginx使用子目录反向代理https域名

目标原始地址:

https://test-open.myrunners.com/oauth2/login?client_id=km1fzxal08ysh935oiurpdtv&redirect_uri=http://www.abc.com/runTeamH5/pages/punch_card/punch_card_index.html&state=run_team

现在要实现用下面这个地址也可以访问:

http://123.abc.com/run_team_web/oauth2/login?client_id=km1fzxal08ysh935oiurpdtv&redirect_uri=http://www.abc.com/runTeamH5/pages/punch_card/punch_card_index.html&state=run_team

即使用http://123.abc.com/run_team_web这个地址来反向代理https://test-open.myrunners.com地址,实现方法如下:

---阅读剩余部分---

最新

分类

归档

评论

  • 安安: 都是af
  • Liang: 嗯,有点不通顺·
  • 王庭威: “MySQL互为主从...
  • Liang: 贴下编译参数和步骤,...
  • shao3911: 您好,为什么我在编译...
  • aliang: 先看是yum安装还是...
  • aliang: 将原来的nginx安...
  • yen: 3、如果要回滚的话,...
  • yen: 刚好需要升级ngin...
  • 文雨: 一些新的method...

其它