之前一直咕掉了, 这次把许多优质内容总结下,许多来自其他大佬的文章,底部有文章链接。
相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
支持作为 HTTP代理服务器对外进行服务。Nginx用C编写,不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验.
安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器, Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
nginx #启动nginx nginx -s reload #根据最新配置重启nginx nginx -s stop #立即停止nginx nginx -s quit #安全退出 nginx -c /特定目录/nginx.conf #以指定配置启动nginx nginx -t #检查配置是否正确 nginx -t -c /特定目录/nginx.conf #检查特定配置是否正确 nginx -v #查看版本信息
Nginx默认的配置文件主要有 main、events、http、server、location 五个块组成。其中 http 、server、location 属于嵌套关系。
语句 | 说明 |
---|---|
user nginx nginx ; | Nginx用户及组:用户 组。window下不指定 |
worker_processes 8; | 工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。 |
error_log logs/error.log; | 错误日志:存放路径。 |
pid logs/nginx.pid; | pid(进程标识符):存放路径。 |
worker_rlimit_nofile 204800; | 指定进程可以打开的最大描述符:数目。现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。 |
use epoll; | 使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。 |
worker_connections 204800; | 没个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。worker_processes*worker_connections |
keepalive_timeout 60; | keepalive超时时间。 |
client_header_buffer_size 4k; | 客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。 |
include mime.types; | 设定mime类型,类型由mime.type文件定义 |
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add$拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
#运行用户 user nobody; #工作进程数 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; #工作模式及连接数上限 events { #epoll是多路复用IO(I/O Multiplexing)中的一种方式, #仅用于linux2.6以上内核,可以大大提高nginx的性能 use epoll; #单个后台worker process进程的最大并发链接数 worker_connections 1024; } http { #设定mime类型,类型由mime.type文件定义 include mime.types; 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"'; access_log logs/access.log main; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件, #对于普通应用,必须设为 on, #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off, #以平衡磁盘与网络I/O处理速度,降低系统的uptime. sendfile on; #tcp_nopush on; #连接超时时间 #keepalive_timeout 0; keepalive_timeout 65; tcp_nodelay on; #开启gzip压缩 gzip on; gzip_disable "MSIE [1-6]."; #设定请求缓冲 client_header_buffer_size 128k; large_client_header_buffers 4 128k; #设定虚拟主机配置 server { #侦听80端口 listen 80; #定义使用 www.nginx.cn访问 server_name www.nginx.cn; #定义服务器的默认网站根目录位置 root html; #设定本虚拟主机的访问日志 access_log logs/nginx.access.log main; #默认请求 location / { #定义首页索引文件的名称 index index.php index.html index.htm; } # 定义错误提示页面 error_page 500 502 503 504 /50x.html; location = /50x.html { } #静态文件,nginx自己处理 location ~ ^/(images|javascript|js|css|flash|media|static)/ { #过期30天,静态文件不怎么更新,过期可以设大一点, #如果频繁更新,则可以设置得小一点。 expires 30d; } #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置. location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #禁止访问 .htxxx 文件 location ~ /.ht { deny all; } } }
其中location根据不同前缀的使用方式,大致分为普通location和正则location。多个正则location之间会按照先后顺序进行匹配,匹配成功后,就不会继续匹配后面定义的location。多个普通location之间遵循“最大匹配原则”,匹配度最高的location将会被执行,同时也可以利用 =精准匹配和 ^~非正则匹配可以在正则匹配之前优先匹配,禁止执行原有的正则匹配。因此 当多种类型的 location 匹配同时出现时,最终执行结果为“= ”匹配优先于"~"匹配,“~”匹配优先于正则匹配,正则匹配优先于普通的最大前缀匹配 只要优先的location 匹配成功,就不会执行其他的location 。
location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。
即:此模块专门将请求导向其他服务。
location = / { #精确匹配访问网站根目录 } location = /login { #精确匹配http://xxx.com/login }
location ^~ /static/ { #以/static打头,比如 http://xxx.com/static/jQuery.js }
location ~ \.png { #以png结尾,比如比如 http://xxx.com/img/a.png } location ~* \.png$ { #以png或者PNG或者Png等等结尾,比如比如 http://xxx.com/img/a.pNg。如果是png结尾,会优先匹配上面一条。 }
location !~ \.png$ { #匹配“以png结尾”失败,进入location,那就情况多了去了,只要不以png结尾就行 } location !~* \.xhtml$ { #匹配“以png或者PNG或者PnG等等”结尾失败,进入location,那情况也多了去了,只要不是PNG的各种大小写变体就行 }
location / { #用来兜底的,当前面其他所有的规则都不满足条件,就归入这个通用的 }
总结就是如果 p r o x y _ p a s s proxy\_pass proxy_pass 结尾加上 / / /则是绝对根路径,不会把匹配的路径部分带走,否则会带走。
nginx也提供了缓冲的机制,用于提高性能。没有缓冲的情况下,数据直接从后端服务器发送给客户端。缓冲的作用是在nginx上临时存储来自后端服务器的处理结果,从而可以提早关闭nginx到后端的连接,减少IO的损耗。一般内容存放在内存当中,但当内容过多,造成的内存不够时,会把内容存放在临时文件目录下。
需要在server中加:include config/*.conf;
跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。
对于一个大型网站来说,随着网站访问量的快速增长,单台服务器已经无法承担大量用户的并发访问,必须以增加服务器的方式,提高计算机系统的处理能力,计算速度,进而满足当前业务量的需求。那么如何实现服务器之间的协同功能呢?Nginx提供的反向代理和负载均衡功能是一个很好的解决方案。
nginx的代理过程,就是将请求发送给nginx,然后将请求转发给后端服务器,后端服务器处理完毕之后将结果再发给nginx,nginx再把结果发送给客户端。后端服务器可在远程也可在本地,也可以是nginx服务器内部定义的其他虚拟主机。这些接收nginx转发的服务器被称为上游(upstream)使用nginx做代理的目的之一是扩展基础架构的规模。nginx可以处理大量并发连接,请求到来后,nginx可将其转发给任意数量的后台服务器进行处理,这等于将负载均衡分散到整个集群。
在Nginx服务器中,反向代理的配置非常简单,最主要的指令就是“proxy_pass”,用于设置后端服务器的地址。
server { listen 80; server_name localhost; location / { proxy_pass http://localhost:9000; } }
负载均衡就是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度,带给用户更好的体验。
Nginx默认支持轮询、权重、ip Hash等多种负载均衡策略。
客户端访问nginx的时候,只需要配置一个ip和一个端口,nginx帮助我们把请求转发不同的后台服务中。
如上配置 所有 http://localhost:80的请求都会被转发到http://localhost:9000。
server { listen 80; server_name localhost; location / { proxy_pass http://web_server; } } #配置负载均衡服务器组 轮询方式 upstream web_server { server 192.168.78.128; server 192.168.78.129; }
upstream web_server1 { server 192.168.78.128 weight=1; server 192.168.78.129 weight=3; } upstream web_server2 { server 192.168.78.128 weight=1 max_fails=1 fail_timeout=2; server 192.168.78.129 weight=3; server 192.168.78.130 backup; }
按上图web_server1配置后,3/4的流量会转发到192.168.78.129的服务器上,1/4的流量会转发到192.168.78.128的服务器上,web_server2的配置表示 nginx在2s内发现后端服务异常达到max_fails次,就将该服务器标记为不可用。backup标记为预留的备份机器,当上面上个服务都宕机时,会将流量转发到备份机器。
upstream web_server1 { ip_hash; server 192.168.78.128; server 192.168.78.129; server 192.168.78.130 down; }
down参数可以将服务器标记为下线状态,在路由分配时,会忽略该服务器。
传送门1
传送门2
传送门3
传送门4