[NGINX] – 配置文件优化 – NGINX.CONF

摘要

本文主要针对公司的Nginx负载均衡配置进行解释,配置文件在最下方…

[NGINX] - 配置文件优化 - NGINX.CONF

Nginx


本文主要针对公司的Nginx负载均衡配置进行解释,配置文件在最下方。因为公司没有使用PHP,所以NGINX里面并没有太多facgi模块相关优化
1.gif-10kB

NGINX.CONF

user

  1. 语法: user user[group];
  2. 标签: main
  3. 定义user和工作group 进程使用的凭证。如果group省略,user则使用名称等于的组。

worker_processes

  1. 句法: worker_processes number | auto;
  2. 默认: worker_processes 1;
  3. 标签: main
  4. ---------------------
  5. 例如,
  6. worker_processes 4;
  7. worker_cpu_affinity 0001 0010 0100 1000;
  8. 将工作进程绑定到CPU集合。每个CPU集合由允许的CPU的位掩码表示。应该为每个工作进程定义一个单独的集合。默认情况下,工作进程不绑定到任何特定的CPU

绑定每个工作进程到一个单独的CPU

  1. worker_processes 2;
  2. worker_cpu_affinity 0101 1010;

error_log

  1. 语法:error_log file [level];
  2. 默认:error_log logs / error.log错误;
  3. 可用标签:mainhttpmailstreamserverlocation
  4. 配置日志记录。可以在同一级别上指定多个日志(1.5.2)。如果在main配置级别上,未明确定义将日志写入文件,将使用默认文件。
  5. 第一个参数定义file将存储日志。特殊值stderr选择标准错误文件。可以通过指定“ ”前缀来配置日志记录到syslogsyslog:。 可以通过指定“ ”前缀和缓冲区来配置对循环内存缓冲区的日志记录 ,并且通常用于调试(1.7.11)。 memory:size
  6. 第二个参数决定了level日志记录,并且可以是下列之一: debuginfonotice warnerrorcrit alert,或emerg。以上的日志级别按严重性递增的顺序列出。设置特定日志级别将导致记录指定日志级别和更严重日志级别的所有消息。例如,默认级别error会导致errorcrit alert,和emerg被记录的消息。如果省略此参数,则error使用。

worker_connections

  1. 句法: worker_connections number;
  2. 默认: worker_connections 512;
  3. 标签: events
  4. 设置工作进程可以打开的最大并发连接数
  5. 应该记住,这个数字包括所有连接(例如,与代理服务器的连接等等),而不仅仅是与客户端的连接。另一个考虑是同时连接的实际数量不能超过打开文件的最大数量的当前限制,可以通过worker_rlimit_nofile更改

include

  1. 句法: include file | mask;
  2. 标签: any
  3. 包括另一个file,或匹配指定的文件mask,到配置。包含的文件应包含语法正确的指令和块。
  4. 用法实例:
  5. include mime.types;
  6. include vhosts/*.conf;

default_type

  1. 语法:default_type application/octet-stream;
  2. 标签:http
  3. default_type:属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置php环境时,nginx是不予解析的。此时,用浏览器访问php文件就会出现下载窗口。

log_format

  1. 常用语法:
  2. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  3. '$status $body_bytes_sent "$http_referer" '
  4. '"$http_user_agent" "$http_x_forwarded_for"';
  5. 标签:http
  6. 解释: nginxHttpLog模块指令,用于指定Nginx日志输出格式,acc为此日志输出格式的名称,可以在access_log指令中引用。
  7. HTTP协议中,有一个表头字段叫referer,使用URL格式来表示哪里的链接用了当前网页的资源。通过referer可以检测目标访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一旦检测出来不是本站,马上进行阻止或返回指定的页面。
  8.   HTTP Refererheader的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理,ApacheNginxLighttpd三者都支持根据http referer实现防盗链referer是目前网站图片、附件、html最常用的盗链手段。

access_log

  1. 语法:
  2. access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
  3. access_log off;
  4. 默认: access_log logs/access.log combined;
  5. 标签: http, server, location, if in location, limit_except
  6. ngx_http_log_module模块中指定的格式写入请求日志。
  7. 缓冲区大小不能超过对磁盘文件的原子写入大小。对于FreeBSD,这个大小是无限的。
  8. 启用缓冲时,数据将写入文件:
  9. 如果下一个日志行不适合缓冲区;
  10. 如果缓冲的数据比flush 参数(1.3.10,1.2.7)指定的旧;
  11. 当工作进程重新打开日志文件或正在关闭时。
  12. access_log /path/to/log.gz combined gzip flush = 5m;
  13. 要使gzip压缩工作,nginx必须使用zlib库构建。
  14. 示例配置
  15. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  16. '$status $body_bytes_sent "$http_referer" '
  17. '"$http_user_agent" "$http_x_forwarded_for"';
  18. access_log logs/access.log main;

sendfile

  1. 语法:sendfile on|off
  2. 默认:sendfile off
  3. 标签:httpserverlocationif in location
  4. sendfile参数用于开启文件的高效传输模式,同时将tcp_nopushtcp_nodelay两个指定设为on,可防止网络及磁盘I/O阻塞,提升Nginx工作效率。
  5. 参数作用:激活或者禁用sendfile()功能。sendfile()是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核之中,被称为“零拷贝”,sendfile()和readwrite函数要高效很多,因为readwrtie函数要把数据拷贝到应用层再进行操作。相关控制参数还有sendfile_max_chunk

tcp_nopush

  1. 语法: tcp_nopush on | off;
  2. 默认: tcp_nopush off;
  3. 标签:http, server, location
  4. 参数作用:激活或禁用Linux上的TCP_CORK socker选项,此选项仅仅开启sendfile时才生效,激活这个tcp_nopush参数可以运行把http response header和文件的开始放在一个文件里发布,减少网络报文段的数量。

tcp_nodelay

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

keepalive_timeout

  1. 语法:keepalive_timeout timeout [header_timeout];
  2. 默认:keepalive_timeout 75s;
  3. 标签:http, server, location
  4. 参数作用:nginx长链接 keep-alive可以使客户端到服务端已经建立的连接一直工作不退出,当服务器有持续请求时,keep-alive会使用正在建立的连接提供服务,从而避免服务器重新建立新连接处理请求。

keepalive_requests

  1. keepalive_requests 8192; --每个连接最大请求数
  2. 标签:http, server, location

client_max_body_size

  1. 语法:client_max_body_size size;
  2. 默认:client_max_body_size 1m;
  3. 标签:http, server, location
  4. 参数作用:设置最大的允许客户端请求主体大小,在请求头域有“Content-Length”,如果超过了此配置值,客户端会收到413错误,意思是请求的条目过大,有可能浏览器不能正确的显示这个错误,设置为0表示禁止检查客户端请求主体大小,此参数对服务端的安全有一定的作用。

gzip

  1. 标签:httpserverlocation
  2. gzip on; #开启gzip压缩功能
  3. gzip_buffers 4 16k;
  4. #压缩缓冲区大小,表示申请4个单位为16K的内存作为压缩结果流缓存,默认是申请与原始是数据大小相同的内存空间来存储gzip压缩结果;
  5. gzip_http_version 1.1;
  6. #压缩版本(默认1.1 前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP压缩,使用默认即可。
  7. gzip_comp_level 9;
  8. #压缩比率,用来指定GZIP压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也消耗CPU资源
  9. gzip_types text/plain application/x-javascript text/css application/xml;
  10. #用来指定压缩的类型,“text/html”类型总是会被压缩,这个就是HTTP原理部分讲的媒体类型。
  11. gzip_vary on;
  12. #vary hear支持,该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用缓存经过Nginx压缩的数据
  13. gzip_proxied
  14. 句法:gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
  15. 默认:gzip_proxied off;
  16. 根据请求和响应启用或禁用代理请求的响应的gzipping。请求被代理的事实由“Via”请求头字段的存在来确定。该伪指令接受多个参数:
  17. off 禁用所有代理请求的压缩,忽略其他参数;
  18. expired 如果响应头包括具有禁用缓存的值的“Expires”字段,则启用压缩;
  19. no-cache 如果响应头包括具有“”参数的“Cache-Control”字段,则no-cache启用压缩;
  20. no-store 如果响应头包括具有“”参数的“Cache-Control”字段,则no-store启用压缩;
  21. private 如果响应头包括具有“”参数的“Cache-Control”字段,则private启用压缩;
  22. no_last_modified 如果响应报头不包括“Last-Modified”字段,则启用压缩;
  23. no_etag 如果响应报头不包括“ETag”字段,则启用压缩;
  24. auth 如果请求头包括“授权”字段则启用压缩;
  25. any 启用对所有代理请求的压缩。

proxy

  1. proxy_connect_timeout
  2. 句法:proxy_connect_timeout time;
  3. 默认:proxy_connect_timeout 60s;
  4. 标签:httpserverlocation
  5. 作用:定义与代理服务器建立连接的超时。应该注意,该超时通常不能超过75秒。
  6. proxy_read_timeout
  7. 句法:proxy_read_timeout time;
  8. 默认:proxy_read_timeout 60s;
  9. 作用:定义从代理服务器读取响应的超时。超时仅在两次连续读取操作之间设置,而不是用于传输整个响应。如果代理服务器在此时间内未发送任何内容,则连接将关闭。
  10. proxy_send_timeout
  11. 句法:proxy_send_timeout time;
  12. 默认:proxy_send_timeout 60s;
  13. 作用:设置将请求传输到代理服务器的超时。超时仅在两个连续的写操作之间设置,而不是用于传输整个请求。如果代理服务器在此时间内未收到任何内容,则连接将关闭。
  14. proxy_buffer_size
  15. 句法:proxy_buffer_size size;
  16. 默认:proxy_buffer_size 4k | 8k;
  17. 作用:设置size用于读取从代理服务器接收的响应的第一部分的缓冲区。这部分通常包含一个小的响应头。默认情况下,缓冲区大小等于一个内存页。这是4K8K,取决于一个平台
  18. proxy_buffers
  19. 句法:proxy_buffers number size;
  20. 默认:proxy_buffers 8 4k | 8k;
  21. 作用:设置用于从代理服务器读取单个连接的响应的缓冲区numbersize缓冲区。默认情况下,缓冲区大小等于一个内存页。这是4K8K,取决于一个平台。
  22. proxy_buffering
  23. 句法:proxy_buffering on | off;
  24. 默认:proxy_buffering on;
  25. 启用或禁用来自代理服务器的响应缓冲。
  26. 当启用缓冲时,nginx会尽快从代理服务器接收响应,将其保存到由proxy_buffer_sizeproxy_buffers指令设置的缓冲区中 。如果整个响应不适合内存,它的一部分可以保存到磁盘上的临时文件。写入临时文件是由控制 proxy_max_temp_file_size proxy_temp_file_write_size指令。
  27. 当禁用缓冲时,响应在接收到时立即同步传递到客户端。nginx不会尝试从代理服务器读取整个响应。该nginx的可以同时接收来自服务器的数据的最大尺寸是由设置proxy_buffer_size指令。
  28. 还可以通过在“X-Accel-Buffering”响应头字段中传递“ yes”或“ no 来启用或禁用缓冲。此功能可以使用proxy_ignore_headers指令禁用
  29. proxy_busy_buffers_size
  30. 句法:proxy_busy_buffers_size size;
  31. 默认:proxy_busy_buffers_size 8k | 16k;
  32. 作用:当缓冲启用从代理服务器的响应,限制了总size缓冲器,可以是忙于发送到客户端的响应,而该响应还没有完全读出。同时,其余的缓冲区可以用于读取响应,并且如果需要,缓冲对临时文件的响应的一部分。默认情况下,size受限于由proxy_buffer_sizeproxy_buffers指令设置的两个缓冲区的大小
  33. proxy_cache
  34. 句法:proxy_cache zone | off;
  35. 默认:proxy_cache off;
  36. 作用:定义用于缓存的共享内存区域。同一区域可以在几个地方使用。参数值可以包含变量(1.7.9)。该off参数禁用从先前配置级别继承的缓存。
  37. proxy_temp_file_write_size
  38. 句法:proxy_temp_file_write_size size;
  39. 默认:proxy_temp_file_write_size 8k | 16k;
  40. 作用:size当启用从代理服务器到临时文件的响应缓冲时, 限制写入临时文件的数据。默认情况下,size受限于由proxy_buffer_sizeproxy_buffers指令设置的两个缓冲区 。临时文件的最大大小由proxy_max_temp_file_size指令设置

large_client_header_buffers

  1. 句法:large_client_header_buffers number size;
  2. 默认:large_client_header_buffers 4 8k;
  3. 标签:http server
  4. 作用:设置用于读取大客户端请求标头的最大值numbersize缓冲区。请求行不能超过一个缓冲区的大小,或者414Request-URI Too Large)错误返回到客户端。请求头字段也不能超过一个缓冲区的大小,或者400(错误请求)错误返回到客户端。缓冲区仅在需要时分配。默认情况下,缓冲区大小等于8K字节。如果在请求处理结束之后,连接被转换到保持活动状态,则释放这些缓冲器。

client_header_buffer_size

  1. 句法:client_header_buffer_size size;
  2. 默认:client_header_buffer_size 1k;
  3. 标签:http server
  4. 作用:设置读取客户端请求标头的缓冲区大小。对于大多数请求,1K字节的缓冲区就足够了。但是,如果请求包括长Cookie,或来自WAP客户端,它可能不适合1K。如果请求行或请求头字段不适合该缓冲区,则分配由large_client_header_buffers指令配置的较大缓冲区

proxy_temp_path

  1. 语法:proxy_temp_path path [level1 [level2 [level3]]];
  2. 默认:proxy_temp_path proxy_temp;
  3. 标签:http, server, location
  4. 定义用于存储具有从代理服务器接收的数据的临时文件的目录。最多可以在指定目录下使用三级子目录层次结构。例如,在以下配置中
  5. proxy_temp_path / spool/nginx/roxy_temp 1 2;

proxy_cache_path

  1. 句法:proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
  2. 标签:http
  3. 设置缓存的路径和其他参数。缓存数据存储在文件中。高速缓存中的文件名是将MD5函数应用于 高速缓存密钥的结果。该levels参数定义高速缓存的层次结构级别:从13,每个级别接受值12.例如,在以下配置中
  4. proxy_cache_path /data/nginx/cache levels = 12 keys_zone = one10m;
  5. proxy_cache one; #引用
  6. 缓存中的文件名将如下所示:
  7. /data/nginx/cache/c/29/ b7f54b2df7773722d382f4809d650 29c
  8. 缓存的响应首先写入临时文件,然后重命名该文件。从版本0.8.9开始,临时文件和缓存可以放在不同的文件系统上。但是,请注意,在这种情况下,文件将跨两个文件系统复制,而不是廉价的重命名操作。因此,建议对于任何给定的位置,缓存和保存临时文件的目录放在同一文件系统上。临时文件的目录是根据use_temp_path参数(1.7.10)设置的。如果省略此参数或将其设置为该值on,则将使用由proxy_temp_path伪指令为给定位置设置的目录。如果该值设置为off,临时文件将直接放在缓存目录中。
  9. 此外,所有的活性密钥和有关数据的信息被存储在共享存储器区,其namesize 由配置keys_zone参数。一兆字节区域可以存储大约8,000个密钥。
  10. 在参数指定的时间内未访问的缓存数据 inactive从缓存中删除,而不管其新鲜度。默认情况下,inactive设置为10分钟。
  11. 特殊的“缓存管理器”进程监视由参数设置的最大缓存大小max_size。当超过此大小时,它会删除最近使用的最少数据。数据是在由被配置迭代除去 manager_files manager_threshold manager_sleep参数(1.11.5)。在一次迭代过程中,不超过manager_files项目被删除(默认为100)。一次迭代的持续时间受参数限制 manager_threshold(默认为200毫秒)。在迭代之间,进行由manager_sleep 参数(默认为50毫秒)配置的暂停。
  12. 启动后一分钟,特殊的“缓存加载器”进程被激活。它将关于存储在文件系统上的先前高速缓存的数据的信息加载到高速缓存区中。加载也在迭代中完成。在一次迭代期间,不会loader_files加载任何项目(默认值为100)。此外,一次迭代的持续时间受参数限制 loader_threshold(默认为200毫秒)。在迭代之间,进行由loader_sleep 参数(默认为50毫秒)配置的暂停。
  13. purger= on|off
  14. 指示与通配符键匹配的高速缓存条目是否 将由高速缓存清除器从磁盘中删除(1.7.12)。将参数设置为on (默认为off)将激活“缓存清除器”进程,该进程将永久遍历所有缓存条目并删除与通配符键匹配的条目。
  15. purger_files=number
  16. 设置在一次迭代(1.7.12)期间将扫描的项目数。默认情况下,purger_files设置为10
  17. purger_threshold=number
  18. 设置一次迭代的持续时间(1.7.12)。默认情况下,purger_threshold设置为50毫秒。
  19. purger_sleep=number
  20. 设置迭代之间的暂停(1.7.12)。默认情况下,purger_sleep设置为50毫秒。

proxy_cache_key

  1. 句法: proxy_cache_key string;
  2. 默认: proxy_cache_key $ scheme $ proxy_host $ request_uri;
  3. 标签: httpserverlocation
  4. 例如,定义缓存的键
  5. proxy_cache_key$ host $ request_uri $ cookie_user”;
  6. 默认情况下,指令的值接近字符串
  7. proxy_cache_key $ scheme $ proxy_host $ uri $ is_args $ args;

proxy_cache_valid

  1. 句法:proxy_cache_valid [code ...] time;
  2. 默认: - -
  3. 标签:httpserverlocation
  4. 设置不同响应代码的缓存时间。例如,以下指令
  5. 对代码200302的响应设置10分钟的缓存,对代码404的响应设置为1分钟。
  6. proxy_cache_valid 200 302 10m;
  7. proxy_cache_valid 404 1m;
  8. 如果只缓存time指定
  9. proxy_cache_valid 5m;
  10. 那么只缓存200,301302响应。
  11. 此外,any可以指定参数以缓存任何响应
  12. proxy_cache_valid 200 302 10m;
  13. proxy_cache_valid 301 1h;
  14. proxy_cache_valid any 1m;
  15. 缓存的参数也可以直接在响应头中设置。这比使用指令设置缓存时间具有更高的优先级。
  16. X-Accel-Expires”头字段设置响应的缓存时间(以秒为单位)。零值禁用缓存用于响应。如果值以@前缀开头,则它设置自Epoch开始的以秒为单位的绝对时间,直到响应可以被缓存。
  17. 如果报头不包括“X-Accel-Expires”字段,则可以在报头字段“Expires”或“Cache-Control”中设置高速缓存的参数。
  18. 如果头包括“Set-Cookie”字段,则这样的响应将不被缓存。
  19. 如果头包括具有特殊值“ *” 的“Vary”字段,则这样的响应将不被缓存(1.7.7)。如果报头包括具有另一个值的“Vary”字段,则这样的响应将被缓存,考虑相应的请求报头字段(1.7.7)。
  20. 可以使用proxy_ignore_headers指令禁用对这些响应头字段中的一个或多个的处理。

proxy_no_cache

  1. 句法:proxy_no_cache string ...;
  2. 字段:httpserverlocation
  3. 定义响应不会保存到缓存的条件。如果字符串参数的至少一个值不为空,并且不等于“0”,则不会保存响应:
  4. proxy_no_cache $ cookie_nocache $ arg_nocache $ arg_comment;
  5. proxy_no_cache $ http_pragma $ http_authorization;
  6. 可以与proxy_cache_bypass指令一起使用。

proxy_set_header

  1. 句法:proxy_set_header field value;
  2. 默认:proxy_set_header Host $ proxy_host;
  3. proxy_set_header连接关闭;
  4. 标签:httpserverlocation
  5. 允许将字段重新定义或附加到传递到代理服务器的请求标头 。在value可以包含文本,变量,和它们的组合。当且仅当没有proxy_set_header 在当前级别上定义指令时,这些指令从上一级 继承。
  6. 默认情况下,只重新定义两个字段:
  7. proxy_set_header Host $ proxy_host;
  8. proxy_set_header连接关闭;
  9. ngx_http_proxy_module模块允许将请求传递到另一个服务器
  10. http / {
  11. proxy_pass http// localhost:8000;
  12. proxy_set_header Host $ host;
  13. proxy_set_header X-Real-IP $ remote_addr;
  14. }}
  15. 未更改的“主机”请求头字段可以像这样传递:
  16. proxy_set_header Host $ http_host;
  17. 但是,如果此字段不存在于客户端请求标头中,则不会传递任何内容。在这种情况下,最好使用$host变量 - 其值等于“主机”请求头字段中的服务器名称或主服务器名称(如果此字段不存在)
  18. proxy_set_header Host $ host;
  19. 此外,服务器名称可以与代理服务器的端口一起传递:
  20. proxy_set_header Host $ host$ proxy_port;
  21. 如果头字段的值是空字符串,那么此字段不会传递到代理服务器:
  22. proxy_set_header Accept-Encoding“”;
  23. 允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。 当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:
  24. proxy_set_header Host $proxy_host;
  25. proxy_set_header Connection

http_cookie

  1. proxy_set_header Cookie $http_cookie;
  2. 标签:http,server
  3. proxy or fcgi 等场景给Cookies增加内容,比如,告诉后端你是那一台fron
  4. proxy_set_header Cookie "$http_cookie; node_id=018"
  5. 这里增加了名为node_id的一个cookie进去,当然,就这个例子来说,也可以这样传递前端的IDbackend:
  6. 还需要在server字段进行引用

X-Forwarded-For

  1. 在默认情况下,Nginx并不会对X-Forwarded-For头做任何的处理,除非用户使用proxy_set_header 参数设置:
  2. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
  3. $proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr$remote_addr变量的值是客户端的IP
  4. Nginx设置X-Forwarded-For$proxy_add_x_forwarded_for后会有两种情况发生:
  5. 1、如果从CDN过来的请求没有设置X-Forwarded-For头(通常这种事情不会发生),而到了我们这里Nginx设置将其设置为$proxy_add_x_forwarded_for的话,X-Forwarded-For的信息应该为CDNIP,因为相对于Nginx负载均衡来说客户端即为CDN,这样的话,后端的web程序时死活也获得不了真实用户的IP的。
  6. 2CDN设置了X-Forwarded-For,我们这里又设置了一次,且值为$proxy_add_x_forwarded_for的话,那么X-Forwarded-For的内容变成 ”客户端IP,Nginx负载均衡服务器IP“如果是这种情况的话,那后端的程序通过X-Forwarded-For获得客户端IP,则取逗号分隔的第一项即可。
  7. 如上两点所说,如果我们知道了CDN设置了X-Forwarded-For信息,且只有客户端真实的IP的话,那么我们的Nginx负载均衡服务器可以不必理会该头,让它默认即可。
  8. 其实Nginx中还有一个$http_x_forwarded_for变量,这个变量中保存的内容就是请求中的X-Forwarded-For信息。如果后端获得X-Forwarded-For信息的程序兼容性不好的话(没有考虑到X-Forwarded-For含有多个IP的情况),最好就不要将X-Forwarded-For设置为 $proxy_add_x_forwarded_for。应该设置为$http_x_forwarded_for或者干脆不设置!
  9. proxy_set_header Accept-Language "zh-CN";设置语言为中文

user_agent

  1. proxy_set_header User-Agent $http_user_agent;

关于上面参数我们先要知道什么是User_Agent

介绍User Agent的含义,以及User Agent各部分的意义 "User Agent"也被称为是用户代理,现在被广泛用来标识浏览器客户端信息。User Agent在互联网早期就已经存在,那时互联网是完全基于文本的,用户直接浏览器互联网时需要敲入各种键盘命令。后来开发人员开发出多种浏览工具来帮助进行互联网浏览,这些工具就被称为是用户“代理”(UserAgent),因为这些工具模仿用户敲入命令的行为,但是用户并不需要了解获取信息的复杂命令。目前几乎所有人都采用网络浏览器来作为用户代理User Agent。

有时候网站需要获取客户端的信息,以了解网站内容在客户端的展现方式,因此大部分用户代理会向网站发送用户代理字段(User Agent String),该字符串通常是由字母和数字组成的。

因此,各种不同的网络浏览器(Internet Explorer,Firefox,Opera,遨游、搜狗)会用不同的用户代理字符串(user agent strings)来作为自身的标志。同时,像Google、Yahoo、Bing和百度这种搜索引擎,在通过网络爬虫来访问网页时,也会通过用户代理字符串(user agent strings)来进行作为自身标志。这也是为何网站统计报告中都能够统计浏览器信息以及爬虫信息。

用户代理字符串通常包括6个不同的部分,浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息 :
image_1b9idje20aoo9qj18s41avm16ot9.png-26.2kB

从上图可知:上面的用户代理字符串(user agent string)例子中,客户端所用的浏览器是Internet
Explorer7。其他的浏览器如Firefox、Chrome、Opera、遨游等的用户代理字符串(user agent
string)与上面比较类似,详情请见我们提供的常见的User Agent内容。

User Agent的结构 根据上面的介绍,大家了解到了用户代理User Agent的基本意义,那用户代理User Agent具体怎么用呢?譬如当用户使用Firefox访问下载网站时,网站通过用户代理字符串User Agent String获取到该用户的浏览器版本,发现该版本的Firefox难以完美地展现网站的内容,就可以给出个性化的提示:“您可以试试最新版的Firefox,这样能够展现最新的WebGL和HTML5内容”。另外,网站还可以根据用户代理字符串User Agent String来给出不同的CSS文件,以保证在不同的浏览器上均能够展现出最好的效果。

上面两个例子都是用户代理字符串User Agent String分析的典型场景。下图是相关流程的示意图:
image_1b9idkk0q13p2fr6i9l11n1re5m.png-46.2kB

expires

  1. 语法:expires time
  2. 标签:serverhttp
  3. 在网站的开发和运营中,对于图片 视频 css js等网站元素的更改机会较少,特别是图片,这时可以将图片设置在客户端浏览器本地缓存365天或3650天,而降cssjshtml等代码缓存10~30天,这样用户第一次打开页面后,会在本地的浏览器按照过期日期缓存响应的内容,下次用户再打开类似页面,重复的元素就无需下载了,从而加快了用户访问速度,由于用户的访问请求和数据减少了,因此节省了服务器端大量的带宽。此功能和apacheexpire相似。
  4. Nginx expires 功能优点
  5. 1.Expires可以降低网站的带宽,节约成本。
  6. 2.加快用户访问网站的速度,提升了用户访问体验。
  7. 3.服务器访问量降低了,服务器压力就减轻了,服务器成本也会降低,甚至可以解决人力成本。
  8. 对于几乎所有Web来说,这是非常重要的功能之一,Apache服务也由此功能。
  9. location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$
  10. {
  11. expires 3650d;
  12. }

fastcgi_connect_timeout

  1. 句法:fastcgi_connect_timeout time;
  2. 默认:fastcgi_connect_timeout 60s;
  3. 标签:httpserverlocation
  4. 定义与FastCGI服务器建立连接的超时。应该注意,该超时通常不能超过75秒。

fastcgi_send_timeout

  1. 句法:fastcgi_send_timeout time;
  2. 默认:fastcgi_send_timeout 60s;
  3. 标签:httpserverlocation
  4. 设置将请求发送到FastCGI服务器的超时。超时仅在两个连续的写操作之间设置,而不是用于传输整个请求。如果FastCGI服务器在此时间内未收到任何内容,则连接将关闭。

fastcgi_read_timeout

  1. 句法:fastcgi_read_timeout time;
  2. 默认:fastcgi_read_timeout 60s;
  3. 标签:httpserverlocation
  4. 定义从FastCGI服务器读取响应的超时。超时仅在两次连续读取操作之间设置,而不是用于传输整个响应。如果FastCGI服务器在此时间内未发送任何内容,则连接将关闭

fastcgi_buffer_size

  1. 句法:fastcgi_buffer_size size;
  2. 默认:fastcgi_buffer_size 4k | 8k;
  3. 标签:httpserverlocation
  4. 设置size用于读取从FastCGI服务器接收的响应的第一部分的缓冲区。这部分通常包含一个小的响应头。默认情况下,缓冲区大小等于一个内存页。这是4K8K,取决于一个平台

fastcgi_buffers

  1. 句法:fastcgi_buffers number size;
  2. 默认:fastcgi_buffers 8 4k | 8k;
  3. 标签:httpserverlocation
  4. 设置用于从FastCGI服务器读取单个连接的响应的缓冲区numbersize缓冲区。默认情况下,缓冲区大小等于一个内存页。这是4K8K,取决于一个平台。

fastcgi_busy_buffers_size

  1. 句法:fastcgi_busy_buffers_size size;
  2. 默认:fastcgi_busy_buffers_size 8k | 16k;
  3. 标签:httpserverlocation
  4. 当缓冲启用从FastCGI的服务器的响应,限制了总size缓冲器,可以是忙于发送到客户端的响应,而该响应还没有完全读出。同时,其余的缓冲区可以用于读取响应,并且如果需要,缓冲对临时文件的响应的一部分。默认情况下,size受限于fastcgi_buffer_sizefastcgi_buffers指令设置的两个缓冲区的大小

fastcgi_temp_file_write_size

  1. 句法:fastcgi_temp_file_write_size size;
  2. 默认:fastcgi_temp_file_write_size 8k | 16k;
  3. 标签:httpserverlocation
  4. size当启用从FastCGI服务器到临时文件的响应缓冲时,一次 限制写入临时文件的数据。默认情况下,size受限于由fastcgi_buffer_sizefastcgi_buffers指令设置的两个缓冲区 。临时文件的最大大小由fastcgi_max_temp_file_size指令设置

附上一个公司的Nginx.conf

  1. 硬盘:
  2. [root@boxuegu ~]# df -h
  3. Filesystem Size Used Avail Use% Mounted on
  4. /dev/hda1 20G 15G 5.7G 72% /
  5. tmpfs 4.0G 0 4.0G 0% /dev/shm
  6. /dev/xvdb1 197G 73G 114G 40% /data
  7. 内存
  8. [root@boxuegu ~]# free -m
  9. total used free shared buffers cached
  10. Mem: 7993 7434 558 0 305 5300
  11. -/+ buffers/cache: 1828 6164
  12. Swap: 0 0 0
  13. [root@boxuegu ~]# uname -r
  14. 2.6.18-308.el5
  15. 提示:这是线上的一台nginx负载均衡服务器
  16. user root;
  17. worker_processes 4;
  18. error_log logs/error.log;
  19. error_log logs/error.log notice;
  20. error_log logs/error.log info;
  21. events {
  22. worker_connections 15535;
  23. }
  24. http {
  25. include mime.types;
  26. default_type application/octet-stream;
  27. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  28. '$status $body_bytes_sent "$http_referer" '
  29. '"$http_user_agent" "$http_x_forwarded_for"';
  30. access_log logs/access.log main;
  31. sendfile on;
  32. tcp_nopush on;
  33. keepalive_timeout 65;
  34. client_max_body_size 300m;
  35. gzip on;
  36. gzip_buffers 4 16k;
  37. gzip_http_version 1.1;
  38. gzip_comp_level 9;
  39. gzip_types text/plain application/x-javascript text/css application/xml;
  40. gzip_vary on;
  41. proxy_connect_timeout 3;
  42. proxy_read_timeout 60;
  43. proxy_send_timeout 60;
  44. #proxy_buffer_size 12800k;
  45. #proxy_buffers 4 16400k;
  46. #proxy_busy_buffers_size 12800k;
  47. #proxy_temp_file_write_size 12800k;
  48. #gzip on;
  49. large_client_header_buffers 4 512k;
  50. client_header_buffer_size 512k;
  51. proxy_temp_path /data/nginx/temp;
  52. proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
  53. fastcgi_intercept_errors on;
  54. upstream yx.abcdocker.com{
  55. server abcdocker.com:8280;
  56. ip_hash;
  57. }
  58. upstream upnew.abcdocker.com{
  59. server abcdocker.com:80;
  60. ip_hash;
  61. }
  62. upstream up.abcdocker.com{
  63. server abcdocker.com:8081;
  64. ip_hash;
  65. }
  66. upstream ask.abcdocker.com{
  67. server abcdocker.com:80;
  68. ip_hash;
  69. }
  70. upstream bxg.tbh.abcdocker.com{
  71. server 127.0.0.1:8205;
  72. ip_hash;
  73. }
  74. upstream league{
  75. server 127.0.0.1:8080;
  76. ip_hash;
  77. }
  78. server {
  79. listen 80;
  80. server_name www.abcdocker.com;
  81. access_log logs/www.access.log main;
  82. location / {
  83. root html;
  84. index index.html index.htm;
  85. proxy_pass http://www.abcdocker.com;
  86. proxy_set_header X-Real-IP $remote_addr;
  87. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  88. proxy_set_header Host $http_host;
  89. }
  90. error_page 500 502 503 504 /50x.html;
  91. location = /50x.html {
  92. root html;
  93. }
  94. }
  95. server {
  96. listen 80;
  97. server_name ask.abcdocker.com;
  98. access_log logs/ask.access.log main;
  99. location / {
  100. proxy_pass http://ask.abcdocker.com;
  101. proxy_set_header X-Real-IP $remote_addr;
  102. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  103. proxy_set_header Host $http_host;
  104. }
  105. error_page 500 502 503 504 /50x.html;
  106. location = /50x.html {
  107. root html;
  108. }
  109. }
  110. server {
  111. listen 80;
  112. server_name bxg.tbh.abcdocker.com;
  113. access_log logs/tbh.access.log main;
  114. location / {
  115. proxy_pass http://bxg.tbh.abcdocker.com;
  116. proxy_set_header X-Real-IP $remote_addr;
  117. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  118. proxy_set_header Host $http_host;
  119. }
  120. error_page 500 502 503 504 /50x.html;
  121. location = /50x.html {
  122. root html;
  123. }
  124. }
  125. server {
  126. listen 80;
  127. server_name st.abcdocker.com;
  128. access_log logs/st.access.log main;
  129. location / {
  130. root html;
  131. index index.html index.htm;
  132. proxy_pass http://league;
  133. proxy_set_header X-Real-IP $remote_addr;
  134. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  135. proxy_set_header Host $http_host;
  136. }
  137. #error_page 404 /404.html;
  138. # redirect server error pages to the static page /50x.html
  139. #
  140. error_page 500 502 503 504 /50x.html;
  141. location = /50x.html {
  142. root html;
  143. }
  144. }
  145. server {
  146. listen 80;
  147. server_name yx.abcdocker.com;
  148. access_log logs/yx.access.log main;
  149. location / {
  150. root html;
  151. index index.html index.htm;
  152. proxy_pass http://yx.abcdocker.com;
  153. proxy_set_header X-Real-IP $remote_addr;
  154. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  155. proxy_set_header Host $http_host;
  156. }
  157. #error_page 404 /404.html;
  158. # redirect server error pages to the static page /50x.html
  159. #
  160. error_page 500 502 503 504 /50x.html;
  161. location = /50x.html {
  162. root html;
  163. }
  164. }
  165. server {
  166. listen 80;
  167. server_name up.abcdocker.com;
  168. access_log logs/up.access.log main;
  169. location ^~ /study/ {
  170. root html;
  171. index index.html index.htm;
  172. proxy_pass http://up.abcdocker.com;
  173. proxy_set_header X-Real-IP $remote_addr;
  174. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  175. proxy_set_header Host $http_host;
  176. }
  177. location / {
  178. root html;
  179. index index.html index.htm;
  180. proxy_pass http://upnew.abcdocker.com;
  181. proxy_set_header X-Real-IP $remote_addr;
  182. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  183. proxy_set_header Host $http_host;
  184. }
  185. #error_page 404 /404.html;
  186. # redirect server error pages to the static page /50x.html
  187. #
  188. error_page 500 502 503 504 /50x.html;
  189. location = /50x.html {
  190. root html;
  191. }
  192. }
  193. server {
  194. listen 80;
  195. server_name club.abcdocker.com;
  196. root /data/webapps/club;
  197. location / {
  198. index index.html index.htm;
  199. }
  200. }
  201. server {
  202. listen 80;
  203. server_name book.abcdocker.com;
  204. root /data/webapps/book;
  205. location / {
  206. index index.html index.htm;
  207. }
  208. }
  209. server {
  210. listen 80;
  211. server_name dvd.abcdocker.com;
  212. root /data/webapps/dvd;
  213. location / {
  214. index index.html index.htm;
  215. }
  216. }
  217. server {
  218. listen 80;
  219. server_name openclass.abcdocker.com;
  220. root /data/webapps/openclass;
  221. location / {
  222. index index.html index.htm;
  223. }
  224. }
  225. server {
  226. listen 80;
  227. server_name resource.abcdocker.com;
  228. root /data/webapps/resource;
  229. location / {
  230. index index.html index.htm;
  231. }
  232. }
  233. }

[Nginx] – 性能优化 – 配置文件优化 [1]
[Nginx] – 安全优化 – 配置文件优化 [2]

Nginx帮助文档
Nginx配置文档


新闻联播老司机

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: