nginx 优化

前言:

对nginx配置进行适当优化,提高服务相应速度跟安全

基础安全优化

1.隐藏版本信息

在配置文件中修改http段
http{
  server_tokens off;
}
修改源码文件信息

1.修改第一个文件的三处位置

cd /home/oldboy/tools/nginx-1.6.3/src/core/
[root@web02 core]# vim nginx.h 
#define NGINX_VERSION      "9.9.9"
#修改为想要的版本号
#define NGINX_VER          "xxxxxx/" NGINX_VERSION
#将nginx修改想要修改的软件名称
#define NGINX_VAR          "xxxxxx"

2.第二步修改 nginx-1.6.3/src/http/ngx_http_header_filter_module.c 的第49行

[root@web02 nginx-1.6.3]# vim src/http/ngx_http_header_filter_module.c 
static char ngx_http_server_string[] = "Server: xxxxxx"    CRLF;
#修改本行,此处的文件是我们Curl 出来显示的名称

3.第三步修改 nginx-1.6.3/src/http/ngx_http_special_response.c ,对外页面报错时,它会控制是否展示敏感信息。修改28~30行

[root@web02 nginx-1.6.3]# vim src/http/ngx_http_special_response.c 

static u_char ngx_http_error_full_tail[] =
"<hr><center>" xxxxxx "</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;

static u_char ngx_http_error_build_tail[] =
"<hr><center>" NGINX_VER_BUILD "</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;

static u_char ngx_http_error_tail[] =
"<hr><center>xxxxxx</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;

然后重新编译nginx

2.更改Nginx服务的默认用户

更改配置文件中的 #user 为自建用户

注释或添加在nginx.conf文件开头,使用自建用户

user nginx nginx;

编译时也可指定默认用户和用户组,可以无需在配置文件中再次指定

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module  --user=nginx

3.在Nginx中禁用不需要的HTTP方法

对于一般的网站和应用程序,你应该只允许GET,POST,和HEAD并禁用所有其他人。
为此,将以下行代码放在服务器块中。 444 HTTP响应指空响应,并经常在Nginx的用来愚弄恶意软件攻击:

if ($request_method !~ ^(GET|HEAD|POST)$) {
return 444;
}
#该条指令可配置在http,location段

4.定义详细日志

简介

Nginx日志主要分为两种:访问日志和错误日志。日志开关在Nginx配置文件(/etc/nginx/nginx.conf)中设置,两种日志都可以选择性关闭,默认都是打开的。

访问日志

访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义。通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息。Nginx中访问日志相关指令主要有两条:

log_format

log_format用来设置日志格式,也就是日志文件中每条日志的格式,具体如下:

log_format name(格式名称) type(格式样式)

举例说明如下:

log_format main '$server_name $remote_addr - $remote_user [$time_local] "$request" ''$status $uptream_status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" ''$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time';

每个样式的含义如下:

$server_name:虚拟主机名称。
$remote_addr:远程客户端的IP地址。
-:空白,用一个“-”占位符替代,历史原因导致还存在。
$remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白。
[$time_local]:访问的时间与时区,比如18/Jul/2012:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。
$request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
$status:记录请求返回的http状态码,比如成功是200。
$uptream_status:upstream状态,比如成功是200.
$upstream_addr:后端服务器的IP地址
$upstream_status:后端服务器返回的HTTP状态码

在server{}中添加

add_header backendIP $upstream_addr;
add_header backendCode $upstream_status;

$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的响应时间。

访问日志中一个典型的记录如下:

192.168.1.102 - scq2099yt [18/Mar/2013:23:30:42 +0800] "GET /stats/awstats.pl?config=scq2099yt HTTP/1.1" 200 899 "http://192.168.1.1/pv/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows XXX; Maxthon)"

需要注意的是:log_format配置必须放在http内,否则会出现如下警告信息:

nginx: [warn] the "log_format" directive may be used only on "http" level in /etc/nginx/nginx.conf:97
access_log

access_log指令用来指定日志文件的存放路径(包含日志文件名)、格式和缓存大小,具体如下:

access_log path(存放路径) [format(自定义日志格式名称) [buffer=size | off]]

举例说明如下:

access_log logs/access.log main;

如果想关闭日志,可以如下:

access_log off;

能够使用access_log指令的字段包括:http、server、location。需要注意的是:Nginx进程设置的用户和组必须对日志路径有创建文件的权限,否则,会报错。Nginx支持为每个location指定强大的日志记录。同样的连接可以在同一时间输出到不止一个的日志中。

错误日志

错误日志主要记录客户端访问Nginx出错时的日志,格式不支持自定义。通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。错误日志由指令error_log来指定,具体格式如下:

error_log path(存放路径) level(日志等级)

path含义同access_log,level表示日志等级,具体如下:

[ debug | info | notice | warn | error | crit ]

从左至右,日志详细程度逐级递减,即debug最详细,crit最少。

举例说明如下:

error_log logs/error.log info;

需要注意的是:error_log off并不能关闭错误日志,而是会将错误日志记录到一个文件名为off的文件中。

正确的关闭错误日志记录功能的方法如下:

error_log /dev/null;

上面表示将存储日志的路径设置为“垃圾桶”。

5.自定错误信息

修改nginx-1.16.1/src/http/ngx_http_special_response.c,自己定制错误信息

## messages with just a carriage return.
static char ngx_http_error_400_page[] = CRLF;
static char ngx_http_error_404_page[] = CRLF;
static char ngx_http_error_413_page[] = CRLF;
static char ngx_http_error_502_page[] = CRLF;
static char ngx_http_error_504_page[] = CRLF;

常见错误:

400 bad request
404 NOT FOUND
413 Request Entity Too Large
502 Bad Gateway
504 Gateway Time-out

6.配置访问密码

如果我们在 nginx 下搭建了一些站点,但是由于站点内容或者流量的关系,我们并不想让所有人都能正常访问,那么我们可以设置访问认证。只有让用户输入正确的用户名和密码才能正常访问。效果如下:

在 nginx 下,提供了 ngx_http_auth_basic_module 模块实现让用户只有输入正确的用户名密码才允许访问web内容。默认情况下,nginx 已经安装了该模块。所以整体的一个过程就是先用第三方工具设置用户名、密码(其中密码已经加过密),然后保存到文件中,接着在 nginx 配置文件中根据之前事先保存的文件开启访问验证。

生成密码可以使用 htpasswd,或者使用 openssl 。下面以 htpasswd 为例。

安装htpasswd工具

yum -y install httpd-tools

生成用户的的密码文件

htpasswd -c [passwfile] [username]

img

注意:/usr/local/nginx/passwd 是生成密码后的文件保存路径 (passwdfile),codeauth是用户名(username)

查看最后生成的密码文件的内容:(codeauth分号后的内容就是加密过的密码)

img

修改配置文件

server {
   listen 80;
   server_name  localhost;
   .......
 
   #新增下面两行
   auth_basic "Please input password"; #这里是验证时的提示信息 
   auth_basic_user_file /usr/local/nginx/passwd;
 
   location /{
   .......
}

管理用户

htpasswd命令选项参数说明

-c 创建一个加密文件
-n 不更新加密文件,只将htpasswd命令加密后的用户名密码显示在屏幕上
-m 默认htpassswd命令采用MD5算法对密码进行加密
-d htpassswd命令采用CRYPT算法对密码进行加密
-p htpassswd命令不对密码进行进行加密,即明文密码
-s htpassswd命令采用SHA算法对密码进行加密
-b htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码
-D 删除指定的用户

新增用户:htpasswd -b [passwdfile] [username] [passwd]

删除用户:htpasswd -D [passwdfile] [username]

7.Nginx关闭默认站点/空主机头

默认情况下,只要将域名解析到vps的IP上,访问该域名就会访问到lnmp默认虚拟主机的默认页面。为了防止别人恶意将域名解析到自己的IP上,nginx的默认配置中的虚拟主机允许用户通过IP访问,或者通过未设置的域名访问(比如有人恶意把他自己的域名指向了你的ip);可以通过以下方法进行,修改/usr/local/nginx/conf/nginx.conf ,将里面的默认的虚拟主机server{}段修改为如下即可:

server {
        listen 80 default;	#服务器有多个ip时,屏蔽所有ip可以使用 *:80
        server_name _;   ##对80端口的vhost配置 标示空主机头

        location / {
                root html;
                return 404;
        }
        #rewrite ^(.*) //www.xxx.com permanent;	#重定向到指定网址
        #return 404;	#直接返回状态码,建议使用该方式
        
}
正常vhost
server {
        listen  80;
        server_name www.test.com;

        location / {
                root html;
                index index.html index.htm;
        }
}
    server {
        listen       80;
        server_name  www.test1.com;
        
        location / {
            root   html;
            index  index.html index.htm;
        }
        location = /50x.html {
            root   html;
        }
}   

以上配置在通过 www.test.com 或者 www.test1.com 访问该nginx时正常转发请求,当使用其他主机例如,www.test2.com 访问时进到第一层,返回404,或自定义的转发网址

8.防盗链配置

概述:

对于图片来说,A网站,如果想使用B网站的图片,可以直接写上B网站图片的链接地址,或者将B网站的图片通过右键另存为的方式下载到本地,然后在页面上使用。如果B网站不想A网站这么干了,那么B网站可以采取防盗链的措施来干这个工作,结果就是,A网站想请求所需要的资源,通过url的方式,获取的可能不是原来的图片了,出现404或者别的图片替代了。如果通过浏览器直接打开图片url,那么仍然有可能显示404,这就是防盗链。

配置:
一般的防盗链:
location ~* \.(gif|jpg|png|swf|flv)$ { 
  valid_referers none blocked www.jzxue.com jzxue.com ; 
  if ($invalid_referer) { 
    rewrite ^/ http://www.jzxue.com/retrun.html; 
    #return 403; 
  } 
} 

1.表示对gif、jpg、png、swf、flv后缀的文件实行防盗链

2.表示对www.ingnix.com这2个来路进行判断

valid_referers 指令详解

该指令后面可以接 none blocked serevr_names string或者是正则表达式

none 代表没有referer

blocked 代表有referer但是被防火墙或者是代理给去除了

server_names	指定正常来路

string或者正在表达式 用来匹配referer 

nginx会通过查看referer字段和valid_referers后面的referer列表进行匹配,如果匹配到了就invalid_referer字段值为0 否则设置该值为1

3.if{}里面内容的意思是,如果来路不是指定来思是,如果来路不是指定来路就跳转到 http://www.jzxue.com/retrun.html 页面,当然直接返回403也是可以的。

第三方模块实现

9.限流模块的使用

配置文件优化:

1.优化Nginx服务的worker进程个数

该参数调整的是Nginx服务的Worker进程数,Nginx有Master进程和Worker进程之分,Master为管理进程,worker是工作进程;一般设置为与服务器内核数量一样;也可以将其设置为 auto。 这样nginx会自动根据核心数为生成对应数量的worker进程。参数位置为main

vim $NGINX_HOME/conf/nginx.conf
######
worker_processes  auto;	

2.优化绑定不同的Nginx进程到不同CPU上

默认情况Nginx的多个进程有可能跑在某一个或某一核的CPU上,导致Nginx进程使用硬件的资源不均。可以分配不同的Nginx进程给不同的CPU处理,达到充分有效利用硬件的多CPU多核资源的目的。

worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;

worker_cpu_affinity 就是配置nginx进程CPU亲和力的参数,即把不同的进程分给不同的CPU处理。这里0001 0010 0100 1000是掩码,分别代表1、2、3、4核cpu核心,由于worker_processes进程数为4,因此上述配置会把每个进程分配一核CPU处理,默认情况下进程不会绑定任何CPU,参数位置为main

3.Nginx事件处理模型优化

Nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,在Linux下,Nginx使用epoll的I/O多路复用模型,在Freebsd中使用kqueue的I/O多路复用模型,在Solaris中使用/dev/poll方式的I/O多路复用模型,在Windows使用的是icop,等待。

events {
#events指令是设定Nginx的工作模式及连接数上限
use epoll
}

根据Nginx的官方文档建议,也可以不指定事件处理模型,Nginx会自动选择最佳的事件处理模型服务。

4.调整Nginx单个进程允许的客户端最大连接数

events {
    worker_connections  20480;
}

worker_connections的值要根据具体服务器性能和程序的内存使用量来指定(一个进程启动使用的内存根据程序确定);worker_connections 也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024.最大客户端连接数由worker_processes和worker_connections决定:并发=worker_process * worker_connections

5.开启高效的文件传输模式

sendfile参数用于开启文件的高效传输模式,同时将tcp_nopushtcp_nodelay两个指定设为on,可防止网络及磁盘I/O阻塞,提升Nginx工作效率。

sendfile on;

http,server,location,if in location #可放置的标签段

激活或者禁用sendfile()功能。sendfile()是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核之中,被称为“零拷贝”,sendfile()和read和write函数要高效很多,因为read和wrtie函数要把数据拷贝到应用层再进行操作。相关控制参数还有sendfile_max_chunk。

tcp_nopush on;

http, server, location #可以放置标签段

参数作用:激活或禁用Linux上的TCP_CORK socker选项,此选项仅仅开启sendfile时才生效,激活这个tcp_nopush参数可以运行把http response header和文件的开始放在一个文件里发布,减少网络报文段的数量。

tcp_nodelay on;

http, server, location #可以放置标签段

参数作用:默认情况下数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高I/O性能,但是,在每次只发送很少字节的业务场景,使用tcp_nodelay功能,等待时间会比较长。参数生产条件:激活或禁用tcp_nodelay选项,当一个连接进入到keep-alive状态时生效

client_max_body_size 100m;	#限制请求体的大小,若超过所设定的大小,返回413错误。
client_header_timeout 1m; 	#读取请求头的超时时间,若超过所设定的大小,返回408错误。
client_body_timeout 1m;	#读取请求实体的超时时间,若超过所设定的大小,返回413错误。

**http, server, ** #可以放置标签段

6.配置虚拟主机文件目录

include conf/yy/*.conf

将vhost配置信息分开放置便于阅读跟排错

7.gzip 压缩优化

开启此项需要额外添加模块;

--with-http_gzip_static_module

需要进行gzip压缩的Content-Type的Header的类型。建议js、text、css、xml、json都要进行压缩;图片就没必要了,gif、jpge文件已经压缩得很好了,就算再压,效果也不好,而且还耗费cpu。

gzip on;               #开启gzip压缩功能
gzip_min_length 1k;    #设置允许压缩的页面最小字节数,及超过1k就启用压缩
gzip_buffers 4 16k;    #设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存
gzip_http_version 1.1; #压缩版本
gzip_comp_level 2;     #设置压缩比率,最小为1,处理速度快,传输速度慢;9为最大压缩比,处理速度慢,传输速度快
gzip types text/css text/xml application/javascript; #制定压缩文件的类型
gzip vary on;          #选择支持vary header;改选项可以让前端的缓存服务器缓存经过gzip压缩的页面

http, #可以放置的标签段

8.超时优化

长连接会话保持超时
keeplived_timeout 60

参数作用:keep-alive可以使客户端到服务端已经建立的连接一直工作不退出,当服务器有持续请求时,keep-alive会使用正在建立的连接提供服务,从而避免服务器重新建立新连接处理请

http, server, location #可以放置的标签段

读取客户端请求头数据的超时
client_header_timeout 15s;

http, server, location #可以放置的标签段

参数作用:设置读取客户端请求头数据的超时时间。如果超过这个时间,客户端还没有发送完整的header数据,服务端将数据返回“Request time out (408)”错误。

设置读取客户端请求主体的超时时间
client_body_timeout 15s;

http, server, location #可以放置的标签段

参数作用:设置读取客户端请求主体的超时时间。这个超时仅仅为两次成功的读取操作之间的一个超时,非请求整个主体数据的超时时间,如果在这个超时时间内,客户端没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60.

用户指定响应客户端的超时时间
send_timeout 25;

http, server, location #可以放置的标签段

参数作用:设置服务器端传送http响应信息到客户端的超时时间,这个超时时间仅仅为两次成功握手后的一个超时,非请求整个响应数据的超时时间,如在这个超时时间内,客户端没有收到任何数据,连接将被关闭。

9.nginx与php之间FastCGI 相关参数调优

具体参数详细使用方法可参照其他博客或官方文档

http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

#nginx与php之间FastCGI 相关参数调优
#时间超时设定
fastcgi_connect_timeout 240;
fastcgi_send_timeout 240;
fastcgi_read_timeout 240;
#缓冲/缓存设置
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path /usr/local/nginx/ngx_fcgi_tmp;
fastcgi_cache_path /usr/local/nginx/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
#server段
	#location段
    #php解析
	location ~ .*\.(php|php5)?$ {
	root html/www;
	fastcgi_pass 127.0.0.1:9000;
	fastcgi_index index.php;
	include fastcgi.conf;
 
#FastCGI 相关参数调优
#fastcgi_cache ngx_fcgi_cache;
	fastcgi_cache_valid 200 302 1h;
	fastcgi_cache_valid 301 1d;
	fastcgi_cache_valid any 1m;
	fastcgi_cache_min_uses 1;
	fastcgi_cache_use_stale error timeout invalid_header http_500;
	fastcgi_cache_key http://$host$request_uri;

10.反向代理配置优化

nginx大多用于前端代理,负责处理请求然后反向或正向代理到后端服务器。这里介绍基础的代理模块使用跟一些优化配置

Nginx 反向代理模块:

ngx_http_proxy_module、ngx_http_upstream_module

ngx_http_upstream_module模块用于定义可以由proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pass,memcached_pass和grpc_pass指令引用的服务器组。

Syntax: 	upstream name { ... }
Default: 	—
Context: 	http

示例:定义一组服务器。 服务器可以在不同的端口上侦听。 另外,可以混合使用侦听TCP和UNIX域套接字的服务器。

upstream backend {
	ip_hash
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;
    server backup1.example.com  backup;
}

参数解释:

weight: 权重
max_fails=number: 设置在fail_timeout参数设置的持续时间内应发生的与服务器通信的失败尝试次数
fail_timeout=30s: 在指定次数的不成功尝试与服务器通信的时间范围内,应考虑服务器不可用
backup: 将服务器标记为备份服务器。 当主服务器不可用时,将传递请求
ip_hash: 指定组应使用负载平衡方法,其中根据客户端IP地址在服务器之间分配请求。 客户端IPv4地址的前三个八位位组或整个IPv6地址用作哈希密钥。 该方法确保来自同一客户端的请求将始终传递到同一服务器,除非该服务器不可用。 在后一种情况下,客户端请求将传递到另一台服务器。 最有可能的是,它也将永远是同一台服务器。

其他高级参数用法参照官方文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.html

ngx_http_proxy_module模块允许将请求传递到另一台服务器。

Syntax: 	proxy_xxxx
Default: 	—
Context: 	http,server,location

示例:

location / {
    proxy_pass       http://localhost:8000;
    proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
    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_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;
}

参数解释:

proxy_next_upstream:故障转移策略,当后端服务器返回如下错误时,自动负载到后端其余机器

proxy_redirect off:设置应在代理服务器响应的“位置”和“刷新”标头字段中更改的文本。 假设代理服务器返回了标头字段Location: http://localhost:8000/two/some/uri/

例如:

proxy_redirect http://localhost:8000/two/ http://frontend/one/;

将将此字符串重写为“位置:http//frontend/one/其他/uri/

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

这几个参数简单解释为将传递给后端的nginx header 头部信息替换为真实客户端;

proxy_connect_timeout:定义与代理服务器建立连接的超时。 请注意,此超时通常不能超过75秒。

proxy_send_timeout:设置将请求传输到代理服务器的超时。 超时仅在两个连续的写操作之间设置,而不用于整个请求的传输。 如果代理服务器在这段时间内未收到任何信息,则连接将关闭。

proxy_read_timeout:定义用于从代理服务器读取响应的超时。 超时仅在两个连续的读取操作之间设置,而不用于整个响应的传输。 如果代理服务器在此时间内未传输任何内容,则连接将关闭。

proxy_buffer_size:设置用于读取从代理服务器接收到的响应的第一部分的缓冲区的大小。 这部分通常包含一个小的响应头。 默认情况下,缓冲区大小等于一个内存页。 根据平台的不同,它可以是4K或8K。 但是,它可以做得更小。

proxy_buffers:为单个连接设置用于从代理服务器读取响应的缓冲区的数量和大小。 默认情况下,缓冲区大小等于一个内存页。 根据平台的不同,它可以是4K或8K。

proxy_busy_buffers_size:启用来自代理服务器的响应缓冲后,将限制在尚未完全读取响应时正忙于向客户端发送响应的缓冲区的总大小。 同时,其余的缓冲区可用于读取响应,并在需要时将响应的一部分缓冲到临时文件中。 默认情况下,大小受proxy_buffer_size和proxy_buffers指令设置的两个缓冲区的大小限制。(用于设置系统很忙时可以使用的 proxy_buffers 大小,官方推荐大小为 proxu_buffers 的两倍)

proxy_temp_file_write_size:当启用从代理服务器到临时文件的响应的缓冲时,一次限制写入临时文件的数据大小。 默认情况下,大小受proxy_buffer_size和proxy_buffers指令设置的两个缓冲区的限制。 临时文件的最大大小由proxy_max_temp_file_size指令设置。

后端检测第三方模块:

(第三方模块需要额外下载及编译)项目地址:https://github.com/yaoweibin/nginx_upstream_check_module

nginx_http_upstream_check_module

​ 淘宝技术团队开发的nginx模快nginx_upstream_check_module来检测后服务的健康状态,如果后端服务器不可用,则所以的请求不转发到这台服务器。

​ nginx自带是没有针对负载均衡后端节点的健康检查的,但是可以通过默认自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块中的相关指令来完成当后端节点出现故障时,自动切换到健康节点来提供访问,但是还会有请求转发到后端的这台后端节点上面去

nginx-1.16.1

下载补丁包
对现有nginx打补丁

解压下载的模块包到/usr/local 下

yum -y install patch	#安装打补丁工具
cd /usr/local/nginx-1.14.0	#进入下载的nginx的源码包里
patch -p1 < ../nginx_upstream_check_module-master/check_1.14.0+.patch  #因为我们nginx的版本是1.14补丁就选择1.14的,p1代表在nginx目录,p0是不在nginx目录

打补丁完成

重新编译安装
/usr/local/nginx/sbin/nginx -V	#查询现有的nginx编译的模块

cd /usr/local/nginx-1.14.2/

./configure --prefix=/usr/local/nginx  --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module **--add-module=/usr/local/nginx_upstream_check_module-master**   --user=nginx

make && make install	#(根据实际情况,如果不会覆盖掉原来的配置可以使用,如果回覆盖则只需执行make,然后将当前目录下的二进制文件替换掉原来的nginx即可)
配置模块

配置负载段:

upstream i4t.com {
       server 10.4.81.41:900;
       server 10.4.81.42:900;
       check interval=3000 rise=2 fall=5 timeout=1000 type=tcp;
}

interval检测间隔时间,单位为毫秒rsie请求2次正常的话,标记此后端的状态为uptype 类型为tcpfall表示请求5次都失败的情况下,标记此后端的状态为downtimeout为超时时间,单位为毫秒。

对健康状态配置查询路径

location /status2 {     #配置upstream_check_module模块健康检查
           check_status;
           access_log off;
}

11.error_page使用

1.语法:
error_page code [ code... ] [ = | =answer-code ] uri | @named_location

默认值:no

使用字段:http, server, location, location 中的if字段

2. 实例

nginx指令error_page的作用是当发生错误的时候能够显示一个预定义的uri,比如:

error_page 502 503 /50x.html;
location = /50x.html {  
root /usr/share/nginx/html;
}

这样实际上产生了一个内部跳转(internal redirect),当访问出现502、503的时候就能返回50x.html中的内容,这里需要注意是否可以找到50x.html页面,所以加了个location保证找到你自定义的50x页面。同时我们也可以自己定义这种情况下的返回状态吗,比如:

error_page 502 503 =200 /50x.html;
location = /50x.html {  
root /usr/share/nginx/html;
}

这样用户访问产生502 、503的时候给用户的返回状态是200,内容是50x.html

当error_page后面跟的不是一个静态的内容的话,比如是由proxyed server或者FastCGI/uwsgi/SCGI server处理的话,server返回的状态(200, 302, 401 或者 404)也能返回给用户。

error_page 404 = /404.php;
location ~ \.php$ {  
fastcgi_pass 127.0.0.1:9000;  
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
include fastcgi_params;
}  

也可以设置一个named location,然后在里边做对应的处理。

error_page 500 502 503 504 @jump_to_error;
location @jump_to_error {    
proxy_pass http://backend;
}

同时也能够通过使客户端进行302、301等重定向的方式处理错误页面,默认状态码为302。

error_page 403   http://example.com/forbidden.html;
error_page 404 =301 http://example.com/notfound.html;

同时error_page在一次请求中只能响应一次,对应的nginx有另外一个配置可以控制这个选项:

recursive_error_pages 默认为false,作用是控制error_page能否在一次请求中触发多次。

3. Nginx 自定义404错误页面配置中有无等号的区别

error_page 404 /404.html 可显示自定义404页面内容,正常返回404状态码。

error_page 404 = /404.html 可显示自定义404页面内容,但返回200状态码。

error_page 404 /404.php 如果是动态404错误页面,包含 header 代码(例如301跳转),将无法正常执行。正常返回404代码。

error_page 404 = /404.php 如果是动态404错误页面,包含 header 代码(例如301跳转),加等号配置可以正常执行,返回php中定义的状态码。但如果php中定义返回404状态码,404状态码可以正常返回,但无法显示自定义页面内容(出现系统默认404页面),这种情况可以考虑用410代码替代( header("HTTP/1.1 410 Gone"); 正常返回410状态码,且可正常显示自定义内容)。

4.需要获取反向代理里的后端信息配置该参数,否则会无法生效
proxy_intercept_errors on|off;	#确定代码大于或等于300的代理响应应该传递给客户端还是被拦截并重定向到nginx以使用error_page指令进行处理。

tips:未完

完整的nginx.conf配置文件信息(仅供参考)

user nginx;
work_processes auto;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

events {
    worker_connections  20480;
}

upstream server {
    server 192.168.1.2:8080 max_fails=3 fail_timeout=30s weight=10;;
    server 192.168.1.1:8080 max_fails=3 fail_timeout=30s weight=5;;
    server backup1.example.com  backup;
    check interval=3000 rise=2 fall=3 timeout=1000 type=tcp;
}

http {
	include mime.types;
	include	/usr/local/nginx/conf/server/*.conf;
	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;
        server_tokens off;
        tcp_nodelay on;
        client_max_body_size 100m;
        client_header_timeout 1m; 
	client_body_timeout 1m;
	
	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;
	
   	auth_basic "Please input password";
   	auth_basic_user_file /usr/local/nginx/passwd;
   	
   	gzip on;
	gzip_min_length 1k; 
	gzip_buffers 4 16k;
	gzip_http_version 1.1;
	gzip_comp_level 2;
	gzip types text/css text/xml application/javascript;
	gzip vary on; 
	
	server {
		listen	80;
		server_name _;
		return	404;
	}
	server {
		listen	443;
		server_name _;
                ssl_certificate ssl.pem;
                ssl_certificate_key key.key;
                ssl_session_timeout 5m;
                ssl_protocols TLSv1.1 TLSv1.2;
                ssl_ciphers HIGH:!aNULL:!MD5:!DES:!3DES:!RC4;
                ssl_prefer_server_ciphers on;
		return	404;
	}
	server {
		listen	80;
		server_name test1.xxx.com;
		rewrite ^(.*) https://$server_name$1 permanent;
	}
	
	server {
		listen	443 ssl;
		server_name test1.xxx.com;
		access_log  logs/test1_xxx_com.log  main;

                ssl_certificate ssl.pem;
                ssl_certificate_key key.key;
                ssl_session_timeout 5m;
                ssl_protocols TLSv1.1 TLSv1.2;
                ssl_ciphers HIGH:!aNULL:!MD5:!DES:!3DES:!RC4;
                ssl_prefer_server_ciphers on;
		
		location / {
		proxy_pass	http://server;
		proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
    	        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_intercept_errors on;
		}
		
		location /status {
		check_status;
                access_log off;
                allow 192.168.0.0/24;
    	        allow 127.0.0.1;
    	        deny all;
		}
        
                location ~* \.(gif|jpg|png|swf|flv)$ { 
  		valid_referers none blocked test1.xxx.com ; 
  		if ($invalid_referer) { 
    	        return 403; 
 		} 
		} 
		
		error_page 502 503 /50x.html;
		location = /50x.html {  
		root /usr/local/nginx/html;
		}
	}
	
	
}
posted @ 2021-03-03 16:17  (◓3◒)  阅读(268)  评论(0)    收藏  举报