一、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          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 adminNew password: Re-type new password: Adding password for user admin[root@node2 ps]# htpasswd -m /etc/nginx/.htpasswd tomNew 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 reloadnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successfulReloading nginx:                                           [  OK  ]

效果图:

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的错误页面

             然后我们去访问中的图片,该站中的图片是来自中。

             如果防盗链成功的话,中的图片打不开,而中的图片可以打开

  • 给创建一个index.html文件,链接中的图片:

       

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]# ls1.png  abc.html[root@node2 abc]# ls /web/www/download/fstab

我们来访问试试:

 是不是显示出来了,而我们的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;}

验证效果:

三,反向代理

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所指的目录。}        }
效果如下:

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

在客户端上刷新页面:

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

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

[root@node1 ~]# tail /var/log/httpd/access_log192.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\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %b" commonLogFormat "%{Referer}i -> %U" refererLogFormat "%{User-agent}i" agent
重启服务。
[root@node1 ~]# service httpd restartStopping 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 ;   这的 webserver 是 upstream 定义的名称。}        }

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

我们让  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:手动标记其不再处理任何请求;