一、nginx可实现的功能概述

  1. 提供web服务

  • nginx虚拟主机

  • 访问控制access模块

  • 用户认证

  • 建立下载站点autoindex模块

  • 防盗链

  • URL rewrite

  • 服务器的状态信息

  • 预压缩

  2. 反向代理

  • 反向代理

  • 负载均衡

二、具体配置nginx实现以上功能

1、配置nginx虚拟主机

IP地址:192.168.1.114

#user  nobody;
worker_processes  4;     笔者CPU总共4个物理核心,此处就填入4,如果在反向代理就可以多填入几个

#error_log  logs/error.log;
error_log  /var/log/nginx/error.log  notice;    我们将错误输入定向到 /var/log/nginx/error.log中
#error_log  logs/error.log  info;

pid        /var/run/nginx.pid;   定义PID位置


events {
        use epoll;
    worker_connections  1024;   每个进程最多可以响应1024个请求
}


http {
    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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  www.nginx1.com;   虚拟主机名为:www.nginx1.com        root /web/www/   文件在此目录下 
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
     }
 
 [root@node2 ~]# mkdir -pv /web/www
mkdir: created directory `/web'mkdir: created directory `/web/www'
给网页/web/www创建一个测试页文件index.html
访问验证:
 
2、访问控制模块 access 
server {
        listen       80;
        server_name  www.nginx1.com;
        index  index.html index.htm;
        root /web/www;
        
        deny 192.168.1.102;     拒绝192.168.1.102访问
        allow 192.168.1.100;
我们PC机IP为 192.168.1.102 查看是否能够访问的到
已经拒绝访问了。
 


3、用户认证,基于用户访问控制

server {
        listen       80;
        server_name  www.nginx1.com;
        index  index.html index.htm;
        root /web/www;


        location /admin/ {    只要访问/admin下的内容,就转到/web/www下的页面
                root /web/www;   表示访问文件在 /web/www/admin下                auth_basic "admin area";   用户提示信息 admin area
                auth_basic_user_file /etc/nginx/.htpasswd;   基于.htpasswd加密
        }
}
创建访问目录,再创建一个测试页
[root@node2 ps]# mkdir /web/www/admin
[root@node2 ps]# vim /web/www/admin/index.html
 
给我们的密码文件/etc/nginx/.htpasswd创建两个帐号用来测试:
[root@node2 ps]# htpasswd -c -m /etc/nginx/.htpasswd admin
New password: 
Re-type new password: 
Adding password for user admin
[root@node2 ps]# htpasswd -m /etc/nginx/.htpasswd tom
New password: 
Re-type new password: 
Adding password for user tom
测试结果:
 
 
4、建立下载站点autoindex模块(没有主页文件时)


location /download/ {               写在server之中
                root /web/www/;
                autoindex on;

}
创建目录文件,并且拷贝文件进去,重读配置文件,查看结果
[root@node2 ps]# mkdir /web/www/download
[root@node2 ps]# cp /etc/fstab /web/www/download
[root@node2 ps]# 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  ]

效果图:

p_w_picpath

5、防盗链

(1)定义合规的引用

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

(2)拒绝不合规的引用

if  ( $invalid_referer) {

rewrite

}

server {     这个虚拟主机是用来做盗链的。
        listen       80;
        server_name  www.nginx2.com;
        index  index.html index.htm;
        root /web/www1;
        }
location ^*\.(jpg|gif|jpeg|png)$ {           访问任何路径下的,只要以jpg|gif|jpeg|png结尾
                root /web/www/abc/;
                valid_referers none blocked www.nginx1.com;  只要符合这个匹配,就会显示图片if ($invalid_referer) {  如果和上面不匹配,就显示http://www.nginx1.com/403.html网页
                        rewrite ^/ http://www.nginx1.com/403.html;
                }
        }

测试思路:首先,我们给/web/www/abc目录下创建一个403.html的错误页面

             然后我们去访问www.nginx2.com中的图片,该站中的图片是来自www.nginx1.com中。

             如果防盗链成功的话,www.nginx2中的图片打不开,而www.nginx1.com中的图片可以打开

       

6、URL rewrite

地址重写:用户访问的URL做重定向,本来访问 a.html重定向到 b.html。

 做域名跳转,域名站点镜像,做URL跳转

替换结果不能使用正则表示式

rewrite  regex  replacement  [ flag ]; regex:正则表达式

location /download/ {
                root /web/www/;
                autoindex on; rewrite ^/download/(.*\.(jpg|gif|jpeg|png))$ /abc/$1 last;    如果访问download下的以如下格式结尾的文件就转到abc目录下
        }
我们来查看下这两个目录下的文件,download目录下没有1.png文件,而1.png文件在abc目录中
[root@node2 abc]# ls
1.png  abc.html
[root@node2 abc]# ls /web/www/download/
fstab

我们来访问试试:

p_w_picpath  是不是显示出来了,而我们的download文件夹下确实没有这个图片文件

7、服务器的状态信息

location /server_status {
                stub_status on;

8、预压缩

nginx将响应报文发送至客户端之前可以启用压缩功能,这能够有效地节约带宽,并提高响应至客户端的速度。通常编译nginx默认会附带gzip压缩的功能

,因此,可以直接启用之。

http {
    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;
}

验证效果: 

p_w_picpath

三,反向代理

1、反向代理设置

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

请求调度至上游服务器上(upstream server)。nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location定义的某URI代理至指定的上

游服务器(组)上

server {
        listen       80;
        server_name  www.nginx2.com;

        location /admin {
                proxy_pass http://192.168.1.113/; 如果113/后面不加/,则表示位置为:192.168.1.113/admin。如果113/后面的/加上的话,就表示位置为:192.168.1.113所指的目录。}
        }
效果如下: 


p_w_picpath p_w_picpath


2、参数

proxy_set_header:将发送至upsream server的报文的某首部进行重写;



为了收集客户端请求的IP、需要改http请求报文首部,哪个客户端收到请求,就把哪个客户端的IP首部加入进去

location /admin {
                proxy_pass http://192.168.1.113/;proxy_set_header X-Real-IP $remote_addr;        }
重读配置文件: service nginx reload
监听192.168.1.113 apache服务器的80端口: 
tcpdump -i eth0 -nn -X tcp port 80

在客户端上刷新页面:

p_w_picpath

查看apache服务器上的抓包结果:




p_w_picpath


我们可以通过apache的日志来查看请求信息:

[root@node1 ~]# tail /var/log/httpd/access_log

192.168.1.114 - - [15/Mar/2014:03:02:49 +0800] "GET / HTTP/1.0" 304 - "-""Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"
192.168.1.114 - - [15/Mar/2014:03:02:50 +0800] "GET / HTTP/1.0" 304 - "-""Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"
依然是nginx的请求地址:192.168.1.114

我们可以通过改 apache 输出日志的格式,就可以查看到请求的客户端的IP地址了

[root@node1 ~]# vim /etc/httpd/conf/httpd.conf 

LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
重启服务。
[root@node1 ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

再次在客户端请求,查看日志:

192.168.1.102 - - [15/Mar/2014:03:13:28 +0800] "GET / HTTP/1.0" 304 - "-""Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"192.168.1.102 - - [15/Mar/2014:03:13:28 +0800] "GET / HTTP/1.0" 304 - "-""Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"

3、将用户请求怎么发往上游多个服务器

与proxy模块结合使用的模块中,最常用的当属upstream模块。upstream模块可定义一个新的上下文,它包含了一组上游upstream服务器,这些服务器可能被赋予了不同的权重、不同的类型甚至可以基于维护等原因被标记为down。

upstream 写在 http 的上下文中;

upstream webservers {
                server 192.168.1.113 weight=3  max_fails=2 fail_timeout=3;
                server 192.168.1.105    weight=1 max_fails=2 fail_timeout=3;
                }



在 location 中写入被匹配到的转向upstream服务器

 server {
        listen       80;
        server_name  www.nginx2.com;

        location / {
                proxy_pass http://webservers;   这的 webserver 是 upstream 定义的名称。}
        }

实验效果:因为加了权重,会访问192.168.1.113  三次后转到 192.168.1.105 上

p_w_picpathp_w_picpath

我们让  192.168.1.113下线     service httpd stop
之后只能访问192.168.1.105
让192.168.1.113重新上线后,又可以加权轮询了

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