什么是Nginx
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协定下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中体现较好,中国大陆应用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等
Nginx的次要作用又是什么
1. 负载平衡
负载平衡是高可用网络基础架构的要害组件,通常用于将工作负载散布到多个服务器来进步网站、利用、数据库或其余服务的性能和可靠性
上图来解释一下吧
比方我本人创立了一个网站,分享一些学习心得之类的货色,一开始的时候拜访数量少,那么一台服务器就能够撑持,然而起初有一天我忽然成为大明星,那么这时候有很多人想要拜访我的网站,慢慢的一台服务器不足以解决大量的申请,这时候就须要减少服务器来减缓压力,如果我减少了两台服务器,我不能让拜访的人须要记住3个域名吧,就比方百度,他也有很多台服务器,然而咱们只须要记住百度就能够了,那么这是怎末做到的呢?
这个时候呢我就能够在搭建一台新的Nginx服务器,让所有的申请都先来拜访Nginx服务器,而后在由Nginx派发解决申请到其余服务器上Nginx是不解决申请的,他只是依据不同的策略来派发到不同的服务器上
,这样是不是就解决了问题,用户只须要记住一个域名,而且申请量增大的时候也不会导致服务器宕机
1.1 负载平衡策略
从下面咱们晓得了Nginx是能够依据不同的策略来派发解决申请的,那么都有什么策略呢?
轮询(默认)
每个申请按工夫程序逐个调配到不同的后端服务器,如果后端服务器宕机,能主动剔除
指定权重
指定轮询几率,weight和拜访比率成正比,用于后端服务器性能不均的状况
ip_hash
指定负载均衡器依照基于客户端IP的调配形式,这个办法确保了雷同的客户端的申请始终发送到雷同的服务器,以保障session会话。这样每个访客都固定拜访一个后端服务器,能够解决session不能跨服务器的问题
least_conn(最小连接数)
把申请转发给连接数较少的后端服务器。轮询算法是把申请均匀的转发给各个后端,使它们的负载大致相同;然而,有些申请占用的工夫很长,会导致其所在的后端负载较高。这种状况下,least_conn这种形式就能够达到更好的负载平衡成果
第三方策略 第三方的负载平衡策略的实现须要装置第三方插件
fair
依照服务器端的响应工夫来调配申请,响应工夫短的优先调配
url_hash
拜访url的hash后果来调配申请,使每个url定向到同一个后端服务器,要配合缓存命中来应用。同一个资源屡次申请,可能会达到不同的服务器上,导致不必要的屡次下载,缓存命中率不高,以及一些资源工夫的节约。而应用url_hash,能够使得同一个url(也就是同一个资源申请)会达到同一台服务器,一旦缓存住了资源,再此收到申请,就能够从缓存中读取
1.2 负载平衡策略的配置文件
- 轮询 这个的作用就是服务器的一个汇合,所有会被Nginx派发工作的服务器在这里配置 upstream是固定值 nodes 这个是随便的名字然而要跟上面的server.ocation.proxy_pass 中http后的名字统一 upstream nodes { server 192.168.1.11; server 192.168.1.12; } server { listen 80; //监听的端口号 server_name 127.0.0.1; //Nginx 服务器地址 location / { // / 示意所有的申请 proxy_pass http://nodes; //被转发的服务器地址 } - 权重 upstream nodes { server 192.168.1.11 weight=3; //weight 默认值是1数值越大,代表被被拜访的次数也会越多 server 192.168.1.12 weight=10; } server { listen 80; //监听的端口号 server_name 127.0.0.1; //Nginx 服务器地址 location / { // / 示意所有的申请 proxy_pass http://nodes; //被转发的服务器地址 } - least_conn(最小连接数) upstream nodes { least_conn; //请连接数较少的后端服务器 server 192.168.1.11; //weight 默认值是1数值越大,代表被被拜访的次数也会越多 server 192.168.1.12; } server { listen 80; //监听的端口号 server_name 127.0.0.1; //Nginx 服务器地址 location / { // / 示意所有的申请 proxy_pass http://nodes; //被转发的服务器地址 } - ip_hash upstream nodes { ip_hash; //申请按拜访ip的hash后果调配 server 192.168.1.11; //weight 默认值是1数值越大,代表被被拜访的次数也会越多 server 192.168.1.12; } server { listen 80; //监听的端口号 server_name 127.0.0.1; //Nginx 服务器地址 location / { // / 示意所有的申请 proxy_pass http://nodes; //被转发的服务器地址 } - fair upstream nodes { server 192.168.1.11; //weight 默认值是1数值越大,代表被被拜访的次数也会越多 server 192.168.1.12; fair;//后端服务器的响应工夫来调配申请,响应工夫短的优先调配 } server { listen 80; //监听的端口号 server_name 127.0.0.1; //Nginx 服务器地址 location / { // / 示意所有的申请 proxy_pass http://nodes; //被转发的服务器地址 } - url_hash upstream nodes { server 192.168.1.11; //weight 默认值是1数值越大,代表被被拜访的次数也会越多 server 192.168.1.12; hash $request_uri; hash_method crc32;//按拜访url的hash后果来调配申请,使每个url定向到同一个后端服务器 } server { listen 80; //监听的端口号 server_name 127.0.0.1; //Nginx 服务器地址 location / { // / 示意所有的申请 proxy_pass http://nodes; //被转发的服务器地址 }
以上文件都是在nginx.conf外面配置
反向代理
代理:在Java设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象管制原对象的援用
在说反向代理前先说一下什么是正向代理?
1.1 正向代理
举个例子阐明一下吧 ,有一天我要去理发,而后我到了理发店之后说,我要找王Tony给我理发 其实这就是正向代理,明确的晓得本人的指标是什么
1.2 反向代理
还是举个例子,我还是去理发店理发,不过我是第一次来,我说给我理个最便宜的,这时候我并不知道谁要来给我理发,然而只有能给理发就能够了 这就是反向代理,我不关怀解决申请的是谁,你只有把我要的后果给我就好了
反向代理和正向代理的区别就是,正向代理客户端,反向代理服务器
反向代理的配置
server { listen 80; server_name localhost; //Nginx 地址 location / { proxy_pass http://123.123.123.123.com //要代理的服务器地址 index index.html index.htm index.jsp; } }
配置完这个当前,重启Nginx 在浏览器中输出localhost:80(80能够不必输出),就能够间接拜访到服务器了
这就是反向代理
Nginx 配置文件的根本配置
user nginx nginx ;Nginx用户及组:用户 组。window下不指定worker_processes 8;工作过程:数目。依据硬件调整,通常等于CPU数量或者2倍于CPU。error_log logs/error.log; error_log logs/error.log notice; error_log logs/error.log info; 谬误日志:寄存门路。pid logs/nginx.pid;pid(过程标识符):寄存门路。worker_rlimit_nofile 204800;指定过程能够关上的最大描述符:数目。这个指令是指当一个nginx过程关上的最多文件描述符数目,理论值应该是最多关上文件数(ulimit -n)与nginx过程数相除,然而nginx调配申请并不是那么平均,所以最好与ulimit -n 的值保持一致。当初在linux 2.6内核下开启文件关上数为65535,worker_rlimit_nofile就相应应该填写65535。这是因为nginx调度时调配申请到过程并不是那么的平衡,所以如果填写10240,总并发量达到3-4万时就有过程可能超过10240了,这时会返回502谬误。events{use epoll;应用epoll的I/O 模型。linux倡议epoll,FreeBSD倡议采纳kqueue,window下不指定。补充阐明:与apache相类,nginx针对不同的操作系统,有不同的事件模型A)规范事件模型Select、poll属于规范事件模型,如果以后零碎不存在更无效的办法,nginx会抉择select或pollB)高效事件模型Kqueue:应用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.应用双处理器的MacOS X零碎应用kqueue可能会造成内核解体。Epoll:应用于Linux内核2.6版本及当前的零碎。/dev/poll:应用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。Eventport:应用于Solaris 10。 为了防止出现内核解体的问题, 有必要装置安全补丁。worker_connections 204800;没个工作过程的最大连贯数量。依据硬件调整,和后面工作过程配合起来用,尽量大,然而别把cpu跑到100%就行。每个过程容许的最多连接数,实践上每台nginx服务器的最大连接数为。worker_processes*worker_connectionskeepalive_timeout 60;keepalive超时工夫。client_header_buffer_size 4k;客户端申请头部的缓冲区大小。这个能够依据你的零碎分页大小来设置,个别一个申请头的大小不会超过1k,不过因为个别零碎分页都要大于1k,所以这里设置为分页大小。分页大小能够用命令getconf PAGESIZE 获得。[root@web001 ~]# getconf PAGESIZE4096但也有client_header_buffer_size超过4k的状况,然而client_header_buffer_size该值必须设置为“零碎分页大小”的整倍数。open_file_cache max=65535 inactive=60s;这个将为关上文件指定缓存,默认是没有启用的,max指定缓存数量,倡议和关上文件数统一,inactive是指通过多长时间文件没被申请后删除缓存。open_file_cache_valid 80s;这个是指多长时间查看一次缓存的无效信息。open_file_cache_min_uses 1;open_file_cache指令中的inactive参数工夫内文件的起码应用次数,如果超过这个数字,文件描述符始终是在缓存中关上的,如上例,如果有一个文件在inactive工夫内一次没被应用,它将被移除。}##设定http服务器,利用它的反向代理性能提供负载平衡反对http{include mime.types;设定mime类型,类型由mime.type文件定义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"';log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';日志格局设置。$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;$remote_user:用来记录客户端用户名称;$time_local: 用来记录拜访工夫与时区;$request: 用来记录申请的url与http协定;$status: 用来记录申请状态;胜利是200,$body_bytes_sent :记录发送给客户端文件主体内容大小;$http_referer:用来记录从那个页面链接拜访过去的;$http_user_agent:记录客户浏览器的相干信息;通常web服务器放在反向代理的前面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发申请的http头信息中,能够减少x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的申请的服务器地址。access_log logs/host.access.log main;access_log logs/host.access.404.log log404;用了log_format指令设置了日志格局之后,须要用access_log指令指定日志文件的寄存门路;server_names_hash_bucket_size 128;#保留服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所管制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在缩小了在内存中的存取次数后,使在处理器中减速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的状况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因而,如果Nginx给出须要增大hash max size 或 hash bucket size的提醒,那么首要的是增大前一个参数的大小.client_header_buffer_size 4k;客户端申请头部的缓冲区大小。这个能够依据你的零碎分页大小来设置,个别一个申请的头部大小不会超过1k,不过因为个别零碎分页都要大于1k,所以这里设置为分页大小。分页大小能够用命令getconf PAGESIZE获得。large_client_header_buffers 8 128k;客户申请头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会应用large_client_header_buffers来读取。open_file_cache max=102400 inactive=20s;这个指令指定缓存是否启用。例: open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;open_file_cache_errors语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 应用字段:http, server, location 这个指令指定是否在搜寻一个文件是记录cache谬误.open_file_cache_min_uses语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 应用字段:http, server, location 这个指令指定了在open_file_cache指令有效的参数中肯定的工夫范畴内能够应用的最小文件数,如果应用更大的值,文件描述符在cache中总是关上状态.open_file_cache_valid语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 应用字段:http, server, location 这个指令指定了何时须要查看open_file_cache中缓存我的项目的无效信息.client_max_body_size 300m;设定通过nginx上传文件的大小sendfile on;sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 形式)来输入文件,对于一般利用,必须设为on。如果用来进行下载等利用磁盘IO重负载利用,可设置为off,以均衡磁盘与网络IO处理速度,升高零碎uptime。tcp_nopush on;此选项容许或禁止应用socke的TCP_CORK的选项,此选项仅在应用sendfile的时候应用proxy_connect_timeout 90; 后端服务器连贯的超时工夫_发动握手等待响应超时工夫proxy_read_timeout 180;连贯胜利后_等待后端服务器响应工夫_其实曾经进入后端的排队之中等待解决(也能够说是后端服务器解决申请的工夫)proxy_send_timeout 180;后端服务器数据回传工夫_就是在规定工夫之内后端服务器必须传完所有的数据proxy_buffer_size 256k;设置从被代理服务器读取的第一局部应答的缓冲区大小,通常状况下这部分应答中蕴含一个小的应答头,默认状况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过能够将其设置为更小proxy_buffers 4 256k;设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认状况也为分页大小,依据操作系统的不同可能是4k或者8kproxy_busy_buffers_size 256k;proxy_temp_file_write_size 256k;设置在写入proxy_temp_path时数据的大小,预防一个工作过程在传递文件时阻塞太长proxy_temp_path /data0/proxy_temp_dir;proxy_temp_path和proxy_cache_path指定的门路必须在同一分区proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;#设置内存缓存空间大小为200MB,1天没有被拜访的内容主动革除,硬盘缓存空间大小为30GB。keepalive_timeout 120;keepalive超时工夫。tcp_nodelay on;client_body_buffer_size 512k;如果把它设置为比拟大的数值,例如256k,那么,无论应用firefox还是IE浏览器,来提交任意小于256k的图片,都很失常。如果正文该指令,应用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就呈现了。无论应用firefox4.0还是IE8.0,提交一个比拟大,200k左右的图片,都返回500 Internal Server Error谬误proxy_intercept_errors on;示意使nginx阻止HTTP应答代码为400或者更高的应答。upstream bakend {server 127.0.0.1:8027;server 127.0.0.1:8028;server 127.0.0.1:8029;hash $request_uri;}nginx的upstream目前反对4种形式的调配1、轮询(默认)每个申请按工夫程序逐个调配到不同的后端服务器,如果后端服务器down掉,能主动剔除。2、weight指定轮询几率,weight和拜访比率成正比,用于后端服务器性能不均的状况。例如:upstream bakend {server 192.168.0.14 weight=10;server 192.168.0.15 weight=10;}2、ip_hash每个申请按拜访ip的hash后果调配,这样每个访客固定拜访一个后端服务器,能够解决session的问题。例如:upstream bakend {ip_hash;server 192.168.0.14:88;server 192.168.0.15:80;}3、fair(第三方)按后端服务器的响应工夫来调配申请,响应工夫短的优先调配。upstream backend {server server1;server server2;fair;}4、url_hash(第三方)按拜访url的hash后果来调配申请,使每个url定向到同一个后端服务器,后端服务器为缓存时比拟无效。例:在upstream中退出hash语句,server语句中不能写入weight等其余的参数,hash_method是应用的hash算法upstream backend {server squid1:3128;server squid2:3128;hash $request_uri;hash_method crc32;}tips:upstream bakend{#定义负载平衡设施的Ip及设施状态}{ip_hash;server 127.0.0.1:9090 down;server 127.0.0.1:8080 weight=2;server 127.0.0.1:6060;server 127.0.0.1:7070 backup;}在须要应用负载平衡的server中减少proxy_pass http://bakend/;每个设施的状态设置为:1.down示意单前的server临时不参加负载2.weight为weight越大,负载的权重就越大。3.max_fails:容许申请失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的谬误4.fail_timeout:max_fails次失败后,暂停的工夫。5.backup: 其它所有的非backup机器down或者忙的时候,申请backup机器。所以这台机器压力会最轻。nginx反对同时设置多组的负载平衡,用来给不必的server来应用。client_body_in_file_only设置为On 能够讲client post过去的数据记录到文件中用来做debugclient_body_temp_path设置记录文件的目录 能够设置最多3层目录location对URL进行匹配.能够进行重定向或者进行新的代理 负载平衡##配置虚拟机server{listen 80;配置监听端口server_name image.***.com;配置拜访域名location ~* \.(mp3|exe)$ {对以“mp3或exe”结尾的地址进行负载平衡proxy_pass http://img_relay$request_uri;设置被代理服务器的端口或套接字,以及URLproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;以上三行,目标是将代理服务器收到的用户的信息传到实在服务器上}location /face {if ($http_user_agent ~* "xnp") {rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;}proxy_pass http://img_relay$request_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;error_page 404 502 = @fetch;}location @fetch {access_log /data/logs/face.log log404;rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;}location /image {if ($http_user_agent ~* "xnp") {rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;}proxy_pass http://img_relay$request_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;error_page 404 502 = @fetch;}location @fetch {access_log /data/logs/image.log log404;rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;}}##其余举例server{listen 80;server_name *.***.com *.***.cn;location ~* \.(mp3|exe)$ {proxy_pass http://img_relay$request_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;}location / {if ($http_user_agent ~* "xnp") {rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;}proxy_pass http://img_relay$request_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;#error_page 404 http://i1.***img.com/help/noimg.gif;error_page 404 502 = @fetch;}location @fetch {access_log /data/logs/baijiaqi.log log404;rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;}}server{listen 80;server_name *.***img.com;location ~* \.(mp3|exe)$ {proxy_pass http://img_relay$request_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;}location / {if ($http_user_agent ~* "xnp") {rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif;}proxy_pass http://img_relay$request_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;#error_page 404 http://i1.***img.com/help/noimg.gif;error_page 404 = @fetch;}#access_log off;location @fetch {access_log /data/logs/baijiaqi.log log404;rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;}}server{listen 8080;server_name ngx-ha.***img.com;location / {stub_status on;access_log off;}}server {listen 80;server_name imgsrc1.***.net;root html;}server {listen 80;server_name ***.com w.***.com;# access_log /usr/local/nginx/logs/access_log main;location / {rewrite ^(.*)$ http://www.***.com/ ;}}server {listen 80;server_name *******.com w.*******.com;# access_log /usr/local/nginx/logs/access_log main;location / {rewrite ^(.*)$ http://www.*******.com/;}}server {listen 80;server_name ******.com;# access_log /usr/local/nginx/logs/access_log main;location / {rewrite ^(.*)$ http://www.******.com/;}}location /NginxStatus {stub_status on;access_log on;auth_basic "NginxStatus";auth_basic_user_file conf/htpasswd;}#设定查看Nginx状态的地址location ~ /\.ht {deny all;}#禁止拜访.htxxx文件}正文:变量Ngx_http_core_module模块反对内置变量,他们的名字和apache的内置变量是统一的。首先是阐明客户申请title中的行,例如$http_user_agent,$http_cookie等等。此外还有其它的一些变量$args此变量与申请行中的参数相等$content_length等于申请行的“Content_Length”的值。$content_type等同与申请头部的”Content_Type”的值$document_root等同于以后申请的root指令指定的值$document_uri与$uri一样$host与申请头部中“Host”行指定的值或是request达到的server的名字(没有Host行)一样$limit_rate容许限度的连贯速率$request_method等同于request的method,通常是“GET”或“POST”$remote_addr客户端ip$remote_port客户端port$remote_user等同于用户名,由ngx_http_auth_basic_module认证$request_filename以后申请的文件的路径名,由root或alias和URI request组合而成$request_body_file$request_uri含有参数的残缺的初始URI$query_string与$args一样$sheeme http模式(http,https)尽在要求是评估例如Rewrite ^(.+)$ $sheme://example.com$; Redirect;$server_protocol等同于request的协定,应用“HTTP/或“HTTP/$server_addr request达到的server的ip,个别取得此变量的值的目标是进行零碎调用。为了防止零碎调用,有必要在listen指令中指明ip,并应用bind参数。$server_name申请达到的服务器名$server_port申请达到的服务器的端口号$uri等同于以后request中的URI,可不同于初始值,例如外部重定向时或应用index
明天就说到这里吧