Nginx学习总结

2017年2月23日, 星期四

Nginx学习总结

   Nginx是目前比较主流的HTTP反向代理服务器(其企业版提供了基于TCP层的反向代理插件),对于构建大型分布式web应用,具备举足轻重的做用。简单来讲,nginx有2个主要的功能:动/静态资源分离、负载均衡。javascript

 

    动/静态资源分离:nginx支持正则表达式以区分静态资源或者动态资源,其中动态资源能够进一步转发给后端的proxy server,而静态资源则能够在nginx层面使用本地缓存策略或者重定向(类CDN)到其余nginx上。css

    负载均衡:对于动态资源而言,若是有多个proxy server,那么nginx将会根据必定的算法选择合适的server,并转发请求,最终将客户端request相对均衡的分发给多个server。html

 

    Nginx做为“单点”,面向客户端请求,并将请求转发给后端的某个server,由于server能够有多个,那么从总体而言,提高了站点的“资源整合”能力,提高了站点的总体吞吐能力;但由于受限于nginx自己的IO模型,并无“下降”对物理资源的消耗(即性能开支);一般nginx做为整个站点的“避雷针”和导流通道,它应该被架设在物理资源较为优越的机器上,好比8U物理机,32核心,64G内存,对磁盘要求相对较低,对CPU、内存、网卡带宽有较高的要求,由于nginx不只须要和客户端请求创建连接,并且还须要与后端proxy server创建连接而且负责流量输入、输出(这和LVS、Haproxy有本质区别),这种双倍的连接创建,就要求机器具备较高的内存和CPU,若是你的nginx还有大量的“静态资源”cache,还须要使用高速、高容量的磁盘。由于nginx节点最终为全部proxy server流量的总和,那么它应该具备更高的网卡带宽。前端

 

    为了不资源竞争,应该避免nginx和web server部署在同一个节点上,由于web server一般为CPU和内存高耗型,这会大大下降nginx的代理能力java

    1) 在中小型应用中(PV在KW级别,单一垂直web应用),一般一个nginx代理多个(组)server便可。node

    2)对于大中型应用,一个nginx将没法支撑所有的流量,咱们将会采用多个nginx代理(复制了1)中的架构模型),并在nginx前端继续构建高性能的分流设备,好比LVS、Haproxy等更低层的软/硬件负载均衡器,这种负载均衡器一般只是“转发”,而不涉及到流量的输出,因此转发效率将会更高,承载能力更强。linux

    3)不管什么时候,咱们也不但愿nginx存在单点故障问题,那么一般咱们还须要使用keepalived(其余同类型技术,VIP)来提升nginx节点的可用性,即Master-backup模式。nginx

    4)当有多个nginx时,为了提高后端server的代理能力,一般还会让多个nginx之间交叉重叠代理后端的server。git



 

1、经常使用模块github

    在nginx 中,有几个经常使用的模块(module):

  • ngx_http_core_module:核心模块;内置模块。
  • ngx_http_upstream_module:“upstream”模块,内置模块,核心模块;用于请求的“负载均衡”。
  • ngx_http_proxy_module:“请求代理”模块,核心模块;将请求转发给代理Server,或者对请求进行额外的cache操做。
  • ngx_http_rewrite_module:“URL重写”模块,内置模块;根据规则,rewrite特定的URL并转发给代理Server。
  • ngx_http_access_module:“访问控制”模块;“容许”或者“拒绝”特定的IP列表对server的访问,内置模块。
  • ngx_http_limit_conn_module:“访问控制”模块;能够限定每一个key(能够为客户端IP)容许的最大并发链接数,内置模块。
  • ngx_http_limit_req_module:“访问控制”模块;能够限定每一个key(能够为客户端IP)在单位之间内容许处理的request个数,“流量控制”,内置模块。
  • ngx_http_headers_module:“header”模块;主要是“add_header”和“expired”两个指令,向response中添加header信息,内置模块。
  • ngx_http_charset_module:“字符集”模块;在响应头部的“Content-Type”中增长charset信息,内置模块。
  • ngx_http_addition_module:“增添”模块;在response内容以前或者以后额外添加文本信息,内置模块。
  • ngx_http_sub_module:“后置修改响应”模块;能够过滤并替换response内容中特定的字符串,附加模块,须要在编译时指定“--with-http_sub_module”。
  • ngx_http_fastcgi_module:将请求发送给“fastcgi”服务器,内置模块。
  • ngx_http_geo_module:“geo”模块;建立一个变量,此变量的值由client ip值决定,对实现小型私有“CDN”方案有参考价值,内置模块
  • ngx_http_geoip_module:“geo”模块;经过配置(数据源)能够得知client ip所属的“城市”、“区域”等信息,对实现小型私有的CDN有必定的参考价值,附加模块,须要在编译时指定“--with-http_geoip_module”。
  • ngx_http_gzip_module:“gzip”模块;对response使用gzip压缩,对减小数据传输量有益,内置模块。
  • ngx_http_gzip_static_module:“gzip”模块;对response使用gzip压缩,输出为“.gz”文件,附加模块,须要在编译时指定“--with-http_gzip_static_module”。
  • ngx_http_image_filter_module:“图片”模块;能够对“JPEG”、“GIF”、“PNG”格式的图片进行裁剪等操做,附加模块,须要在编译时指定“--with-http_image_filter_module”。
  • ngx_http_status_module/ngx_http_stub_status_module:“nginx内部状态”模块;用于获取nginx内部的一些状态统计信息,一般用来获取一些简单的统计数据,其中nginx_http_stub_status_module为附加模块,编译时须要指定“--with-http_stub_status_module”。
  • nginx-http-concat:第三方附加模块,由taobao开发,主要用于合并“静态资源”请求,提高性能,须要额外下载,并在编译时添加“--add-module=/root/software/nginx-http-concat-master”。
  • ngx_cache_purge:第三方附件模块,由frickle提供,当在proxy中使用cache保存静态资源时,那么cache_purge模块提供删除过时数据的功能支持,须要额外下载,并在编译时添加“--add-module=/root/software/ngx_cache_purge”。

2、安装(mac下)

    接下来,咱们就尝试安装nginx,从官网下载最新版1.8.0压缩包,并按照以下步骤一次安装,本人所使用的平台为mac OS(很遗憾,mac下安装这些软件,仍是至关的费劲)。为了方便起见,咱们将上述经常使用的module一次性所有安装或者加载(避免之后从新增长module带来的麻烦)。下文中所下载的软件都先保存到/usr/local/src下。

    一、下载ngx_cache_purge模块:http://labs.frickle.com/nginx_ngx_cache_purge/,解压后保存在本地目录。

    二、下载ngx-http-concat模块:https://github.com/alibaba/nginx-http-concat,解压后保存在本地目录。

    三、下载nginx并解压,保存在/usr/local/src,重命名为“nginx-1.8.0-src”。

    四、configure操做,经过--prefix指定nginx最终的可执行文件copy到哪一个目录,这个目录不须要提早建立。

 

Java代码   收藏代码
  1. ##进入nginx目录  
  2. ./configure --prefix=/usr/local/nginx-1.8.0 --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --add-module=/usr/local/src/nginx-http-concat-master --add-module=/usr/local/src/ngx_cache_purge/  
  3.    

 

   极有可能你会获得一个错误“./configure: error: the HTTP rewrite module requires the PCRE library.”,这意味着若是须要安装rewrite模块,那么就须要安装PCRE包(perl正则表达式)。

Java代码   收藏代码
  1. ##mac系统,linux下都可使用此编译安装的方式  
  2. ##首先下载pcre包:http://www.pcre.org/,解压  
  3. ##进入解压包  
  4. sudo ./configure --prefix=/usr/local  
  5. sudo make  
  6. sudo make install  

 

    而后你还会获得一个错误“./configure: error: the HTTP image filter module requires the GD library.”,GD包主要用于图形处理,这个须要手动安装。安装GD以前,须要依次安装libpng、libjpeg,freetype,zlib(mac下不须要安装,默认已经有了)。

Java代码   收藏代码
  1. ##libpng,在sourceforge.net上搜索“libpng”,下载tar.xz文件,解压,并执行以下命令  
  2. sudo ./configure --prefix=/usr/local  
  3. sudo make  
  4. sudo make install  

 

Java代码   收藏代码
  1. ##libjpeg,在http://www.ijg.org/files目录下,下载jpegsrc.v9a.tar.gz(或者下载最新的压缩包,不要下载源文件版)   
  2. sudo ./configure --prefix=/usr/local  
  3. sudo make  
  4. sudo make install  

 

Java代码   收藏代码
  1. ##freetype,在sourceforge.net上搜索“freetype”,下载tar.bz2文件,并解压。  
  2. sudo ./configure --prefix=/usr/local  
  3. sudo make  
  4. sudo make install  

 

Java代码   收藏代码
  1. ##libgd:https://bitbucket.org/libgd/gd-libgd/downloads,下载tar.xz格式文件,若是你知道如何编译,也能够在libgd.org下载源码。  
  2. sudo ./configure --prefix=/usr/local --with-jpeg=/usr/local --with-png=/usr/local --with-freetype=/usr/local  
  3. sudo make  
  4. sudo make install  

 

    在安装libgd时,必须指定jpeg,png,freetype这些lib的位置,不然此后在nginx安装时会报错:

Java代码   收藏代码
  1. Undefined symbols for architecture x86_64:  
  2.   "_gdImageCreateFromPngPtr", referenced from:  
  3.       _ngx_http_image_resize in ngx_http_image_filter_module.o  
  4.   "_gdImagePngPtr", referenced from:  
  5.       _ngx_http_image_resize in ngx_http_image_filter_module.o  
  6. ld: symbol(s) not found for architecture x86_64  

 

    上述lib安装完毕以后,而后再次运行3)中的nginx的configure指令,应该就没有错误,而后依次执行“make” “make install”,此后咱们会在“/usr/local/nginx-1.8.0”目录下看到相关的可执行文件、配置文件等。若是确实安装成功,那么咱们此前的“nginx-1.8.0-src”便可删除,此后的操做只须要在安装后的文件中进行便可。

    五、测试运行

    进入sbin目录,执行“./nginx”,启动nginx,若是出错,请到logs目录下查看缘由。而后在浏览器中输入“127.0.0.1”(无需端口),你将会获得nginx的欢迎页。

    接下来,咱们将依次介绍nginx的几个经常使用的模块,在认识如何配置nginx的同时,简单了解nginx的工做原理。

 

    咱们能够经过“./nginx -V”查看nginx的configure信息。

    “./nginx -t”用于检测配置文件是否合法。

    “./nginx -s stop”:关闭。

    “./nginx -s quit”:优雅关闭。

    “./nginx -s reopen”:从新打开log文件

    “./nginx -s reload”:从新加载配置信息,咱们在修改了conf文件以后,一般使用reload便可直接加载,无需重启nginx。

 

    nginx会启动一个master进程,和“worker_processes”个worker进程,其中master进程主要的做用就是“加载、评定配置信息”、“维护worker进程”,worker进程用于处理实际的request,nginx基于平台的event模型,向worker进程分发request。    

 

    当master进程收到reload信号时,首先检测配置文件的合法性,而后尝试使用新的配置信息;若是成功,master将启动新的worker进程,并向原来的worker进程发消息请求他们shutdown,此后request将会被抓发给新的worker进程,对于原来的worker将本身已经accept的请求处理完以后即关闭;若是配置文件有问题,master将会回滚配置的更改,而worker进程不受任何影响。

 

    六、配置文件样例

Java代码   收藏代码
  1. #user  nobody;  
  2. worker_processes  2;  
  3. worker_rlimit_core 256m;  
  4. worker_rlimit_nofile 65535;  
  5.   
  6. error_log  logs/error.log  info;  
  7.   
  8. #pid        logs/nginx.pid;  
  9.   
  10. daemon on;  
  11. worker_priority 0;  
  12.   
  13. events {  
  14.     #use epoll;  
  15.     use kqueue;#linux 请使用epoll  
  16.     accept_mutex on;  
  17.     accept_mutex_delay 500ms;  
  18.     worker_connections  65535;  
  19. }  
  20.   
  21.   
  22. http {  
  23.     include       mime.types;  
  24.     default_type  application/octet-stream;  
  25.   
  26.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  27.                       '$status $body_bytes_sent "$http_referer" '  
  28.                       '"$http_user_agent" "$http_x_forwarded_for"';  
  29.   
  30.     sendfile        on;  
  31.     #tcp_nopush     on;  
  32.     keepalive_timeout  65;  
  33.   
  34.     server {  
  35.         listen       80;  
  36.         server_name  localhost;  
  37.         access_log  logs/localhost.access.log  main;  
  38.   
  39.         location / {  
  40.             root   html;  
  41.             index  index.html index.htm;  
  42.         }  
  43.   
  44.         error_page  404              /404.html;  
  45.         error_page   500 502 503 504  /50x.html;  
  46.         location = /50x.html {  
  47.             root   html;  
  48.         }  
  49.   
  50.     include vhosts/*.conf;  
  51. }  

 

    上面的配置信息应该是最基本的,基本上nginx可以对静态页面作代理,下文中全部的模块都基于这个配置模板。

 

3、代理简析

    nginx一个重要的能力就是静态文件的代理(或cache),包括html、images等,这些静态文件一般放置在本地,好比:/data/www(一些html文件,css,js等),/data/images(图片文件)。

Java代码   收藏代码
  1. location / {  
  2.     root   html;  
  3.     #index  index.html index.htm;  
  4. }  
  5.   
  6. location /images {  
  7.     root /data;  
  8. }  

 

    root”表示文件所在的本地路径,最终请求的uri将会被添加到root路径以后,造成完整的文件路径,好比“127.0.0.1/images/header.jpg”,其uri为“images/header.jpg”,那么最终将会访问本地的“/data/images/header.jpg”(若是本地文件没有访问权限,将会抛出“Permission denied”)。此处还涉及到location的匹配优先级的问题,就像“/images/header.jpg”对于location为“/”和“/images”都匹配,在这种状况下,nginx将会选择“最长前缀”的哪个,即“/images”;此外,location还能支持正则表达式,因此匹配的规则将会比较复杂,咱们稍后详解location。

 

    对于动态代理,须要配置一个(或一组,经过upstream模块支持)web server,nginx接收客户端请求(能够对header进行修改),而后传递给web server,并等待接收proxy server的响应内容,而后再把response发送给客户端(能够对response的内容或者header进行修改),在此过程当中,nginx须要与客户端、web server均要创建连接,nginx就像一个“转发桥”,只是负责将请求,根据location或者其余规则,匹配到一个合适的web server上。

 

Java代码   收藏代码
  1. server {  
  2.     listen 80 default_server;  
  3.     server_name localhost;  
  4.     location / {  
  5.         proxy_pass http://127.0.0.1:8080;  
  6.     }  
  7. }  

 

    proxy_pass将请求转发给web server,不过这个指令还有更多的意义,咱们稍后详解upstream、proxy模块。动态代理,即实际处理请求(响应数据的server)的server在运行时经过必定的算法计算获得的,并且还能够根据请求的参数特征来修改response的内容;一般咱们会指定多个web server,根据必定的“负载均衡”算法选取其中一个负责处理实际的请求。

 

    “server_name”这个指令很是有用,nginx一般根据http请求header中的“Host”字段与“server_name”列表匹配,断定使用哪一个“server”配置,而后根据uri匹配location,断定将次request交给哪一个web server处理。关于server_name的匹配规则,还须要必定的了解。(以下部分配置样例中省略了部分无关的信息)

Java代码   收藏代码
  1. server {  
  2.     listen 80;  
  3.     server_name example.org www.example.org;  
  4. }  
  5. server {  
  6.     listen 80;  
  7.     server_name *.example.org;  
  8. }  
  9. server {  
  10.     listen 80;  
  11.     server_name mail.*;  
  12. }  
  13. server {  
  14.     listen 80;  
  15.     server_name ~^(?<name>.+)\.example\.net$;  
  16. }  

  

    对于指定的请求,nginx从header中host值,将按照以下顺序进行匹配:

    1)精确的全限定名:好比server_name为“www.exmaple.org”,“example.org”。

    2)以“*”开头的最长的通配名称:好比server_name为“*.exmaple.org”。

    3)以“*”结束的最长的通配名称:好比server_name为“mail.*”。

    4)首个匹配的正则表达式。nginx中正则表达式以“~”或者“~*”开头,咱们稍后详解nginx的正则格式。

 

    注意,在nginx中,通配表达式和正则表达式被认为是不一样的,通配表达式必须以“*”开头或者结束,且“*”不能在字符串的中间出现,好比“www.*.example.org”是不合法的;不然应该在正则表达式中使用“*”,好比“~^w.*\.exmaple\.org$”,注意若是在正则表达式中使用字符串“.”,应该须要转义为“\.”,不然“.”是被做为正则表达式中特殊模式(即匹配任意字符串);通配表达式,“*”能够匹配任意多个部分,好比“*.example.org”能够匹配“www.exmaple.org”、“www.sub.exmaple.org”;那么对于“.example.org”这种格式被认为是一种特殊的正则表达式,它能够匹配“exmaple.org”、“*.example.org”。

    上文中提到,nginx中正则表达式必须以“~”开头(或者~*开头,表示字符大小写敏感)、“^”、“$”结尾,这三个特殊符号构成nginx(或者说是PCRE)正则表达式,不然被认为是普通的“全限定名”。若是你了解过正则表达式,其实这些仍是很是容易理解的,不过若是正则表达式中包括“{”、“}”表示匹配次数区间,那么整个表达式都须要用引号包含,不然会编译错误。

Java代码   收藏代码
  1. server_name "~^(?<name>\w\d{1,3}+)\.example\.net$"  

 

    正则表达式中可使用"?<name>"这种格式,在PCRE中称为“命名捕获”(named captures),那么“name”能够做为当前context中的一个变量使用。在nginx中还可使用“数字”类型的命名捕获。

Java代码   收藏代码
  1. ##参数方式  
  2. server {  
  3.     server_name ~^(www\.)?(?<domain>.+)$;  
  4.     location / {  
  5.          root /sites/$domain;  
  6.     }  
  7. }  
  8.   
  9. ##数字方式,效果等同  
  10. server {  
  11.     server_name ~^(www\.)?(.+)$;  
  12.     location / {  
  13.         root /sites/$2;  
  14.     }  
  15. }  

 

    咱们还须要对待那些特殊的状况,好比请求的header中没有“Host”或者为空,那么能够用一个空字符串来匹配这种请求:

Java代码   收藏代码
  1. server {  
  2.     server_name example.org www.example.org "" 192.168.1.1;  
  3. }  

 

    固然有些时候,咱们还会使用IP去访问一个nginx(没有配置host解析,一般在测试环境),那么咱们咱们请求的“Host”就是一个IP字符串,那么咱们仍然能够按照这种规则配置server_name。

Java代码   收藏代码
  1. server {  
  2.     listen 80 default_server;  
  3.     server_name _;  
  4. }  

 

    如上述例子所示,“default_server”表示为若是没有任何匹配的server_name时,将选择此server来处理。其中server_name若是配置为“_”,则表示此server匹配全部的“Host”,这些Host仅为那些不能经过“精确全限定名”、“通配表达式”、“正则表达式”匹配的。

    根据server侦听的端口号,将会把“精确匹配”、“以*开头的通配表达式”、“以*结尾的通配表达式”保存在三个hashtable中(cache),这个hashtable的大小能够经过配置文件调整;针对一个host,将会首先使用“精确匹配”,若是没有找到相应的server_name,将会从“以*开头的通配表达式”中查找,而后再从“已*结尾的通配表达式”中查找;从“通配表达式”的hashtable中查找,要慢于“精确匹配”,不过对于“.example.org”这种格式会被保存在“通配表达式”的hashtable中,而不是保存在“精确匹配”的hashtable中。对于“正则表达式”时最慢的一种方式,也是最后参与匹配的,将会根据它们在配置文件中的顺序,依次去匹配。基于这些缘由,比较好的办法就是尽量的使用“精确全限定名”,好比:

Java代码   收藏代码
  1. server {  
  2.     server_name example.org www.example.org *.example.org;  
  3. }  
  4. server {  
  5.     server_name sub.example.org;  
  6. }  

 

    而不是像这样简单的配置:

 

Java代码   收藏代码
  1. server {  
  2.     server_name .example.org;  
  3. }  

 

    若是你定义了较多的server配置或者较长的server_name字符串,那么就须要经过“server_names_hash_max_size”(会影响server_name的个数)、“server_names_hash_bucket_size”(影响server_name的字符串长度)来调整配置,不然会抛出错误,咱们不须要贸然去调整这两个参数,直到它出错。

 

4、负载均衡

    使用nginx,其实还对其“负载均衡”的特性比较看重。一般咱们有多个web server对等部署,nginx将会经过“负载均衡”模块将请求转发给合适的web server,最终提高了web站点的总体吞吐能力,同时也提升了可用性。须要注意,nginx目前是Http层面的负载均衡器,在1.9V以后将提供TCP层面的负载均衡支持。以下为nginx内置的负载均衡算法

    1)round-robin:轮询,request将会依次有序的分发给web server。one by one!默认使用此算法。

    2)least-connected:最小链接数,请求将会被分发给当前连接数最小的server。配置名“least_conn”。

    3)ip-hash:根据请求的客户端IP做为hashing key,来断定选择哪一个server。配置名“ip_hash”。

 

Java代码   收藏代码
  1. http {  
  2.     upstream backend {  
  3.         ##least_conn;  
  4.         server 192.168.1.110 weight=3;  
  5.         server 192.168.1.120;  
  6.     }  
  7.     server {  
  8.         listen 80 default_server;  
  9.         #  
  10.         server_name _;  
  11.         location / {  
  12.             proxy_pass http://backend;  
  13.         }  
  14.     }  
  15. }  

 

    上述配置,就是一个简单的“负载均衡”的样例,首先在一个“upstream”区块中声明server列表,而后在proxy_pass指令中使用它;若是没有声明“负载均衡”算法,那么默认就是用“round-robin”,其余可选值为“least_conn”、“ip_hash”,“负载均衡”算法须要在upstream区块的首行声明。

    “least_conn”算法可让全局的性能开支,在多个server之间趋于平衡,由于不一样的server可能在物理性能上就有差距,并且不一样的request处理耗时也不尽相同;若是但愿处理比较快的server可以尽量的接收更多的请求,那些负载较高的server也能稳步推动(后续咱们会提到流量控制),那么“least_conn”算法将很是适合。一般咱们在production环境中,均采用此算法。

 

    “least_conn”和“round-robin”算法,将会把一个客户端(来自同一个IP)的请求分发给不一样的server上,这在某些状况下并不妥,好比“粘性session”,同一个客户端的请求应该被转发给同一个server(除非此server失效后,才会被转发到其余server),不然session会话中的数据将会丢失。那么“ip_hash”算法将比较适合。不过基于残酷的现实,粘性session的设计方案并不通用。

    可以影响负载均衡策略的还有一个重要的参数:权重;“权重”用来标记某个server承载请求的“优先级”,一般权重越高的server将优先得到客户端请求,事实上“权重”也是表示一个server“承载”能力的大小,咱们一般能够对硬件配置较高的server给予较高的权重,这有点像粗颗粒的“虚拟化”,若是一个server的硬件配置是另外一个的2倍,那么能够将权重值设置为其2倍。

    默认upstream中全部的server权重都同样,那么“负载均衡”算法将平等对待它们。

 

Java代码   收藏代码
  1. upstream backend {  
  2.     server 192.168.1.110 weight=3 max_fails=3 fail_timeout=10s;  
  3.     server 192.168.1.120;  
  4.     server 192.168.1.130;  
  5. }  

 

    对于上述配置,每5个请求,将有3个分发给“192.168.1.110”,其余两个server各一个。上述提到的三种负载均衡算法中,均可以使用weight。

 

    “健康监测”对于负载均衡是必须的,这是提供可用性、“故障迁移”的必要手段。好比当某个server失效,请求未能正常处理,那么咱们应该将分发给那些“正常”的server,并将故障的server从列表中移除,直到它恢复,以免后续更多的请求处理失败。nginx当与一个server创建连接失败后,会在“fail_timeout”时间内最多尝试“max_fails”次,若是仍为失败,则将次server标记为“failed”,并从服务列表中移除。默认“max_fails”为1,若是“max_fails”为0,则表示关闭“健康检测”;“fail_timeout”(默认位10s)表示检测多久后被标记为“failed”,nginx会以优雅的方式检测那些失效的server,若是它们再次上线,则将它们标记为“alive”,便可继续提供服务。

 

    更多的关于“负载均衡”配置方式,咱们将在下文“upstream”模块中详解。

 

5、计量单位

    nginx配置文件中,对于表示“数据尺寸”的数字后,能够跟上“k”、“m”、“g”等单位缩写字母,无单位后缀表示“字节”。对于表示“时间”的数字,可使用“ms”、“s”、“m”(分钟)、h、d(天)、w(周)、M(月)、y(年),咱们还能以组合的方式使用它们,好比“1h 30m”,表示一小时30分钟,至关于“90m”或者“5400s”,无单位后缀表示“秒”。以下例:

 

Java代码   收藏代码
  1. proxy_cache_path  /home/proxy_cache_path levels=1:2 keys_zone=cache_one:64m inactive=1d max_size=30g;  

    

6、HTTPS配置

    https忽然风靡起来,就连小论坛也开始用https,显的很技术派,彷佛它的低性能的缺点并无想象的那么可怕。在实际环境中,nginx和后端的web server都可以支持htps,为了架构的简单性,以及不但愿web协议干扰程序的实现,咱们一般在nginx这一次支持https,而在web server层(好比tomcat)则继续使用http协议。配置样例以下:

Java代码   收藏代码
  1. upstream backend  
  2.  {  
  3.     server   192.168.1.110:8080;  
  4.     server   192.168.1.120:8080;  
  5.  }  
  6. server {  
  7.     listen 80;  
  8.     server_name www.example.com example.com;  
  9.     rewrite ^/(.*)$  https://$host/$1 last;  
  10.  }  
  11.    
  12. server {  
  13.     listen 443;  
  14.     server_name www.example.com example.com;  
  15.     ssl on;  
  16.     ssl_certificate      /usr/local/nginx/conf/ssl/example.com_bundle.crt;  
  17.     ssl_certificate_key  /usr/local/nginx/conf/ssl/example.com.key;  
  18.     ssl_session_cache shared:SSL:10m;  
  19.     ssl_session_timeout  5m;  
  20.     keepalive_timeout 60;  
  21.     ssl_protocols  SSLv3 TLSv1 TLSv1.2 TLSv1.1;  
  22.     ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP;  
  23.     ssl_prefer_server_ciphers   on;  
  24.   
  25.     location / {  
  26.         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;  
  27.         proxy_pass http://backend;  
  28.     }  
  29. }  

    不管如何,你在使用HTTPS以前,须要开启SSL,若是是线上应用,还须要从第三方机构购买一个合法的认证包(若是本身生成,其实并无什么卵用),这个包里将会包含crt和key两个文件,而后根据上述nginx样例将文件的路径配置正确便可,须要提醒,nginx须要有访问这两个文件的权限。

 

    SSL操做须要消耗额外的CPU资源,主要在SSL握手阶段,有2种方式能够减小每一个客户端的这种操做:1)开启连接的keepalive选项(http 1.1),那么一个客户端能够经过一个(次)连接发送多个请求,事实上达成了连接重用的目的,减小了建立连接和“握手”的次数。 2)重用SSL session参数,以免此后的子连接再进行握手操做,经过“ssl_session_cache”配置,session将会被保存在cache中,能够在workers进程之间共享,1M的cache空间能够保存大概4000个sessions,缓存生命周期默认为5分钟,能够经过“ssl_session_cache”修改。“ssl_session_cache shared:SSL:10m”表示cache能够在多个workers进程之间共享,cache名位“SSL”,缓存大小为10M(数据尺寸,不是10分钟)。

 

    上述配置,任何http请求都会被rewrite成https,不过在proxy_pass分发给后端web server时使用http协议,这是一种比较经常使用的方式,因此让你的网站支持https,只须要在nginx层作认证便可,不须要调整web server的配置。

 

7、其余

    在描述nginx的指令以前,咱们基本熟悉了nginx指令的配置方式:“<指令名称> 值 [可选参数名=参数值];”,以“;”结束,一个区块咱们能够包含多个指令,那么这种区块称为context(上线文),nginx中经常使用的区块有“http”、“events”、“server”、“upstream”、“location”等,最外层的context称之为“main”,context一般是有继承关系,好比“location”须要包含在“server”中。“#”表示行注释。 

    在nginx配置文件中,若是配置项表示路径,好比“root /data/images”,若是为相对路径,则起始与nginx根目录。

    一个指令能够被配置在多个context下,好比“root”:

Java代码   收藏代码
  1. http {  
  2.     root /data/www;  
  3.     server {  
  4.         listen 80;  
  5.         server_name localhost;  
  6.         root /data/www/html;  
  7.         location / {  
  8.               root html;  
  9.              index index.html index.htm;  
  10.         }  
  11.     }  
  12. }  

    那么根据context的继承关系,子context的指令将覆盖其父context,同理,其余指令也将是如此。

 

8、nginx常规配置模板

Java代码   收藏代码
  1. #user  www www;  
  2. worker_processes auto;  
  3. error_log  /home/wwwlogs/nginx_error.log crit;  
  4. #pid        /usr/local/nginx/nginx.pid;  
  5.   
  6. #Specifies the value for maximum file descriptors that can be opened by this process.  
  7. worker_rlimit_nofile 655350;  
  8.   
  9. events  
  10.     {  
  11.         use epoll;  
  12.         worker_connections 655350;  
  13.     }  
  14.   
  15. http  
  16.     {  
  17.         include       mime.types;  
  18.         default_type  application/octet-stream;  
  19.   
  20.         server_names_hash_bucket_size 128;  
  21.         client_header_buffer_size 32k;  
  22.         large_client_header_buffers 4 32k;  
  23.         client_max_body_size 50m;  
  24.         server_tokens off;  
  25.   
  26.         sendfile on;  
  27.         tcp_nopush     on;  
  28.   
  29.         keepalive_timeout 60;  
  30.   
  31.         tcp_nodelay on;  
  32.   
  33.         fastcgi_connect_timeout 300;  
  34.         fastcgi_send_timeout 300;  
  35.         fastcgi_read_timeout 300;  
  36.         fastcgi_buffer_size 64k;  
  37.         fastcgi_buffers 4 64k;  
  38.         fastcgi_busy_buffers_size 128k;  
  39.         fastcgi_temp_file_write_size 256k;  
  40.         proxy_connect_timeout 600;  
  41.         proxy_read_timeout 600;  
  42.         proxy_send_timeout 600;  
  43.         proxy_buffer_size 64k;  
  44.         proxy_buffers   4 32k;  
  45.         proxy_busy_buffers_size 64k;  
  46.         proxy_temp_file_write_size 64k;  
  47.           
  48.         gzip on;  
  49.         gzip_min_length  1k;  
  50.         gzip_buffers     4 16k;  
  51.         gzip_http_version 1.0;  
  52.         gzip_comp_level 2;  
  53.         gzip_types   text/plain application/x-javascript text/css application/xml text/xml application/json;  
  54.         gzip_vary on;  
  55.         log_format  access '$remote_addr - $remote_user [$time_local] $host '  
  56.                                    '"$request" $status $body_bytes_sent $request_time '  
  57.                                    '"$http_referer" "$http_user_agent" "$http_x_forwarded_for"'  
  58.                                    '$upstream_addr $upstream_status $upstream_response_time' ;  
  59.         server {  
  60.             listen 80;  
  61.             server_name  _;  
  62.             return 403;  
  63.         }  
  64.         include vhost/*.conf;  
  65. }  

    以“exmaple.org”为例,以下为基于upstream负载均衡模式的配置:

Java代码   收藏代码
  1. upstream example_backend {  
  2.           server   127.0.0.1:9080;  
  3.           server   192.168.1.198:9080;  
  4.  }  
  5. server {  
  6.         listen 80;  
  7.         server_name www.example.org example.com .example.org;  
  8.       
  9.     location / {  
  10.         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;  
  11.         proxy_pass http://example_backend;  
  12.         proxy_http_version 1.1;  
  13.         proxy_set_header Host $host;  
  14.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  15.     }  
  16.     access_log  logs/www.example.org.log;  
  17.     location ~ .*\.(gif|jpg|jpeg|png|bmp|ico|swf|xml|css|js)$ {  
  18.         proxy_pass      http://example_backend;  
  19.         proxy_set_header        Host    $host;  
  20.         proxy_set_header        X-Real-IP       $remote_addr;  
  21.         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;  
  22.         expires 15d;  
  23.     }  
  24.     location ~ .*\.(jhtml)$ {  
  25.         proxy_pass      http://example_backend;  
  26.         proxy_set_header        Host    $host;  
  27.         proxy_set_header        X-Real-IP       $remote_addr;  
  28.         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;  
  29.         expires -1;  
  30.     }  
  31. }  

    上述配置中,对后端web server返回的静态类型文件,让浏览器缓存15天,对于jhtml格式的动态文件不缓存。

9、基于HTTPS配置核心配置

Java代码   收藏代码
  1. upstream example_backend {  
  2.     server   127.0.0.1:9080;  
  3.     server   192.168.1.198:9080;  
  4.  }  
  5. server {  
  6.         listen 80;  
  7.         server_name www.example.org example.org;  
  8.         rewrite ^/(.*)$  https://$host/$1 last;  
  9.  }  
  10. server {  
  11.     listen 443;  
  12.     server_name www.example.org example.org;  
  13.   
  14.     ssl on;  
  15.     ssl_certificate      /usr/local/nginx/conf/ssl/example.crt;  
  16.     ssl_certificate_key  /usr/local/nginx/conf/ssl/example.key;  
  17.     ssl_session_timeout  5m;  
  18.     ssl_protocols  SSLv3 TLSv1 TLSv1.2 TLSv1.1;  
  19.     ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP;  
  20.     ssl_prefer_server_ciphers   on;  
  21.   
  22.     location / {  
  23.         ...  
  24.     }  
  25. }  

 

10、对于文件系统而言,基于nginx缓存的配置

Java代码   收藏代码
  1. upstream static_backend {  
  2.     server 192.168.1.198:8080;  
  3.     server 127.0.0.1:8080;  
  4. }  
  5. #设置Web缓存区名称为cache_one,内存缓存空间大小为256MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。  
  6. proxy_temp_path   /home/proxy_temp_dir;  
  7. proxy_cache_path  /home/proxy_cache_path levels=1:2 keys_zone=cache_one:256m inactive=1d max_size=30g;  
  8.   
  9. server {  
  10.     listen       80;  
  11.     server_name static.example.org;  
  12.     location / {  
  13.             proxy_next_upstream http_502 http_504 error timeout invalid_header;  
  14.             proxy_cache cache_one;#nginx本地cache开启  
  15.             proxy_cache_valid 200 304 30d;  
  16.             proxy_cache_valid 301 302 404 1m;  
  17.             proxy_cache_valid any 1m;  
  18.             proxy_cache_key $host$request_uri;  
  19.   
  20.         add_header X-Proxy-Cache $upstream_cache_status;  
  21.             proxy_set_header  Host $host;  
  22.             proxy_set_header  X-Real-IP  $remote_addr;  
  23.             proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;  
  24.             proxy_set_header X-Forwarded-For $remote_addr;  
  25.             proxy_set_header If-Modified-Since $http_if_modified_since;  
  26.   
  27.         expires 30d;#客户端缓存,在header中增长“Expires”  
  28.         add_header Cache-Control public;  
  29.         proxy_pass http://static_backend;  
  30.             if_modified_since before;  
  31.         }  
  32.     #location ~ /purge(/.*) {  
  33.         # allow 127.0.0.1;  
  34.         # allow 192.168.1.0/24;  
  35.         # deny  all;  
  36.         # proxy_cache_purge cache_one $host$1$is_args$args;  
  37.     # }  
  38.     #https://github.com/FRiCKLE/ngx_cache_purge/  
  39.     access_log  /home/wwwlogs/static.example.org.log  access;  
  40. }  

 

 



相关文章
相关标签/搜索