前言
Nginx是由俄罗斯软件工程师Igor Sysoev开发的一个高性能的HTTP和反向代理服务器,具备IMAP/POP3和SMTP服务器功能。Nginx最大的特点是对高并发的支持和高效的负载均衡,在高并发的需求场景下,是Apache服务器不错的替代品。目前,包括新浪、腾讯等知名网站都已使用Nginx作为Web应用服务器。本文带来的是Nginx配置与应用详解。
基础特性
基本功能
静态资源的web服务器,能缓存打开的文件描述符
反向代理服务器,缓存、负载均衡
支持FastCGI
模块化,非DSO机制,过滤器gzip,SSI和图像大小调整等
支持SSL
扩展功能
基于名称和IP做虚拟主机
支持keepalive
支持平滑配置更新或程序版本升级
定制访问日志,支持使用日志缓存以提高性能
支持url rewrite
支持路径别名
支持基于IP及用户的认证
支持速率限制,并发限制等
基本架构
一个master, 生成一个或多个worker
事件驱动:kqueue, epoll, /dev/poll
消息通知:select, poll, rt signals
支持sendfile, sendfile64
文件AIO
支持mmap
模块类别
核心模块
标准http模块
可选的http模块
邮件模块
第三方扩展模块
基本配置
虚拟主机
[root@node1 ~]# vim /etc/nginx/nginx.conf 注释掉http{}段中的预先定义的server{}段的所有内容; 在下面添加一条: include extra/nginx-vhost.conf; #个人喜好,也可以直接在 /etc/nginx/nginx.conf中配置 [root@node1 ~]# vim /etc/nginx/nginx-vhost.conf server { listen 80; server_name www.a.com; location / { root /www/a; index index.html index.htm; } } server { listen 80; server_name www.b.net; location / { root /www/b; index index.html index.htm; } }
[root@node1 ~]# echo "www.a.com" > /www/a/index.html [root@node1 ~]# echo "www.b.net" > /www/b/index.html [root@node1 ~]# service nginx start Starting nginx: [ OK ] [root@node1 ~]# vim /etc/hosts 172.16.10.123 www.a.com www.b.net[root@node1 ~]# curl http://www.a.com www.a.com [root@node1 ~]# curl http://www.b.net www.b.net
虚拟主机基本配置完成,当然虚拟主机里也可以有很多参数的,下文会提及到
访问控制
基于用户
server { listen 80; server_name www.b.net; location / { auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/.htpasswd; root /www/b; index index.html index.htm; } }
认证文件由htpasswd命令创建
[root@node1 ~]# htpasswd -mc /etc/nginx/.htpasswd tom New password: Re-type new password: Adding password for user tom root@node1 ~]# service nginx reload nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful Reloading nginx: [ OK ]
访问测试
基于IP
server { listen 80; server_name www.b.net; location / { root /www/b; index index.html index.htm; deny 172.16.10.8; allow 172.16.0.0/16; deny all } }
重启服务后访问测试
压缩功能
nginx将响应报文发送至客户端之前可以启用压缩功能,这能够有效地节约带宽,并提高响应至客户
端的速度。通常编译nginx默认会附带gzip压缩的功能,因此,可以直接启用之。
[root@node1 ~]# cp /var/log/messages /www/a/index.html #制造一个比较大的测试页
未压缩访问测试
server { listen 80; server_name www.a.com; gzip on; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/json; gzip_disable msie6; location / { root /www/a; index index.html index.htm; } }
重启服务,压缩后测试
压缩成功
防盗链
(1) 定义合规的引用
valid_referers none | blocked | server_names | string ...;
(2) 拒绝不合规的引用
if ($invalid_referer) { rewrite ^/.*$ http://www.b.org/403.html }
location ~* \.(jpg|png|gif|jpeg)$ { root /www/b; valid_referers none blocked www.b.net *.b.net; if ($valid_referer) { rewrite ^/ http://www.b.net/403.html; } }
[root@node1 ~]# vim /www/a/index.html #在a.com中引用 [root@node1 ~]# vim /www/b/index.html #b.net自己引用 [root@node1 ~]# service nginx reload
访问测试
URL rewrite
rewrite regex replacement [flag]; flag: last: 一旦被当前规则匹配并重写后立即停止检查后续的其它rewrite的规则,而后通过重写后的规则重新发起请求; break: 一旦被当前规则匹配并重写后立即停止后续的其它rewrite的规则,而后继续由nginx进行后续操作; redirect: 返回302临时重定向; permanent: 返回301永久重定向;
location /download/ { root /www/b; autoindex on; rewrite ^/download/(.*\.(jpg|png|gif|jpeg))$ /p_w_picpaths/&1 last; } [root@node1 ~]# service nginx reload [root@node1 ~]# ls /www/b/download/ #download目录下没有任何文件
反向代理
Nginx通过proxy模块实现反向代理功能。在作为web反向代理服务器时,nginx负责接收客户请求,并能够根据URI、客户端参数或其它的处理逻辑将用户请求调度至上游服务器上(upstream server)。
nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location定义的某URI代理至指定
的上游服务器(组)上。如下面的示例中,location的/uri将被替换为上游服务器上的/newuri。
server { listen 80; server_name www.a.com; add_header X-Via $server_addr; location / { root /www/a; index index.html index.htm; } location = /node2 { proxy_pass http://172.16.10.124/; } } #上游主机也要配置相应服务及页面
[root@node1 ~]# vim /etc/nginx/nginx-vhost.conf [root@node1 ~]# vim /etc/nginx/nginx-vhost.conf [root@node1 ~]# curl http://www.a.com www.a.com [root@node1 ~]# curl http://www.a.com/node2 172.16.10.124
缓存
nginx做为反向代理时,能够将来自上游服务器的响应缓存至本地,并在后续的客户端请求同样内容时
直接从本地构造响应报文。
proxy_cache zone|off:定义一个用于缓存的共享内存区域,其可被多个地方调用; proxy_cache_path:定义一个用记保存缓存响应报文的目录,及一个保存缓存对象的键及响应元数 据的共享内存区域(keys_zone=name:size),其可选参数有: levels:每级子目录名称的长度,有效值为1或2,每级之间使用冒号分隔,最多为3级; inactive:非活动缓存项从缓存中剔除之前的最大缓存时长; max_size:缓存空间大小的上限,当需要缓存的对象超出此空间限定时,缓存管理器将基于LRU算法 对其进行清理; loader_files:缓存加载器(cache_loader)的每次工作过程最多为多少个文件加载元数据; loader_sleep:缓存加载器的每次迭代工作之后的睡眠时长; loader_threashold:缓存加载器的最大睡眠时长; proxy_cache_valid [ code ...] time:用于为不同的响应设定不同时长的有效缓存时长,例如: proxy_cache_valid 200 302 10m; proxy_cache_methods [GET HEAD POST]:为哪些请求方法启用缓存功能; proxy_cache_bypass string:设定在哪种情形下,nginx将不从缓存中取数据
http { proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g; server { listen 80; server_name node1; add_header X-Via $server_addr; location / { root /www/b; index index.html index.htm; proxy_pass http://172.16.10.124; proxy_set_header Host $host; proxy_cache STATIC; proxy_cache_valid 200 1d; proxy_cache_valid 301 302 10m; proxy_cache_valid any 1m; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; } } }
缓存前请求时间
缓存后请求时间
此时缓存目录应该有缓存文件生成
[root@node1 ~]# ll /data/nginx/cache/ total 4 drwx------ 3 nginx nginx 4096 Jun 13 22:44 e
负载均衡
nginx可利用自身的upstream模块实现,upstream模块的负载均衡算法主要有三种,轮调(round-robin)、ip哈希(ip_hash)和最少连接(least_conn)三种。
upstream模块常用的指令有: ip_hash:基于客户端IP地址完成请求的分发,它可以保证来自于同一个客户端的请求始终被转发至 同一个upstream服务器; keepalive:每个worker进程为发送到upstream服务器的连接所缓存的个数; least_conn:最少连接调度算法; server:定义一个upstream服务器的地址,还可包括一系列可选参数,如: weight:权重; max_fails:最大失败连接次数,失败连接的超时时长由fail_timeout指定; fail_timeout:等待请求的目标服务器发送响应的时长; backup:用于fallback的目的,所有服务均故障时才启动此服务器; down:手动标记其不再处理任何请求;
upstream web { server 172.16.10.124:80; server 172.16.10.125:80; server 127.0.0.1:8080 backup; } server { listen 80; server_name www.b.net; add_header X-Via $server_addr; location / { root /www/b; index index.html index.htm; proxy_pass http://web; } } server { listen 8080; server_name 127.0.0.1; root /www/backup; }
[root@node1 ~]# mkdir /www/backup [root@node1 ~]# echo "Sorry" > /www/backup/index.html [root@node1 ~]# service nginx reload [root@node1 ~]# curl http://172.16.10.123 172.16.10.124 [root@node1 ~]# curl http://172.16.10.123 172.16.10.125 #停掉上游两台主机后 [root@node1 ~]# curl http://172.16.10.123 Sorry
如此便可实现简单的负载均衡功能
The end
好了,有关nginx的基础配置及应用就先说到这里了,第一次接触nginx,写的比较乱,敬请谅解。有什么不对的地方欢迎留言告诉我。以上仅为个人学习整理,如有错漏,大神勿喷~~~