Nginx常见异常分析及配置优化

Nginx常见异常分析及配置优化

常见异常分析

1、nginx不转发消息头header问题

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Server $host;

2、nginx 反向代理 proxy_set_header 自定义 header 头无效

String staffId = request.getHeader("staffId");
String sn = request.getHeader("sn");
String site_id = request.getHeader("site_id");
String photo_type = request.getHeader("photo_type");

前两个参数都可以获取,后两个参数通过nginx代理后始终为null。原因是nginx对自定义的header name的字符做了限制,默认underscores_in_headers为off,表示如果header name中包含下划线,则忽略掉,部署后就获取不到。

解决方案:

1)在header里不要用 “_” 下划线,可以用驼峰命名或者其他的符号(如减号-)代替。nginx默认忽略掉下划线可能有些原因。

2)在nginx里的 nginx.conf文件中配置http的部分添加:underscores_in_headers on;(默认值是off)

3、Nginx不识别中文

用windows记事本打开文件再保存会保存为UTF-8 BOM编码。这个编码在nginx中是不能被识别中文的。

我们只需要用notepad打开nginx.conf,选择编码为UTF-8无BOM编码后,查看中文显示是否正常,然后按Ctrl+s保存文件即可。

4、memc_nginx+srcache_nginx+memcached 遇到的问题

在使用 memc_nginx+srcache_nginx+memcached 时,出现了 memcached 只缓存响应头,响应主体却丢失了。具体文

章参见:《memc_nginx+srcache_nginx+memcached 构建透明的动态页面缓存》。

缓存的内容被截断了。

查了些文档是由 upstream 响应截断时不报错导致的。

解决办法:

1)打上下面的补丁

https://github.com/agentzh/ngx_openresty/blob/master/patches/nginx-1.4.2-upstream_truncation.patch

2)使用最新版的 nginx

nginx 在 1.5.3 版本修复了这个 bug。

nginx purge 更新缓存 404 错误

nginx 默认安装就会带有反向代理的功能,但想要更好的使用,还得配备 frickle.com 的 ngx_cache_purge 模块,用于清除指定 URL 的缓存。 ngx_cache_purge 在安装的 nginx 的时候一起编译进去了,缓存功能一直正常。

配置优化

worker_processes 8;

nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如:2个四核的cpu计为8)

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

为每个进程分配cpu,例如:上例中将8 个进程分配到8 个cpu,或者将一个进程分配到多个cpu。这样可以提高缓存命中率

worker_rlimit_nofile 65535;

这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。

use epoll;

使用epoll 的I/O 模型(此模型适用于linux内核版本>2.6版本),此种模型采用回调的方式进行通知,而不是轮询的方式,如果连接数高了,此种方式的性能优势就体现出来了。

worker_connections 20000;

每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections。

keepalive_timeout

keepalive_timeout参数是一个请求完成之后还要保持连接多久,不是请求时间多久,目的是保持长连接,减少创建连接过程给系统带来的性能损耗,类似于线程池,数据库连接池。但是此值也要设置的合理,如果设置太高,例如30分钟,那么,会导致连接数增大。所以,一切依据于实际场景与业务需求。

client_header_buffer_size 4k;

户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE命令 取得。该值必须设置为“系统分页大小”的整倍数。

open_file_cache max=65535 inactive=60s;

这个参数将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致(worker_rlimit_nofile ),inactive 是指经过多长时间文件没被请求后删除缓存。

open_file_cache_valid 80s;

这个是指多长时间检查一次缓存的有效信息。

open_file_cache_min_uses 1;

pen_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。

server_tokens off;

此值设置为off,并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。

access_log off;

access_log 设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快,可以依据实际业务设置开与关

reset_timedout_connection on;

告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。

send_timeout 10;

send_timeout 指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接。注意与keepalive_timeout 的区别。