nginx功能测试二

https

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
* 创建CA服务器
cd /etc/pki/CA
(umask 077;openssl genrsa -out private/cakey.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
touch index.txt serial
echo 01 > serial
* 到web服务器
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
(umask 077;openssl genrsa -out nginx.key 2048)
openssl req -new -key http.key -out nginx.csr
scp nginx.csr 192.168.1.2:/tmp
* 到CA服务器
openssl ca -in /tmp/nginx.csr -out /etc/pki/CA/certs/nginx.crt -days 365
#newcerts中的也是证书,是pem格式的
scp certs/nginx.crt 192.168.1.3:/etc/nginx/ssl
* 到web服务器
cp conf.d/vhost1.conf conf.d/vhost1_ssl.conf
vim conf.d/vhost1_ssl.conf
server {
listen 443 ssl;
server_name www.ruopu.com;
root /data/nginx/vhost1;
access_log /var/log/nginx/vhost1_ssl_access.log main;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
#当前虚拟主机使用PEM格式的证书文件
ssl_certificate_key /etc/nginx/ssl/nginx.key;
#当前虚拟主机上与其证书匹配的私钥文件
ssl_protocols sslv3 tlsv1 tlsv1.1 tlsv1.2;
#支持ssl协议版本,默认为后三个
ssl_session_cache shared:SSL:10m;
#在各worker之间使用一个共享的缓存。SSL是自定义的名字,1m内存空间可以缓存4000个会话,这里定义10M。
}
nginx -t
nginx -s reload
ss -tln
访问https://www.ruopu.com,将cacert.pem传到主机,这里定义的CA服务器与客户端的主机名是一样的,访问时通过了。

重写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
vim /etc/nginx/conf.d/vhost1.conf
server{
rewrite /(.*)\.png$ /$1.jpg;
#rewrite放在server中,另外放在location或if中也可以。上面配置表示,所有以.png结尾的文件都转成.jpg格式的。括号是为了后面的$1引用,/是根,png前面的点需要转义,后面的.jpg的点不需要转义
}
nginx -t
nginx -s reload
访问www.ruopu.com/images/fish.png,这里实际访问的是一个叫fish.jpg的文件,名字一样但格式不同。
vim /etc/nginx/conf.d/vhost1.conf
server {
listen 80;
server_name www.ruopu.com;
root /data/nginx/vhost1;
error_page 404 /notfound.html;
# rewrite /(.*)$ https://www.ruopu.com/$1;
rewrite /(.*)\.png$ https://www.ruopu.com/$1.jpg;
#用户请求任何内容,都转到https的页面上。但两条不要一起写,如果一起写,在访问www.ruopu.com/images/night.png时会先匹配上面的规则,下面的规则就不会生效了。
location = /notfound.html {
root /data/nginx/error_pages;
}
location ^~ /images/ {
alias /data/pictures/;
}
location ~* ^/(admin|login) {
auth_basic "admin area or login url";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
location /ngxstatus {
stub_status;
}
}

vim /etc/nginx/conf.d/vhost1_ssl.conf
server {
listen 443 ssl;
server_name www.ruopu.com;
root /data/nginx/vhost1;
location ^~ /images/ {
alias /data/pictures/;
}
access_log /var/log/nginx/vhost1_ssl_access.log main;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols sslv3 tlsv1 tlsv1.1 tlsv1.2;
ssl_session_cache shared:SSL:10m;
}
#vhost1_ssl.conf配置文件中也要有与vhost1.conf中相同的配置,这样才能正常访问,这里是定义的别名与vhost1.conf中是一样的,也就是要有相同的访问路径,不然不能正常访问,会有404的错误提示。
#上面的重写要写在监听80端口的server中,不能写在监听在443端口的server中,如果写在监听在443端口的server中,那么请求会无限重定向,最后是无法访问的。监听80端口与监听443端口的两个server中定义的内容应该是一样的。不然访问80端口时能访问的路径被重定向到443端口时就访问不到了。如果想让访问80端口的任何以png结尾的文件,都被重定向到443端口的.jpg文件,那么就要在监听443端口的配置文件中加入 rewrite /(.*)\.png$ /$1.jpg;,如果在监听80端口的server中定义是不起作用的。这是在要将所有访问的内容都重定向到443端口,并且还要让访问png文件的请求重定向到443端口的jpg文件,这两个条件都存在的情况下需要的配置。但如果只是将访问80端口的以png结尾的文件重定向到443端口的jpg文件的话,只要在监听80端口的server中写入 rewrite /(.*)\.png$ https://www.ruopu.com/$1.jpg; 就行了。
nginx -s reload
访问https://www.ruopu.com/images/night.png,rewrite规则可以写多条,rewrite匹配并重写url后会以新的url地址重新匹配配置文件或重新检查location的规则,如果可以匹配到,就会再重写一遍,直到匹配不到。默认的行为是last,就是重写的url会被重新再匹配一遍规则。还有break、redirect、permanent
vim /etc/nginx/conf.d/vhost1.conf
server{
rewrite /(.*)\.png$ /$1.jpg redirect;
}
#redirect是重定向,客户端要重新发起请求。如果是permanent就是永久重定向,也需要客户端重新发请求。last和break是不需要客户端重新发请求的,只是服务器内部做了转换
=======================================================================================
#[flag]:
last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环;
break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环;
redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;不能以http://或https://开头;302
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;301

反代

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
* 准备三台主机,一台反代,两台web服务,反代服务器的地址有两个,一个外网192.168.1.90,一个内网172.16.0.1。web服务器有两个内网地址,一个172.16.0.2,一个172.16.0.3。设置内网地址,就是将虚拟机网卡改为仅主机,然后设置仅主机的IP地址
yum install httpd mod_ssl
//到web服务器上安装httpd,mod_ssl,并提供主页,最后改为内网网卡并配置地址。改为内网地址172.16.0.2
vim /var/www/html/index.html
<h1>Real Server 1</h1>
vim /etc/sysconfig/network-scripts/ifcfg-eno16777736
IPADDR=172.16.0.2
NETMASK=255.255.0.0
systemctl start httpd
setenforce 0
systemctl stop firewalld
* 到反代服务器
vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repository
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
yum install nginx
vim /etc/nginx/conf.d/ruopu.conf
server {
listen 80;
server_name www.ruopu.com
location / {
proxy_pass http://172.16.0.2:80;
//这里要看web服务器是基于什么做的虚拟主机,是IP,port还是FQDN,是哪个就在http后输入哪个
}
}
nginx -t
systemctl start nginx
* 修改客户端hosts文件,让主机可以解析nginx的域名
* 访问测试
* 到web服务器上
tcpdump -i eno16777736 tcp port 80
//监听80端口,看一下请求是否为反代服务器发来的
* 到第二台web服务器上
yum install httpd
改为内网地址172.16.0.3
systemctl stop firewalld
setenforce 0
vim /var/www/html/index.html
<h1>Real Server 2</h1>
find /usr/share -iname "*.jpg" -exec cp {} /var/www/html \;
//这一次准备将图片文件都反代到这台服务器
systemctl start httpd
* 到反代服务器,加入
vim /etc/nginx/conf.d/ruopu.conf
location ~* \.(jpg|jpeg|png)$ {
proxy_pass http://172.16.0.3:80;
//将访问图片的请求代理到另一台服务器上
}
* 到客户端访问,如果是访问域名就返回第一台web服务器的内容,如果访问域名/*.jpg就返回第二台服务器的内容。在配置文件中,如果location中用了正则表达式,在proxy_pass指向的地址中的80端口后是不能加斜线/的,如果没用正则表达式,可以加斜线。像上边的第一个location设置,如果80后有斜线,表示将location中的斜线替换成80后的斜线,如果没有斜线,表示将location中的斜线补在80后
* 测试斜线的功能,到反代服务器上
vim /etc/nginx/conf.d/ruopu.com
server {
listen 80;
server_name www.ruopu.com;
location / {
root /data/nginx/html;
}
location /admin/ {
proxy_pass http://172.16.0.2:80;
//这个反代的意思是在172.16.0.2的根目录下找admin目录,下面的反代是在访问以jpg等为后缀名的文件时到172.16.0.3:80的根目录下找
}
location ~* \.(jpg|jpeg|png)$ {
proxy_pass http://172.16.0.3:80;
}
}
//修改配置文件,将admin代理过去
mkdir -pv /data/nginx/html
nginx -s reload
* 到客户端访问www.ruopu.com/admin,提示Not Found,因为web服务器上没有admin目录。但是,如果location /admin/中的80后有斜线,那么访问的就是172.16.0.2的根目录,也就是/var/www/html/index.html文件。也就是,没有斜线,就将/admin补在80后,因为172.16.0.2中没有admin目录,所以提示Not Found。如果有斜线,就表示访问http://172.16.0.2/admin就是在访问172.16.0.2的根目录,/admin/就等于/。
* 到web服务器上
mkdir /var/www/html/admin
vim /var/www/html/admin/index.html
admin
* 到客户端测试,这时显示admin
* 到反代服务器上加一个斜线
vim /etc/nginx/conf.d/ruopu.com
server {
listen 80;
server_name www.ruopu.com;
location / {
root /data/nginx/html;
}
location /admin/ {
proxy_pass http://10.5.5.204:80/;
}
location ~* \.(jpg|jpeg|png)$ {
proxy_pass http://10.5.5.205:80;
}
}
nginx -t
nginx -s reload
* 到客户端访问www.ruopu.com/admin,这时显示的是Real Server 1,也就是web服务器上html中定义的内容,配置的意思就是,当访问admin时,就替换成web服务器根下的内容。当location中定义的是根时,这个斜线就没有意义了,因为访问的都是根

设置上传大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim /etc/nginx/nginx.conf
http {
client_max_body_size 8M;
# 设置上传最大8M
}

# 下面设置php上传大小
vim /etc/php5/fpm/php.ini
;This sets the maximum amount of memory in bytes that a script is allowed to allocate
memory_limit = 32M

;The maximum size of an uploaded file.
upload_max_filesize = 8M

;Sets max size of post data allowed. This setting also affects file upload. To upload large files, this value must be larger than upload_max_filesize
post_max_size = 16M

nginx功能测试一

CPU绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
ps axo user,comm,pid,psr,pcpu | grep nginx
#查看进程运行在哪个CPU上,显示的最后一个数字就是指第几颗CPU上。这个命令是查看进程的名称、PID以及CPU的占用率。psr表示绑定内核线程的处理器(如果有)的逻辑处理器号。 对一个进程来说,如果它的线程全都绑定到同一处理器上,那么显示该字段。pcpu表示CPU的占用率。comm表示进程名称。pid表示进程的ID号
watch -n.5 'ps axo comm,pid,psr | grep nginx'
yum install httpd-tools
ab -n 100000 -c 100 http://IP/index.html
#这时可以看到上面监测的绑定CPU数字在变化,因为CPU与进程没有绑定
vim /etc/nginx/nginx.conf
#这时在配置文件中加入绑定设置,定义在全局段
worker_cpu_affinity auto;
#自动绑定CPU
worker_rlimit_nofile 65536;
#如果不加入worker打开文件数量的上限,检查语法时会有报错,提示最多打开1024。定义在全局段
worker_priority -5;
#调整优先级
watch -n.5 'ps axo comm,pid,psr,ni | grep nginx'
#可以看到优先级改为了-5
nginx -t
nginx -s reload
vim /etc/hosts
192.168.1.15 www.ruopu.com
systemctl stop firewalld
setenforce 0
ab -n 100000 -c 100 http://IP/index.html
#这时监测页面的CPU数字是不会变化的,因为已经绑定了,显示的内容中第一个是主控进程,只看后四个即可
vim /etc/nginx/nginx.conf
worker_cpu_affinity 1000 0100 0010 0001;
#绑定第0到3颗CPU,因为CPU是四核的。这时监测页面显示绑定在0-3的CPU上
vim /etc/nginx/nginx.conf
worker_processes 2;
worker_cpu_affinity 1000 0100;
nginx -s reload
#再查看监测页面,这里只绑定在2颗CPU上

设置访问权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
vim /etc/nginx/conf.d/vhost1.conf
server {
listen 80;
server_name www.ruopu.com;
root /data/nginx/vhost1;
location / {
deny 192.168.1.22;
allow all;
#location定义对根及以下的路径的访问拒绝22地址访问,allow也一样,可以用一个地址或一个网段/24或all
}
}
nginx -s reload
访问IP
vim /etc/nginx/conf.d/vhost1.conf
server {
listen 80;
server_name www.ruopu.com;
root /data/nginx/vhost1;
location ~* \.(jpg|png) {
deny 192.168.1.22;
allow all;
}
}
//对目录中的jpg或png文件,拒绝22地址访问。location中定义的地址是在root定义的地址的下面的路径
nginx -s reload
find /usr/share -iname "*.jpg" -exec cp {} /data/nginx/vhost1 \;
访问测试,www.ruopu.com/morning.jpg
如果location中定义了root,那么以location中的root为准
=====================================================================================
#在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;

location [ = | ~ | ~* | ^~ ] uri { ... }
Sets configuration depending on a request URI.
=:对URI做精确匹配;例如, http://www.magedu.com/, http://www.magedu.com/index.html,如果等于根,那么就只有根被匹配,如果没有等号,那么从根以下的所有路径都匹配。
location = / {
...
}
~:对URI做正则表达式模式匹配,区分字符大小写;
~*:对URI做正则表达式模式匹配,不区分字符大小写;
^~:对URI的左半部分做匹配检查,不区分字符大小写;也就是以什么开头
不带符号:匹配起始于此uri的所有的url;
匹配优先级:=, ^~, ~/~*,不带符号;

定义别名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mkdir /data/pictures
cp fish.jpg /data/pictures
vim conf.d/vhost1.conf
location ^~ /images/ {
#^~是指以其后设定的内容开头的,但这里没有什么用
root /data/pictures;
}
#这时访问www.ruopu.com/images/fish.jpg提示404,上面定义的应该是在pictures中找images目录,然后再找文件。/data/pictures就相当于根,在根下再打开images目录
mkdir /data/pictures/images
mv /data/pictures/*.jpg /data/pictures/images
访问www.ruopu.com/images/flower.jpg
vim conf.d/vhost1.conf
location ^~ /images/ {
alias /data/pictures/;
}
#将root改为alias。别名中的pictures右边的斜线是相对于images右侧的斜线来说的。所以,上面别名/data/pictures/最右边的斜线一定不能少,不然就不能访问到。
nginx -s reload
访问www.ruopu.com/images/fish.jpg才有,flower.jpg是访问不到的。因为在pictures中只有fish.jpg文件,没有flower.jpg文件。root是对于左侧的斜线,alias是对于最右侧的斜线来说的。

自定义错误页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vim /etc/nginx/conf.d/vhost1.conf
server {
listen 80;
server_name www.ruopu.com;
root /data/nginx/vhost1;
location ~* \.(jpg|png) {
error_page 404 =200 /notfound.html;
#notfound.html是URL的地址,它的位置是root定义的,因为加了等于200,所以这改变了状态码,在浏览器中按F12时可以看到是200了。测试使用等于200的设置会提示错误的值,原因是在200与其前面的等号中间加了空格,去掉空格就正常了。notfound.html应该是自定义的名字,但定义的名字与location指定的名字,与root定义的目录中的*.html文件的名字,这三个名字要一致,不然访问不了。error_page定义一次即可,这里只是展现了两种方法。
error_page 404 /notfound.html;
location = /notfound.html {
root /data/nginx/error_pages;
}
location ^~ /images/ {
alias /data/pictures/;
}
}
mkdir /data/nginx/error_pages
vim /data/nginx/error_pages/notfound.html
404
nginx -s reload
访问www.ruopu.com/test.html,这是一个不存在的页面

认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
yum install httpd-tools
htpasswd -c -m /etc/nginx/.ngxpasswd tom
htpasswd -m /etc/nginx/.ngxpasswd jerry
vim /etc/nginx/conf.d/vhost1.conf
server {
listen 80;
server_name www.ruopu.com;
root /data/nginx/vhost1;
error_page 404 /notfound.html;
location = /notfound.html {
root /data/nginx/error_pages;
}
location ^~ /images/ {
alias /data/pictures/;
}
location ~* ^/(admin|login) {
#~*做正则表达式模式匹配,如果以admin或login开头,就进行认证。当然,这也要求在vhost1中有这个目录才行。
auth_basic "admin area or login url";
#使用ngx_http_auth_basic_module模块实现基于用户的访问控制,使用basic机制进行用户认证;"admin area or login url"是一段自定义提示信息。
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
}
mkdir /data/nginx/vhost1/admin
vim /data/nginx/vhost1/admin/index.html
admin aera
nginx -s reload
访问www.ruopu.com/admin,如果访问的是www.ruopu.com/login就会失败,因为在vhost1中没有login目录。

状态页

1
2
3
4
5
6
7
8
9
10
11
vim /etc/nginx/conf.d/vhost1.conf
location /ngxstatus {
#这里的ngxstatus也是自定义的名称,定义什么名字,访问时就用什么名字
stub_status;
#stub_status是一个系统变量
}
#ngxstatus是自定义名称,还可以在其中加认证或allow、deny。location后面定义的是URL名,也是路径名
nginx -s reload
访问www.ruopu.com/ngxstatus。
curl --silent http://www.ruopu.com/ngxstatus | awk '^Active/{print $3}'
#测试此条命令后的awk用法有问题,在^Active上。

压缩功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vim /etc/nginx/nginx.conf    
http {
gzip on;
gzip_min_length 1k;
#不压缩临界值,大于1K的才压缩,一般不用改
gzip_buffers 4 16k;
#支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小;
gzip_comp_level 6;
#压缩级别,1-10,数字越大压缩的越好,时间也越长
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
#进行压缩的文件类型,缺啥补啥就行了,JavaScript有两种写法,最好都写上吧,总有人抱怨js文件没有压缩,其实多写一种格式就行了
gzip_disable "MSIE [1-6]\.";
#IE6对Gzip不怎么友好,不给它Gzip了
}
nginx -s reload
cp nginx.conf /data/nginx/vhost1/nginx.html
chmod +r /data/nginx/vhost1/nginx.html
curl -I -H "Accept-Encoding: gzip, deflate" "http://www.ruopu.com/images/morning.jpg"
#如果对访问的内容进行了压缩,在结果中会有Content-Encoding: gzip的字样。