一、安装Nginx
该压缩包,位Nginx免安装版,解压即可用
二、Nginx基本操作
进入Nginx安装目录,我的是装在d盘。
start nginx 打开nginx
nginx t 编译conf文件夹下的nginx.conf文件(以后我们大部分的操作都是 对这个文件进行编写),用于检测nginx.conf是否存在语法上的错误。 但是注意此命令不会对nginx.conf重新进行加载
nginx -s reload 每次修改了nginx.conf文件后都要执行此命令重新加载。
nginx -s stop 强制关闭nginx。即不会等待nginx正在执行的任务。
nginx -s quit 关闭nginx。会等待nginx下未完成的任务完成后关闭。
三、配置文件结构
1.http模块
包含upstream和server等模块。
upstream:用以配置负载均衡
server:用以配置一个服务。
2.upstream模块
eg.
upstreamtest.com{
server www.bbb.com:81 weight = 1;
server www.aaa.com:82 weight =2;
}
通过访问test.com这个域名,我们可以访问到其下所有server,每次由系统来决定由那个服务端来接受请求。weight用来分配这些服务端被访问的权重,权重越高的被访问的几率越大,如例中所示,aaa被访问的概率是bbb被访问概率的2倍。在配置的时候主要是根据服务器的性能来进行配置,性能好的,自然权重越大,被访问的几率越大。
3.server模块
listen
1.监听的端口,如80,81等端口。80端口是nginx的默认端口,所以在通过域名访问的时候是不需要在浏览器中标注出来的,其他端口在访问的时候是需要进行标注的,如http://www.aaa.com:81。
2.也可以是完整的一个IP加上端口。这样的话在访问的时候我们就不一定需要通过server_name进行访问,而可以通过它的IP端口进行访问。
server_name
1.命名规则随意。也可以是正则表达式eg,*.aaa.com,这样在匹配server_name的时候就会匹配后续部分相同的,如org.aaa.com;www.aaa.com等。
2.需要注意的是,对于任何一个域名,要想通过它去访问ip的化需要,在hosts文件中添加映射,以方便进行域名解析,否则就会访问不到页面。
location
匹配到host header后进行具体的uri定位,详见location模块。
4.location模块
命名规则
(形如location [ = | ~ | ~* | ^~ ] uri { ...})
命名上分为普通表达式如:=,^~,和空("[]",表示可以没有)。和正则表达式如:~,~*。具体区别如下:
"=":表示精确匹配,如location=/lo{}则表示只能匹配到域名/lo,不能有后续部分。
空:仅前缀匹配,如location /lo{}则表示只要前缀名相同,不管后续部分。
^~:和空一样,但是只要有普通表达式匹配上了,就不会再去匹配正则表达式。
~:区分大小写的正则表达式。
~*:不区分大小写的正则表达式。
ps:location的匹配是按照最长前缀的规则来匹配的,且是先匹配普通表达式,再匹配正则表达式。也就是说前缀匹配程度越高,则越会被匹配到,但是若是匹配到正则表达式则普通表达式就会被覆盖,访问正则表达式location。(建议使用的时候尽量不要搞那么复杂把自己绕晕了。)关于,nginx如何处理请求后面会有详解。
proxy_pass(反向代理)
eg. proxy_pass URL;
location被请求后会跳转到proxy_pass所指定的url。需要注意的是,对于在普通表达式形成的location中,proxy_pass没有限制,即可以定位到整个url。但是对于正则表达式形成的location,proxy_pass只能定位到host header。对于剩下的uri部分要另行处理,详见如下Rewrite 模块。
Rewrite重定向
eg.rewrite regex replacement [flag];
当location是正则表达式时,且内部使用了反向代理,这时对于除host header之外的uri部分,我们需要用rewrite对uri进行重写。注意rewrite只对除去host header和参数部分的url进行重写,且是全部重写。样例如上,相当于在主机地址后面添加了url。
其中regex任意,不为空即可。任意不代表它没有作用,当我们需要从regex中读取或保留参数的时候,则需要一定的命名规则。如我们需要对/ad*request.adx这样一个请求定向到/ad/request这样的url里来,可以这样写:
rewrite "^([a-z]{2})*([a-z]{7}).adx$"/$1/$2 break;
需要注意的是regex为了里面内容符号上的冲突最好用""括起来。
()表示里面的是参数,可以用是$+数字引用,数字表示位置。
[a-z]:表示小写的24个字母。
[A-Z]:表示大写的24个字母。
{num}:num为数字,表示从a-z中取出多少个字母。
关于flag标记:
last 表示完成rewrite
break 终止匹配, 不再匹配后面的规则
redirect 返回302临时重定向,地址栏会显示跳转后的地址
permanent 返回301永久重定向,地址栏会显示跳转后的地址
注意:因为ADX请求响应要求是200表示成功,所以我们不用301、302重定向参数。
四、Nginx如何处理请求
Nginx在被请求访问server的时候,首先查看被监听的端口,如果监听端口包含了ip地址则我们直接可以通过ip进行访问,如果匹配到了端口但是却找不到对应的server_name,则会匹配到默认的server上,在listen 端口的后面添加defalt_server这个参数可以设置位默认server。
之后会匹配server里面的location,根据最长前缀原则进行匹配,具体可参考前面location模块里的命名规则。
五、Nginx配置https环境。
1.配置参数。
配置参数如下即可。
注意:https默认的访问端口是443,不是80端口,key文件根据需要可以选择带密码的和不带密码的。
2.生成证书
1.安装openssl(证书生成工具)
解压AMD64-Win64OpenSSL-0_9_8g即可,无需安装。
2.双击openssl.exe打开程序。
操作步骤如下:
# 1).生成一个RSA密钥
genrsa -des3 -out hkli.key 1024
# 2).拷贝一个不需要输入密码的密钥文件
rsa -in hkli.key -out hkli_nopass.key
# 3).生成一个证书请求
req -new -key hkli.key -config"d:\openssl.cnf" -out hkli.csr
# 4).自己签发证书
x509 -req -days 365 -in hkli.csr -signkey hkli.key-out hkli.crt
注意:a.第三步,config后面的内容填的是openssl.cnf这个文件的具体内容。
b.执行第三步时会让填写资料,其他随便,但是uinit name,common name,email address必须要根据自己的域名来写。
具体操作如下图。
六、正则表达式
对于不了解正则表达式的童鞋,可以看这里,这里做了总结。
1.location部分
"/" : 通用匹配。
"=" : 表示精确匹配,如location=/lo{}则表示只能匹配到域名/lo,不能有后续部分。
空 : 仅前缀匹配,如location /lo{}则表示只要前缀名相同,不管后续部分。
^~ : 和空一样,但是只要有普通表达式匹配上了,就不会再去匹配正则表达式。
~ : 区分大小写的正则表达式。
~* : 不区分大小写的正则表达式。
2.Rewrite部分
. : 匹配除换行符以外的任意字符
? : 重复0次或1次
+ : 重复1次或更多次
* : 重复0次或更多次
\d : 匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的介绍
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[a-z] : 匹配a-z小写字母的任意一个
[A-Z] : 匹配A-Z大写字母的任意一个
小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。