一、nginx可实现的功能概述
提供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/wwwmkdir: 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 ]效果图:
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中的图片可以打开
给www.nginx2.com创建一个index.html文件,链接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我们来访问试试:
是不是显示出来了,而我们的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_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"
与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 上
我们让 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:手动标记其不再处理任何请求;