设为首页 收藏本站
查看: 1065|回复: 0

[经验分享] Nginx配置与应用详解

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-6-15 10:17:54 | 显示全部楼层 |阅读模式

前言

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模块

邮件模块

第三方扩展模块

基本配置
虚拟主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[iyunv@node1 ~]# vim /etc/nginx/nginx.conf
注释掉http{}段中的预先定义的server{}段的所有内容;
在下面添加一条:
include extra/nginx-vhost.conf;
#个人喜好,也可以直接在 /etc/nginx/nginx.conf中配置
[iyunv@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;
    }
}



1
2
3
4
5
6
7
8
9
[iyunv@node1 ~]# echo "www.a.com" > /www/a/index.html
[iyunv@node1 ~]# echo "www.b.net" > /www/b/index.html
[iyunv@node1 ~]# service nginx start
Starting nginx:                                            [  OK  ]
[iyunv@node1 ~]# vim /etc/hosts
172.16.10.123 www.a.com www.b.net[iyunv@node1 ~]# curl http://www.a.com
www.a.com
[iyunv@node1 ~]# curl http://www.b.net
www.b.net



虚拟主机基本配置完成,当然虚拟主机里也可以有很多参数的,下文会提及到

访问控制

基于用户

1
2
3
4
5
6
7
8
9
10
11
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命令创建

1
2
3
4
5
6
7
8
[iyunv@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  ]



访问测试

wKiom1V70lvynxDoAAFgUoqXc9c536.jpg

基于IP

1
2
3
4
5
6
7
8
9
10
11
12
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
    }
}



重启服务后访问测试

wKioL1V71ZPBcli7AADCmnmZkP4351.jpg

压缩功能


nginx将响应报文发送至客户端之前可以启用压缩功能,这能够有效地节约带宽,并提高响应至客户

端的速度。通常编译nginx默认会附带gzip压缩的功能,因此,可以直接启用之。

1
[iyunv@node1 ~]# cp /var/log/messages /www/a/index.html #制造一个比较大的测试页



未压缩访问测试

wKioL1V723KT_XiFAANYmh6ZizU522.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
    }
}



重启服务,压缩后测试

wKiom1V72xfRT_dBAANye0vdy3o701.jpg

压缩成功

防盗链


(1) 定义合规的引用

1
valid_referers none | blocked | server_names | string ...;



(2) 拒绝不合规的引用

1
2
3
if  ($invalid_referer) {
rewrite ^/.*$ http://www.b.org/403.html
}



1
2
3
4
5
6
7
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;
        }
}



1
2
3
4
5
6
7
8
9
[iyunv@node1 ~]# vim /www/a/index.html

<img src="http://www.b.net/images/1.jpg">  #在a.com中引用

[iyunv@node1 ~]# vim /www/b/index.html   

<img src="http://www.b.net/images/1.jpg">  #b.net自己引用

[iyunv@node1 ~]# service nginx reload



访问测试

wKiom1V8B7nijsxTAAFLVSM_siw926.jpg

wKioL1V8CW_ROibyAACHOiNA5ws956.jpg

URL rewrite

1
2
3
4
5
6
7
rewrite regex replacement [flag];

flag:
last: 一旦被当前规则匹配并重写后立即停止检查后续的其它rewrite的规则,而后通过重写后的规则重新发起请求;
break: 一旦被当前规则匹配并重写后立即停止后续的其它rewrite的规则,而后继续由nginx进行后续操作;
redirect: 返回302临时重定向;
permanent: 返回301永久重定向;



1
2
3
4
5
6
7
8
location /download/ {
   root /www/b;
   autoindex on;
   rewrite ^/download/(.*\.(jpg|png|gif|jpeg))$ /images/&1 last;
}

[iyunv@node1 ~]# service nginx reload
[iyunv@node1 ~]# ls /www/b/download/  #download目录下没有任何文件



wKiom1V8FgmCPL_9AAFWPG2DIX8515.jpg

反向代理


Nginx通过proxy模块实现反向代理功能。在作为web反向代理服务器时,nginx负责接收客户请求,并能够根据URI、客户端参数或其它的处理逻辑将用户请求调度至上游服务器上(upstream server)。

nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location定义的某URI代理至指定

的上游服务器(组)上。如下面的示例中,location的/uri将被替换为上游服务器上的/newuri。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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/;
    }
}
#上游主机也要配置相应服务及页面



1
2
3
4
5
6
7
8
[iyunv@node1 ~]# vim /etc/nginx/nginx-vhost.conf

[iyunv@node1 ~]# vim /etc/nginx/nginx-vhost.conf
[iyunv@node1 ~]# curl http://www.a.com
www.a.com
<img src="http://www.b.net/images/1.jpg">
[iyunv@node1 ~]# curl http://www.a.com/node2
172.16.10.124



缓存


nginx做为反向代理时,能够将来自上游服务器的响应缓存至本地,并在后续的客户端请求同样内容时

直接从本地构造响应报文。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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将不从缓存中取数据



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;

  }
}
}



缓存前请求时间

wKioL1V8Q_Hx3nHnAAFb7yk1qcE286.jpg

缓存后请求时间

wKiom1V8QmOxfT-nAAFaTOlFjpg118.jpg

此时缓存目录应该有缓存文件生成

1
2
3
[iyunv@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)三种。

1
2
3
4
5
6
7
8
9
10
11
upstream模块常用的指令有:
ip_hash:基于客户端IP地址完成请求的分发,它可以保证来自于同一个客户端的请求始终被转发至
同一个upstream服务器;
keepalive:每个worker进程为发送到upstream服务器的连接所缓存的个数;
least_conn:最少连接调度算法;
server:定义一个upstream服务器的地址,还可包括一系列可选参数,如:
    weight:权重;
    max_fails:最大失败连接次数,失败连接的超时时长由fail_timeout指定;
    fail_timeout:等待请求的目标服务器发送响应的时长;
    backup:用于fallback的目的,所有服务均故障时才启动此服务器;
    down:手动标记其不再处理任何请求;



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
}



1
2
3
4
5
6
7
8
9
10
[iyunv@node1 ~]# mkdir /www/backup
[iyunv@node1 ~]# echo "Sorry" > /www/backup/index.html
[iyunv@node1 ~]# service nginx reload
[iyunv@node1 ~]# curl http://172.16.10.123
172.16.10.124
[iyunv@node1 ~]# curl http://172.16.10.123
172.16.10.125
#停掉上游两台主机后
[iyunv@node1 ~]# curl http://172.16.10.123
Sorry



如此便可实现简单的负载均衡功能

The end

好了,有关nginx的基础配置及应用就先说到这里了,第一次接触nginx,写的比较乱,敬请谅解。有什么不对的地方欢迎留言告诉我。以上仅为个人学习整理,如有错漏,大神勿喷~~~



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-77444-1-1.html 上篇帖子: ubuntu14.04上安装Nginx1.8.0+php5-fpm 下篇帖子: bash切割nginx日志
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表