一、配置使用nginx
1、提供测试页
[[email protected] ~]# mkdir /www/a.com/htdoc [[email protected] ~]# cat /www/a.com/htdoc/index.htmlwww.a.com
[[email protected] ~]# chown -R nginx.nginx /www/a.com/htdoc/
2、备份配置文件并简要更改配置文件
[[email protected] ~]# cp /etc/nginx/nginx.conf{,.bak} [[email protected] ~]# vim /etc/nginx/nginx.conf server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root /data/www; index index.html index.htm; }
3、从新加载配置文件
[[email protected] ~]# service nginx reload nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful 重新载入 nginx: [确定]
4、测试
二、置Nginx的虚拟主机
1、修改配置文件
[[email protected] ~]# vim /etc/nginx/nginx.conf server { listen 80; server_name www.a.com; location / { root /www/a.com/htdoc; index index.html index.htm; } } server { listen 80; server_name www.b.org; location / { root /www/b.org/htdoc; index index.html index.htm; } }
2、提供测试页面
[[email protected] ~]# mkdir /www/b.org/htdoc [[email protected] ~]# cat /www/b.org/htdoc/index.htmlwww.b.org
[[email protected] ~]# chown -R nginx.nginx /www/b.org/htdoc/
3、重新加载nginx配置
[[email protected] ~]# service nginx reload nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful 重新载入 nginx: [确定]
4、修改windows的hosts文件
Windows 10下路径:C:\Windows\System32\drivers\etc\hosts
192.168.1.8 www.a.com 192.168.1.8 www.c.net 192.168.1.8 www.b.org 192.168.1.8 www.example.com
5、测试一下
三、配置Nginx基于用户的访问控制
1、提供测试文件
[[email protected] ~]# mkdir /www/b.org/bbs [[email protected] ~]# cat /www/b.org/bbs/test.htmlAuth Page!
2、修改配置文件
server { listen 80; server_name www.b.org; #charset koi8-r; #access_log logs/host.access.log main; location / { root /www/b.org/htdoc; index index.html index.htm; } location /bbs { root /www/b.org; index index.html index.htm; auth_basic "Auth Page"; auth_basic_user_file /etc/nginx/.user; } }
3、生成认证文件及用户
注意需要安装httpd才能使用此命令!
[[email protected] ~]# htpasswd -c -m /etc/nginx/.user admin New password: Re-type new password: Adding password for user admin
4、重新加载一下nginx配置文件
[[email protected] ~]# service nginx reload
5、测试一下
四、配置Nginx提供状态页面
1、修改配置文件
location /status { root /; stub_status on; auth_basic "Nginx Status"; auth_basic_user_file /etc/nginx/.user; }
2、重新加载一下配置文件
3、输入密码后测试
Active connections表示当前活跃的连接数。
第三行的3个数字表示 Nginx当前总共处理了36个连接, 成功创建了36次握手,总共处理了90个请求。
最后一行的Reading表示Nginx读取到客户端Header信息数; Writing表示Nginx返回给客户端的Header信息数;Waiting表示Nginx已经处理完、正在等候下一次请求指令时的驻留连接数。
五、配置Nginx的错误页面
1、提供404错误页面
[[email protected] ~]# cat /www/b.org/htdoc/404.html404 error
404 error
404 error
404 error
2、修改配置文件
[[email protected] ~]# vim /etc/nginx/nginx.conf 在对应的虚拟主机中添加以下: error_page 404 /404.html;
3、重新加载一下nginx配置文件
4、访问不存在的页面测试
六、建立下载站点autoindex模块
1、指令说明
Nginx默认是不允许列出整个目录的。如需此功能,打开nginx.conf文件,在location server 或 http段中加入autoindex on;另外两个参数最好也加上去:
autoindex_exact_size off;默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB。
autoindex_localtime on;默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间。
2、修改配置文件
location /download { root /www/b.org; index index.html index.htm; autoindex on ; autoindex_exact_size on; autoindex_localtime on; }
3、创建下载目录
[[email protected] ~]# mkdir /www/b.org/download [[email protected] ~]# cp /etc/fstab /www/b.org/download
4、加载配置文件
5、浏览器测试
七、定义防盗链
1、定义防盗链的步骤
定义合规的引用 valid_referers none | blocked | server_names | string ...;
拒绝不合规的引用
if ($invalid_referer) { rewrite ^/.*$ http://www.b.org/403.html }
2、referer模块简介
nginx_http_referer_module模块通常用于阻挡来源非法的域名请求.我们应该牢记,伪装Referer头部是非常简单的事情,所以这个模块只能用于阻止大部分非法请求.我们应该记住,有些合法的请求是不会带referer来源头部的,所以有时候不要拒绝来源头部(referer)为空的请求。
防盗链模块指令 :
referer_hash_bucket_size 语法: referer_hash_bucket_size size; 默认值为64: referer_hash_bucket_size 64; 配置段:server,location
referer_hash_max_size 语法: referer_hash_max_size size; 默认值2048k: referer_hash_max_size 2048; 配置段: Context: server,location
valid_referers 语法: valid_referers none | blocked | server_names | string ...; 配置段: server,location
指定合法的来源’referer’, 他决定了内置变量$invalid_referer的值,如果referer头部包含在这个合法网址里面,这个变量被设置为0,否则设置为1。记住,不区分大小写的。
none #“Referer” 来源头部为空的情况;从浏览器输入的。
blocked #“Referer” 来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头.
server_names #“Referer”来源头部包含当前的server_names(当前域名)
arbitrary string #任意字符串,定义服务器名或者可选的URI前缀.主机名可以使用*开头或者结尾,在检测来源头部这个过程中,来源域名中的主机端口将会被忽略掉
regular expression #正则表达式,~表示排除https://或http://开头的字符串.
3、实例:
location ~* \.(gif|jpg|png|bmp)$ { valid_referers none blocked *.b.org server_names ~\.google\.~\.baidu\.; if ($invalid_referer) { return 403; #rewrite ^/ http://www.b.org/403.jpg; } }
4、防盗链应用举例
编辑配置文件添加图片的防盗链:
[[email protected] ~]# vim /etc/nginx/nginx.conf location ~* \.(jpg|gif|jpeg|png|)$ { root /www/b.org/; valid_referers none blockd www.b.org *.b.org; if ($invalid_referer){ rewrite ^/ http://www.b.org/403.html; } }
在网站a.com中引用b.org网站的内容:
[[email protected] ~]# cat /www/a.com/htdoc/test.htmlwww.a.com
浏览器测试:
查看日志:
[[email protected] ~]# tail -1 /var/log/nginx/error.log 2015/09/09 22:48:00 [error] 8327#0: *31 open() "/www/b.org/404.html" failed (2: No such file or directory), client: 192.168.1.103, server: www.b.org, request: "GET /403.html HTTP/1.1", host: "www.b.org", referrer: "http://www.a.com/test.html"
八、重写模块
1、重写模块介绍
Rewrite 主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后nginx将返回500错误。同时,重写模块包含set指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。
2、重写模块指令
break指令: 完成当前设置的重写规则,停止执行其他的重写规则。 语法: break; 应用配置段: server,location, if
if指令: 语法: if(condition) { ... } 应用配置段: server,location 注意:尽量考虑使用try_files代替。
判断的条件:
一个变量的名称:空字符传”“或者一些“0”开始的字符串为false。
字符串比较:使用=或!=运算符
正则表达式匹配:使用~(区分大小写)和~*(不区分大小写),取反运算!~和!~*。
文件是否存在:使用-f和!-f操作符
目录是否存在:使用-d和!-d操作符
文件、目录、符号链接是否存在:使用-e和!-e操作符
文件是否可执行:使用-x和!-x操作符
return指令: 语法: returncode [text]; returncode URL; returnURL; 应用配置段:server,location, if
停止处理并为客户端返回状态码。非标准的444状态码将关闭连接,不发送任何响应头。可以使用的状态码有:204,400,402-406,408,410, 411, 413, 416与500-504。如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个URL,该URL将成为location头补值。没有状态码的URL将被视为一个302状态码。
rewrite指令: 语法:rewriteregex replacement [flag]; 应用配置段: server,location, if
按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。可以在重写指令后面添加标记。
注意:如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
尾部的标记(flag)可以是以下的值:
last #停止处理重写模块指令,之后搜索location与更改后的URI匹配。
break #完成重写指令。
redirect #返回302临时重定向,如果替换字段用http://开头则被使用。
permanent #返回301永久重定向。
关于last、break的详细说明:
last:解决死循环,对当前请求的处理检查URL重写规则,如果匹配规则需要被重写,服务器对后续规则无需再检查,让客户端将新的重写请求发送给服务器,服务器重新发起检查,这次检查会重头到尾检查一遍。
如果没用last:一个location中多条URL重写规则,对请求的处理会检查规则,匹配到后发现需要重写,服务器会通知客户端请求需要重写,客户端就重新发重写过后的请求到服务器,服务器对新的重写好的请求还是需要检查规则,如果检查到匹配某条规则后就又需要重写,客户端就又要发送新的重写请求到服务器,形成循环重写了。
break:客户端发送请求URL到服务器,服务器发现其需要匹配URL重写规则,服务器通知客户端请求需要重写,客户端就将重写过的请求URL发送给服务器,服务器不再检查URL重写规则,直接响应。
rewrite_log指令:启用时将在error log中记录notice级别的重写日志。 语法: rewrite_log on | off; 默认值: rewrite_log off; 应用配置段: http,server, location, if
set指令:为给定的变量设置一个特定值。 语法: set$variable value; 应用配置段:server,location, if
uninitialized_variable_warn指令:控制是否记录未初始化变量的警告信息。 语法:uninitialized_variable_warnon | off; 默认值: uninitialized_variable_warnon; 应用配置段: http,server, location, if
3、举例
server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... }
解释:
如果访问URI为download开头后面跟任意内容,后跟media下跟一个任意名称的以.结尾的所有内容都替换成为download开头后面跟任意内容,把media替换成mp3下跟任意名称以.mp3结尾的内容了,实现了后向引用。
4、rewrite重写应用举例
在配置文件中添加如下:
location /download { root /www/b.org; autoindex on ; rewrite ^/download/(.*\.(jpg|gif|jpeg|png|))$ /p_w_picpaths/$1 last; }
在p_w_picpaths目录中放入图片,:
[[email protected] ~]# ls /www/b.org/p_w_picpaths/ 1.jpeg [[email protected] ~]# ls /www/b.org/download/ fstab
浏览器测试:
5、rewrite_log记录日志功能举例
将记录错误日志的级别提高:error_log /var/log/nginx/error.log notice;
开启rewrite_log:rewrite_log on ;
浏览几次页面后查看错误日志:
[[email protected] ~]# tail -2 /var/log/nginx/error.log 2015/09/09 22:30:36 [notice] 8301#0: *29 "^/download/(.*\.(jpg|gif|jpeg|png|))$" matches "/download/1.jpeg", client: 192.168.1.103, server: www.b.org, request: "GET /download/1.jpeg HTTP/1.1", host: "www.b.org"2015/09/09 22:30:36 [notice] 8301#0: *29 rewritten data: "/p_w_picpaths/1.jpeg", args: "", client: 192.168.1.103, server: www.b.org, request: "GET /download/1.jpeg HTTP/1.1", host: "www.b.org"
九、gzip压缩模块
1、基于gzip实现资源文件压缩模块
发送给客户端的资源结果做压缩: ngx_http_gzip_module
整个网站内容压缩了: ngx_http_gzip_static_module
注意需要编译:--with-http_gzip_static_module
此模块的作用就是在接到请求后,会到url相同的路径的文件系统去找扩展名为“.gz”的文件,如果不存在,再将文件进行gzip压缩,再发送出去,这样可以避免重复的压缩无谓的消耗资源,这个模块不受gzip_types限制,会对所有请求有效。所以建议不要在全局上使用,因为一般来说大部分都是动态请求,是不会有.gz这个文件的,建议只在局部我们确认有.gz的目录中使用。 我们常用的是对发送给客户端的资源结果做压缩。
2、模块说明
gzip压缩模块是ngx_http_gzip_module,是nginx内置的。 gzip:决定是否开启gzip模块。 语法: gzip on | off; 默认关闭: gzip off; 配置段: http, server, location, if in location
gzip_buffers:设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间。 语法: gzip_buffers number size; 默认值: gzip_buffers 32 4k|16 8k; 配置段: http, server, location
gzip_comp_level:设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大。 语法: gzip_comp_level level; 默认压缩比是1: gzip_comp_level 1; 配置段: http, server, location
gzip_min_length:当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩 语法: gzip_min_length length; 默认值是20byte: gzip_min_length 20; 配置段: http, server, location
gzip_http_version:用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,所以为了支持前期版本加了此选项,目前此项基本可以忽略。 语法: gzip_http_version 1.0 | 1.1; 默认版本是1.1: gzip_http_version 1.1; 配置段: http, server, location
gzip_proxied:Nginx做为反向代理的时候启用 语法: gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; 默认关闭: gzip_proxied off; 配置段: http, server, location
指令参数详解:
off #关闭所有的代理结果数据压缩
expired #启用压缩,如果header中包含”Expires”头信息
no-cache #启用压缩,如果header中包含”Cache-Control:no-cache”头信息
no-store #启用压缩,如果header中包含”Cache-Control:no-store”头信息
private #启用压缩,如果header中包含”Cache-Control:private”头信息
no_last_modified #启用压缩,如果header中包含”Last_Modified”头信息
no_etag #启用压缩,如果header中包含“ETag”头信息
auth #启用压缩,如果header中包含“Authorization”头信息
any #无条件压缩所有结果数据
gzip_types:设置需要压缩的MIME类型,非设置值不进行压缩。 语法: gzip_types mime-type ...; 默认压缩html文件: gzip_types text/html; 配置段: http, server, location
3、nginx官网实例
gzip on; gzip_min_length 1000; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain application/xml;
开启gzip压缩;
最小压缩文件大小是1000字节;
如果header中包含”Cache-Control:no-cache”头信息,”Cache-Control:no-store”头信息,Cache-Control:private”头信
息,“Authorization”头信息就启用压缩 压缩的类型为text和xml文件 ;
4、应用举例
编辑配置文件启用gzip压缩功能:
[[email protected] ~]# vim /etc/nginx/nginx.conf 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;
重新载入配置文件:
[[email protected] ~]# service nginx reload
浏览器测试:
十、http首部报文模块
1、模块介绍
ngx_http_headers_module模块提供了两个重要的指令add_header和expires,来添加 “Expires” 和 “Cache-Control” 头字段,对响应头添加任何域字段。add_header可以用来标示请求访问到哪台服务器上。expires指令用来对浏览器本地缓存的控制。
2、模块指令
add_header指令 语法: add_header name value [always]; 配置段: http, server, location, if in location 对响应代码为200,201,204,206,301,302,303,304,或307的响应报文头字段添加任意域。如: add_header From example.com
expires指令 语法: expires [modified] time; expires epoch | max | off; 默认关闭: expires off; 应用配置段: http, server, location, if in location
在对响应代码为200,201,204,206,301,302,303,304,或307头部中是否开启对“Expires”和“Cache-Control”的增加和修改操作。 可以指定一个正或负的时间值,Expires头中的时间根据目前时间和指令中指定的时间的和来获得。 epoch表示自1970年一月一日00:00:01 GMT的绝对时间,max指定Expires的值为2037年12月31日23:59:59,Cache-Control的值为10 years。
Cache-Control头的内容随预设的时间标识指定:
设置为负数的时间值:Cache-Control: no-cache。
设置为正数或0的时间值:Cache-Control: max-age = #,这里#的单位为秒,在指令中指定。
参数off禁止修改应答头中的”Expires”和”Cache-Control”。
实例:对图片,flash文件在浏览器本地缓存30天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; }
十一、配置Nginx基于ssl提供https服务
1、模块指令
SSL指令 :为一个server{...}虚拟主机开启HTTPS
语法: ssl on | off;
默认值: ssl off;
应用配置段:http, server
ssl_certificate指令 :为当前的虚拟主机指定PEM格式的证书文件。
语法: ssl_certificate file;
配置段: http, server
ssl_certificate_key指令 :为当前的虚拟主机指定PEM格式的私钥文件。
语法: ssl_certificate_key file;
配置段: http, server
ssl_client_certificate指令
语法: ssl_client_certificate file;
配置段: http, server
ssl_dhparam指令:此指令出现于nginx 0.7.2版 ,指定PEM格式含有Diffie-Hellman参数的文件,用于TLS会话键。
语法: ssl_dhparam file;
配置段:http, server
ssl_ciphers指令:指定许可密码的描述。密码以openssl支持的格式指定;使用以下命令可以查看openssl支持的完整格式列表:openssl ciphers。
语法:ssl_ciphers ciphers;
默认值:ssl_ciphers HIGH:!aNULL:!MD5;
配置段:http, server
ssl_crl指令:此指令在nginx 0.8.7版本开始出现,指定一个PEM格式的证书吊销文件,用于检查客户端证书。
语法:ssl_crl file;
配置段:http, server
ssl_prefer_server_ciphers指令:对SSLv3和TLSv1协议的服务器端密码需求优先级高于客户端密码。
语法:ssl_prefer_server_ciphers on | off;
默认值:ssl_prefer_server_ciphers off;
配置段:http, server
ssl_protocols指令:指定使用的SSL协议
语法:ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
默认值:ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
配置段:http, server
ssl_verify_client:是否开启客户端证书验证。参数“ask”在客户端主动提出检查证书时,对客户端证书进行检查。
语法:ssl_verify_client on | off | optional | optional_no_ca;
默认值:ssl_verify_client off;
配置段:http, server
ssl_verify_depth:设置客户端证书链的深度。
语法:ssl_verify_depth number;
默认值:ssl_verify_depth 1;
配置段:http, server
ssl_session_cache指令:设置用来存储SSL会话缓存类型和大小。
语法:ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
默认值:ssl_session_cache none;
配置段:http, server
缓存类型分类:
off #硬关闭:明确告诉客户端这个会话不可用;
none #软关闭:告诉客户端会话能被重用,但Nginx实际上不会重用它们。
builtin #OpenSSL内置缓存,仅可用于一个工作进程;缓存大小用户会话数来指定。注意:使用该指令会导致内存碎片,慎用。
shared #位于所有工作进程的共享缓存。缓存大小用字节数指定,1MB缓存能容纳4000会话。每个共享缓存必须拥有字节的名称,同名的缓存可以用于多个虚拟主机。
ssl_session_timeout指令:设置客户端能够重复使用存储在缓存中的会话参数时间。
语法:ssl_session_timeout time;
默认值:ssl_session_timeout 5m;
配置段:http, server
2、应用举例
创建CA自签证书:
[[email protected] ~]# cd /etc/pki/CA/private/ [[email protected] private]# (umask 077; openssl genrsa 2048 > cakey.pem) [[email protected] private]# ls cakey.pem [[email protected] private]# openssl req -new -x509 -key ./private/cakey.pem -out cacert.pem [[email protected] private]# cd .. [[email protected] CA]# openssl req -new -x509 -key ./private/cakey.pem -out cacert.pem [[email protected] CA]# ls cacert.pem crl index.txt index.txt.old private serial.old certs crlnumber index.txt.attr newcerts serial [[email protected] CA]# touch serial index.txt ^C [[email protected] CA]# echo 01 > serial
生成证书申请:
[[email protected] CA]# mkdir /etc/nginx/ssl [[email protected] CA]# cd /etc/nginx/ssl [[email protected] ssl]# (umask 077; openssl genrsa 1024 > nginx.key) [[email protected] ssl]# openssl req -new -key nginx.key -out nginx.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [CN]: State or Province Name (full name) [Henan]: Locality Name (eg, city) [Xinyang]: Organization Name (eg, company) [Companyname]: Organizational Unit Name (eg, section) [Linuxer]: Common Name (eg, your name or your server's hostname) []:www.test.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: 让CA签名并颁发证书: [[email protected] ssl]# openssl ca -in nginx.csr -out nginx.crt -days 3650 Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 3 (0x3) Validity Not Before: Sep 10 03:14:41 2015 GMT Not After : Sep 7 03:14:41 2025 GMT Subject: countryName = CN stateOrProvinceName = Henan organizationName = Companyname organizationalUnitName = Linuxer commonName = www.test.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 65:A0:4E:DC:8C:5B:2C:22:5B:78:33:C6:11:85:33:A2:3E:4A:59:B5 X509v3 Authority Key Identifier: keyid:C4:67:DE:CF:AD:0B:94:03:C0:ED:5D:86:90:DE:36:B4:AE:DF:B1:2F Certificate is to be certified until Sep 7 03:14:41 2025 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
修改配置文件:
[[email protected] ssl]# vim /etc/nginx/nginx.conf server { listen 443; server_name www.b.org; ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; #error_page 404 /www/b.org/404.html; #charset koi8-r; #access_log logs/host.access.log main; location / { root /www/b.org/htdoc; index index.html index.htm; } }
从新载入配置文件:
[[email protected] ssl]# service nginx restart
测试:
注意在浏览器中可能出现证书不受信任,只需要跳过即可。