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 的区别。