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

[经验分享] nginx基础应用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-19 10:17:55 | 显示全部楼层 |阅读模式
nginx简介
nginx是一款轻量级的web服务器和反向代理服务器,不同于传统的通过每进程或每线程处理并发连接请求的web服务器,nginx采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制,通过单线程进程worker以高效的回环(run-loop)机制并行处理数千个并发连接请求。
nginx的工作模式:一个主进程(master)和多个工作进程(worker),master以root身份运行,worker以普通用户身份运行(nginx)。工作进程worker为单线程进程,进程与进程之间通过“共享内存”的机制实现通信。

nginx的代码由一个核心和一系列的模块组成。这一系列模块包括标准http模块,可选http模块,邮件模块及第三方扩展模块。在编译过程中核心模块和标准http模块,其余需要的模块需要手动指定。

安装nginx
1)添加nginx用户,工作进程以该用户的身份运行。
1
2
[iyunv@node1 ~]# groupadd -r nginx
[iyunv@node1 ~]# useradd -r -g nginx nginx



2)从官网http://nginx.org下载适合的包,根据自己需要的功能编译安装。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[iyunv@node1 ~]# tar xf nginx-1.8.0.tar.gz
[iyunv@node1 ~]# cd nginx-1.8.0
[iyunv@node1 nginx-1.8.0]#   --prefix=/usr/local/nginx \
>   --conf-path=/etc/nginx/nginx.conf \
>   --error-log-path=/var/log/nginx/error.log \
>   --http-log-path=/var/log/nginx/access.log \
>   --pid-path=/var/run/nginx/nginx.pid  \
>   --lock-path=/var/lock/nginx.lock \
>   --user=nginx \
>   --group=nginx \
>   --with-http_ssl_module \
>   --with-http_flv_module \
>   --with-http_stub_status_module \
>   --with-http_gzip_static_module \
>   --http-client-body-temp-path=/usr/local/nginx/client/ \
>   --http-proxy-temp-path=/usr/local/nginx/proxy/ \
>   --http-fastcgi-temp-path=/usr/local/nginx/fcgi/ \
>   --http-uwsgi-temp-path=/usr/local/nginx/uwsgi \
>   --http-scgi-temp-path=/usr/local/nginx/scgi \
>   --with-pcre
####################################
[iyunv@node1 nginx-1.8.0]# make && make install



3)为nginx提供SysV init脚本(简单起见可以从epel源安装的nginx中获取)
1
2
[iyunv@node1 nginx-1.8.0]# chmod +x /etc/rc.d/init.d/nginx
[iyunv@node1 nginx-1.8.0]# chkconfig --add nginx



4)检查配置文件,启动服务。
1
2
3
4
[iyunv@node1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[iyunv@node1 ~]# service nginx start




基本应用
虚拟主机
在server中定义虚拟服务器的相关属性,常见的指令有backlog、rcvbuf、bind及sndbuf等。不同于apache,nginx没有中心主机的概念,所有的服务都需要定义在虚拟主机中。

1
2
3
4
5
6
7
8
9
server {
   listen       80;
   server_name  www.xiaoxiao.com;

   location / {
       root   /www;
       index  index.html index.htm;
    }
}




访问控制,用户认证

访问控制功能由Access模块提供,allow和deny允许在http、server、location上下文中进行配置。在匹配过程中,由上而下进行匹配。如下示例,若需要对192.168.1.0这个网段中的192.168.1.1这台主机的访问进行限制,需要将deny 192.168.1.1写在allow 192.168.1.0/24之前,若写在后面,会先与allow 192.168.1.0/24进行匹配,匹配通过之后将直接允许访问。

1
2
3
4
5
6
7
location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}



用户认证功能由Auth Basic模块提供。对某些敏感目录需要限制用户的访问,示例如下:

1
2
3
4
5
6
   location /admin {
            root   /www;
            index  index.html index.htm;
            auth_basic "admin dir";
            auth_basic_user_file /etc/nginx/.htpasswd;
        }



auth_basic_user_file指定认证文件,通过htpasswd命令可生成该文件。
1
2
[iyunv@node1 nginx]# htpasswd -m -c /etc/nginx/.htpasswd shaw    #生成认证问价,添加用户
[iyunv@node1 nginx]# htpasswd -m /etc/nginx/.htpasswd Tom     #添加用户



wKioL1XSdwbTPVg1AADs5mv59CU012.jpg

autoindex模块
当访问的路径下没有默认页面时,可以通过添加autoindex on这一项,显示改路径下的所有文件。
1
2
3
4
5
location /download {
            root /www;
            index  index.html index.htm;
            autoindex on;
        }



wKiom1XSdq2gP3huAADvHuO8PiQ607.jpg

压缩
将nginx响应给客户端的报文进行压缩,能够节约带宽并提高响应速度。要使用压缩功能,需要在编译安装时添加Gzip Precompression模块(--with-http_gzip_static_module)。
1
2
3
4
5
6
7
8
9
server {
        listen       80;
        server_name  www.xiaoxiao.com *.xiaoxiao.com;
        gzip on;
        gzip_http_version 1.0;
        gzip_comp_level 6;
        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;
        }



wKioL1XSfhGySz8IAADxQrzrgYw320.jpg

防盗链
通过referer模块实现。通过请求的referer首部判断该请求来自哪个页面。若是其他网站的页面来引用本站点的资源则拒绝响应。

定义格式:valid_referers none | blocked | server_names | string ...;
none:请求报文的首部中没有“Referer”首部(在地址栏中直接输入资源地址)。
blocked:请求报文中有“Referer”首部,但其内容被防火墙或代理服务器清楚。
server_names:指定允许引用本站资源的主机名。
如下示例,仅允许.xiaoxiao.com这个域内的主机引用本站的图片资源。若是非法引用则直接转向错误页面。
1
2
3
4
5
6
7
8
location ~* \.(jpg|png|gif|jpeg)$ {
            root /www;
            rewrite ^/images/(.*)$ /img/$1 last;
            valid_referers none blocked www.xiaoxiao.com *.xiaoxiao.com;
            if  ($invalid_referer) {
                        rewrite ^/.*$ http://www.xiaoxiao.com/404.html;
                }
        }




Rewrite
Rewrite为地址重写模块,示例如下:

1
2
3
4
        location / {
                root /www;
                rewrite ^/images/(.*)$ /imgs/$1 last;
            }



对被该location匹配到的uri进行重写。如:
http://www.xiaoxiao.com/images/a.jpg --> http://www.xiaoxiao.com/imgs/a.jpg
最后面的last为flags(标签)。常用的flags有:
last                #一旦被当前规则匹配并重写后立即停止检查后续的其它rewrite的规则,而后通过重
                      #写后的规则重新发起请求;
break             #一旦被当前规则匹配并重写后立即停止后续的其它rewrite的规则,而后继续由
                      #nginx进行后续操作;
redirect         #返回302临时重定向;
permanent    #返回301永久重定向;

相关的参数:

rewrite_log on|off    #是否把重写过程记录在错误日志中(默认为off),默认为notice级别。
return code              #用于结束rewrite规则,并且为客户返回状态码;可以使用的状态码有204,
                                 #400, 402-406, 500-504等;

nginx限速配置
limit Request限制客户端的访问速度。实现针对每个IP定义一个存储session状态的容器,根据状态信息对客户端的访问作出限制。
语法:limit_req_zone $session_variable zone=name_of_zone:size rate=rate
1
2
3
4
5
6
7
8
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    ...
    server {
        ...
        location /search/ {
            limit_req zone=one burst=5;
        }



如上示例中,one为区域名称,以便在下面的limit_req中引用,10M为该区域所占内存大小,rate指定访问速度(每秒最多一个请求)。


Limit Conn用于限制客户端的并发连接数。配置与上述类似。

1
2
3
4
5
6
7
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
    ...
    limit_conn perip 10;
    limit_conn perserver 100;
}



limit_conn perip 10表示对应的容器中的ip在同一时间最多仅允许10个并发请求。

反向代理,负载均衡
Nginx通过proxy模块实现反向代理功能。在作为web反向代理服务器时,nginx负责接收客户端请求,并能够根据URI、客户端参数或其它的处理逻辑将用户请求调度至上游服务器上(upstream server)。nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location定义的某URI代理至指定的上游服务器(组)上。
配置格式如下:

1
2
3
location /uri {
        proxy_pass http://www.xiaoxiao.com:8080/newuri;
    }



通过upstream模块可定义一个上游服务器组,在反向代理时,将请求代理至这个服务器组,实现负载均衡。upstream模块的负载均衡算法主要有三种,轮调(round-robin)、ip哈希(ip_hash)和最少连接(least_conn)三种。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
http {
    upstream dynamic {
       least_conn;
       server node1.xiaoxiao.com max_fails=3 fail_timeout=30s;
       server node2.xiaoxiao.com max_fails=3 fail_timeout=30s;
       }
     server {
       location / {
            index  index.html index.htm;
            proxy_pass http://dynamic;
            proxy_set_header       Host $host;
        }
     }
}



在负载均衡过程中nginx会自动检测上游服务器的健康状况。若上游的某台服务器down了或者服务停止了,nginx会自动识别,不再将请求调度至该服务器。故障服务器重新上线后,也能够马上加入到组中,恢复正常工作。

缓存
nginx作为反向代理服务器时,可以将上游服务器的响应数据暂存在本地,以加快响应客户端的速度。


proxy_cache zone|off:定义一个用于缓存的共享内存区域,其可被多个地方调用;缓存将遵从upstream服务器的响应报文首部中关于缓存的设定,如 "Expires"、"Cache-Control: no-cache"、 "Cache-Control: max-age=XXX"、"private"和"no-store" 等。

在响应报文中含有以下首部或指定标志的报文将不会被缓存。
1)Set-Cookie
2)Cache-Control containing "no-cache", "no-store", "private", or a "max-age" with a non-numeric or 0 value
3)Expires with a time in the past
4)X-Accel-Expires: 0

proxy_cache_path:定义一个用于保存缓存响应报文的目录,及一个保存缓存对象的键及响应元数据的共享内存区域(keys_zone=name:size),其可选参数有:
levels         #每级子目录名称的长度,有效值为1或2,每级之间使用冒号分隔,最多为3级;
inactive     #非活动缓存项从缓存中剔除之前的最大缓存时长;
max_size   #缓存空间大小的上限,当需要缓存的对象超出此空间限定时,缓存管理器将基于LRU算
                  #法对其进行清理;

proxy_cache_use_stale:在无法联系到upstream服务器时的情形下(如error、timeout或http_500等)让nginx使用本地缓存的过期的缓存对象直接响应客户端请求。如下:
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_404 | off
proxy_cache_valid [ code ...] time:用于为不同的响应设定不同时长的有效缓存时长。
例如:proxy_cache_valid  200 302  10m;

使用示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http {
    proxy_cache_path  /data/nginx/cache  levels=1:2    keys_zone=STATIC:10m
                                         inactive=24h  max_size=1g;
    server {
        location / {
            index  index.html index.htm;
            proxy_pass http://dynamic;
            proxy_set_header       Host $host;
            proxy_cache            STATIC;
            proxy_cache_valid      200  1h;
            proxy_cache_valid     301 302 1m;
            proxy_cache_valid     any 1m;
            proxy_cache_use_stale  error timeout invalid_header updating
                                 http_500 http_502 http_503 http_504;
        }
    }
}




以上仅是nginx的基础应用,若需要关于各模块更详细的说明,可参考官方文档http://wiki.nginx.org/Modules。.................^_^






运维网声明 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-101023-1-1.html 上篇帖子: nginx 常用全局变量 下篇帖子: nginx禁止ip默认参数是$remote_addr无法禁止真实ip的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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