因为之前做的nginx删除了,所以只好重新编译了
[root@host5 ~]# tar zxf echo-nginx-module-0.61.tar.gz
###带回会用到这里先解压,进行编译,后边回提到
[root@host5 ~]# tar zxf nginx-1.10.1.tar.gz
[root@host5 ~]# tar zxf nginx-sticky-module-ng.tar.gz
[root@host5 ~]# cd nginx-1.10.1
[root@host5 nginx-1.10.1]# vim src/core/nginx.h
14 #define NGINX_VER "nginx" ##去处版本号
[root@host5 nginx-1.10.1]# vim auto/cc/gcc
179 #CFLAGS="$CFLAGS -g" ##不用debug
[root@host5 nginx-1.10.1]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-sticky-module-ng --add-module=/root/echo-nginx-module-0.61
##如果报错解决依赖再来编译yum install pcre-devel
make && make install
编译安装成功
开始实验
一.进入到/usr/local/nginx
cd /usr/local/nginx/
cd conf
nginx.conf 配置文件
1.全局基本设置(以下主要围绕nginx.conf展开)
vim /usr/local/nginx/conf/nginx.conf
2 user nginx; ##指定nginx工作用户
3 worker_processes auto; ##cpu工作数自动
ln -s /usr/local/sbin/nginx /usr/bin/ ##非必要只是为了方便
useradd -s /sbin/nologin nginx ##新建nginx用户
nginx ##启动nginx
ps ax 查看下
ok,没问题
2.全局日志,
5 #error_log logs/error.log;
6 #error_log logs/error.log notice;
7 #error_log logs/error.log info;
8 #pid logs/nginx.pid;
3.全局文件缓存数,访问连接设置
12 events {
13 worker_connections 65535;
14 }
实际的缓存量等于 worker_connections * worker process
use eoll;随着连接数增加,性能基本上没有下降。处理成千上万并发连接时,性能很好。连接数无限制。
系统内核修改下文件缓存数量:/etc/security/limits.conf 即改即生效
vim /etc/security/limits.conf
nginx - nofile 65535
/etc/security/limits.conf
core- 限制内核文件的大小(kb)
date- 最大数据大小(kb)
fsize - 最大文件大小(kb)
memlock - 最大锁定内存地址空间(kb)
nofile - 打开文件的最大数目
rss - 最大持久设置大小(kb)
stack- 最大栈大小(kb)
cpu - 以分钟为单位的最多 CPU 时间
noproc - 进程的最大数目
as- 地址空间限制
maxlogins - 此用户允许登录的最大数目
elasticsearch 配置相关参数有三个:nofile、noproc和memlock。
4.主体
18 http {
19 include mime.types;
20 default_type application/octet-stream;
...
Nginx 会根据mime type定义的对应关系来告诉浏览器如何处理服务器传给浏览器的这个文件,是打开还是下载;默认的配置中default_type application/octet-stream; 这个就是默认为下载
4.1日志输出格式 main类型日志位置
22 #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
23 # '$status $body_bytes_sent "$http_referer" '
24 # '"$http_user_agent" "$http_x_forwarded_for"';
25
26 #access_log logs/access.log main;
4.2sendfile tcp_nopush tcp_nodelay
28 sendfile on;
29 #tcp_nopush on;
30
sendfile:
设置为on表示启动高效传输文件的模式。sendfile可以让Nginx在传输文件时直接在磁盘和tcp socket之间传输数据。如果这个参数不开启,会先在用户空间(Nginx进程空间)申请一个buffer,用read函数把数据从磁盘读到cache,再从cache读取到用户空间的buffer,再用write函数把数据从用户空间的buffer写入到内核的buffer,最后到tcp socket。开启这个参数后可以让数据不用经过用户buffer。硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈 设为on 直接从硬盘数据传输到协议栈tcp_nopush
linux 下是tcp_cork,上面的意思就是说,当使用sendfile函数时,tcp_nopush才起作用,它和指令tcp_nodelay是互斥的。tcp_cork是linux下tcp/ip传输的一个标准了,这个标准的大概的意思是,一般情况下,在tcp交互的过程中,当应用程序接收到数据包后马上传送出去,不等待,而tcp_cork选项是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞,已经是默认了。
也就是说tcp_nopush = on 会设置调用tcp_cork方法,这个也是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。如果开着这个选项,你的nginx发送的包都是满的。包都是满的,那ACK就少,网络不就利用起来了么tcp_nodelay:
禁用Nagle算法,有东西就发。联合使用说明:
tcp_nodelay = on
tcp_nopush = off
socket有包就发,不管大小。
tcp_nodelay = off
tcp_nopush = on
启用Nagle算法,小包来了,一直等着,直到凑成满的才发。到数据流的最后一段了,实在是没数据了,最后一个小包等0.2s才决定发出去,开启了Nagle算法,下载一个文件,就有可能有个200ms的延迟
tcp_nodelay = on
tcp_nopush = on
启用Nagle算法,小包来了,一直等着,直到凑成满的才发。到数据流的最后一段了,nginx直接去掉了tcp_nopush,最后一个小包立刻就发出去了,就避免了200ms的一个延迟。
4.3 keepalive_timeout
32 #keepalive_timeout 0;
33 keepalive_timeout 65; ##持续连接
4.4server {}具体的服务器站点
37 server {
38 listen 80;
39 server_name localhost;
40
41 #charset koi8-r;
42 ....
5.限制带宽和并发
34 limit_conn_zone $binary_remote_addr zone=addr:10m; 限制下载带宽10m,注意位置,这行限速时在http下
50 location /download {
51 limit_conn addr 1; 设置并发连接数1
52 }
##server里边
nginx -t ##检测下
nginx -s reload ##没问题了重新加载
mkdir //usr/local/nginx/html/download
往里边张图片
客户端的IP地址作为键。注意,这里使用的是 binaryremoteaddr变量,而不是 b i n a r y r e m o t e a d d r 变 量 , 而 不 是 remote_addr变量。
remoteaddr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。 r e m o t e a d d r 变 量 的 长 度 为 7 字 节 到 15 字 节 , 而 存 储 状 态 在 32 位 平 台 中 占 用 32 字 节 或 64 字 节 , 在 64 位 平 台 中 占 用 64 字 节 。 binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
1M共享空间可以保存3.2万个32位的状态,1.6万个64位的状态。
如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误
浏览器访问
http://172.25.254.5/download/vim.jpg
压力测试1(忽略版本号,刚才在编译的时候由于没指定路径,只好重新编译了下,忘记了进行版本号的隐藏)
ab -c1 -n10 http://172.25.254.5/download/vim.jpg
查看日志:
[root@host5 conf]# tail -f ./../logs/access.log
测试2:设置两个并发,20个请求
[root@host5 conf]# tail -f ./../logs/access.log
查看日志
[root@host5 conf]# >./../logs/access.log
[root@host5 conf]# tail -f ./../logs/access.log
6.limit_req_zone对同一IP访问进行限流
35# limit_conn_zone $binary_remote_addr zone=addr:10m;
36 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
52 location /download/ {
53 # limit_conn addr 1;
54 limit_rate 50k;
55 limit_req zone=one burst=5;
56 }
nginx -t
nginx -s reload
区域名称为one(自定义),占用空间大小为10m,平均处理的请求频率不能超过每秒一次。
上面定义的rate=1r/s,即每秒钟只处理1个请求。执行rate=1r/s的配置,即只处理一个请求,然后下一秒钟再处理另外一个请求。直观的看就是页面数据卡了,过了一秒后才加载出来。
真正对限流起作用的配置就是rate=1r/s和burst=5这两个配置。
某一时刻有两个请求同时到达nginx,其中一个被处理,另一个放到了缓冲队列里。直到burst空间占用超过5之后,再来请求就会直接被nginx拒绝,返回503错误码。
如果第二秒又来了两个请求,其中一个请求又占用了一个burst空间,第三秒、第四秒直到第五秒,每秒都有两个请求过来,虽然两个请求都被处理了(因为配置了nodelay),但其中一个请求仍然占用了一个burst长度,五秒后整个burst长度=5都被占用了。第六秒再过来两个请求,其中一个请求就被拒绝了。
压测1:
[kiosk@foundation51 Desktop]$ ab -c1 -n10 http://172.25.254.5/download/vim.jpg
[root@host5 conf]# >./../logs/access.log
[root@host5 conf]# tail -f ./../logs/access.log
都可以访问到:
压测2:
ab -c6 -n10 http://172.25.254.5/download/vim.jpg
7.gzip
8.https
105 # HTTPS server
106
107 server {
108 listen 443 ssl;
109 server_name localhost;
110
111 ssl_certificate cert.pem;
112 ssl_certificate_key cert.pem;
113
114 ssl_session_cache shared:SSL:1m;
115 ssl_session_timeout 5m;
116
117 ssl_ciphers HIGH:!aNULL:!MD5;
118 ssl_prefer_server_ciphers on;
119
120 location / {
121 root html;
122 index index.html index.htm;
123 }
124 }
125
nginx
新建ssl凭证
cd /etc/pki/tls/certs/
make cert.pem
填写相应的信息
cn
shaaxi
xi'an
westos
linux
host5
root@localhost
完成后移动生成的凭证到/usr/local/nginx/conf/下,然后重启nginx服务
mv /cert.pem /usr/local/nginx/conf
nginx -s reload
netstat -antlp ##查看443的端口
浏览器查看:
https://172.25.254.5
9.虚拟主机
125 server {
126 listen 80;
127 server_name www.westos.org;
128
129 location /{
130 root /www;
131 index index.html;
132 }
133 }
新建虚拟主机发布目录和默认页
mkdir /www
echo "www.westos.org's index.html" >/www/index.html
客户端添加解析浏览器测试:
vim /etc/host
www.westos.org
10.重定向问题:
10.1永久定向https
129行 rewrite ^/(.*) https://www.westos.org/ h t t p s : / / w w w . w e s t o s . o r g / 1 redirect; 意思是www.westos.org/ 1都永久转到https://www.westos.org/ 1 都 永 久 转 到 h t t p s : / / w w w . w e s t o s . o r g / 1
客户端浏览器测试:
https://www.westos.org
curl -I www.westos.org
10.2定向到另一虚拟主机
新建虚拟主机默认发布目录和发布页
mkdir /bbs
echo "bbs的默认页 index.html" >/bbs/index.html
创建虚拟主机
135 server {
136 listen 80;
137 server_name bbs.westos.org;
138 charset utf-8;
139
140 location /{
141 root /bbs;
142 index index.html;
143 }
144 }
nginx -s reload
浏览器访问:
bbs.westos.org
10.4现在有两台虚拟主机
注释掉https,非必要,看上去可以干净些
下边的操作都是在两台虚拟主机之间
129行 rewrite ^/bbs$ http://www.westos.org; 表示www.westos.org/*/bbs 总之只要是以/bbs结尾的都转到http://www.westos.org
131行rewrite ^/lel/(.)$ http://www.westos.org permanent; 针对www.westos.org/lel/ 的域名转到http://www.westos.org ,permanent表示永久定向
132 rewrite /*bbs$ http://bbs.westos.org; 表示www.westos.org/*bbs结尾的域名定向到http://bbs.westos.org;
141行 rewrite ^/(.*)
http://172.25.254.5/download/
h
t
t
p
:
/
/
172.25.254.5
/
d
o
w
n
l
o
a
d
/
1; 表示任何bbs.westos.org/
1结尾的域名转到//172.25.254.5/download/
1
结
尾
的
域
名
转
到
/
/
172.25.254.5
/
d
o
w
n
l
o
a
d
/
1
11.限制ip访问
172.25.254.5是可以访问nginx的
39 server {
40 listen 80 default;
41 #server_name localhost;
42 return 503;
nginx -s reload
在访问一下
不用503直接转到www.westos.org
39 server {
40 listen 80 default;
41 #server_name localhost;
42 #return 503;
43 rewrite ^(.*) http://www.westos.org;
nginx -s reload
浏览器测试的话会直接调转,效果不明显
当访问172.25.254.5时,定向到www.baidu.com
12.访问控制(下边的操作加再加模块echo-nginx-module-0.61.tar.gz )
取消限制ip访问
全局的话些在http下,个别主机的话些在server下
限制172.25.254.51对www.westos.org的访问
限制172.25.254.51对www.westos.org/.sh和.py以及.php文件的访问,但是可以访问其他文件
事实上在重新加载的时候,没报错,但不生效,上途中141行的~不是英文状态下的,
13.防盗链
host6安装nginx这里直接考份给host6
scp -rp /usr/local/nginx/ root@172.25.254.6:/usr/local/
host6
useradd -s /sbin/nologin nginx
ln -s /usr/loval/nginx/sbin/nginx /usr/bin/
nginx
新建一个虚拟机;设置发布目录发布页
129 server {
130 listen 80;
131 server_name www.host6.com;
132 charset utf-8;
133
134 location /{
135 root /host6;
136 index index.html;
137 }
138 }
139 }
配置发布目录发布页
<html>
<body>
<br><h4>盗链</h4></br>
<img src="http://www.westos.org/image/vim.jpg">
</body>
</html>
host5操作
[root@host5 ~]# mkdir /www/image
[root@host5 ~]# cp /usr/local/nginx/html/download/vim.jpg /www/image/
客户端别忘记了添加解析172.25.254.6 www.host6.com
测试:到去host5的图片成功
www.host6.com
host5防盗链操作:
129 server {
130 listen 80;
131 server_name www.westos.org;
132 root /www; ##根目录提前
133
134 location /{
135 root /www;
136 index index.html;
137 }
138 location ~.*\.(jpg|png)$ {
#expires 30d; ##过期时间30天
139 valid_referers none blocked www.westos.org;
140 if ($invalid_referer){
141 # return 403;
142 rewrite ^/ http://172.25.254.5/download/wx.jpg; ##注意空格哦
143 }
144 }
145 }
当host6,www.host6.com试图链接host6的/www/image/vim.jpg的时候,host5将其访问重定向到nginx的发布目录中的子目录download中,去获取wx.jpg这个图
14.nginx rewrite 指令last break区别
rewrite 可以在 server location 块, 正则比配的时候才重写,所以多条 rewrite 顺序靠前且匹配的优先执行。
break跳出rewrite阶段,不会在匹配,进入输出阶段。 last 类似重新发起请求,所以会重新进行匹配。
last: 停止当前这个请求,并根据rewrite匹配的规则重新发起一个请求。新请求又从第一阶段开始执行…
break:相对last,break并不会重新发起一个请求,只是跳过当前的rewrite阶段,并执行本请求后续的执行阶段…
例子
mkdir /www/test
echo test >/www/test/index.html
129 server {
130 listen 80;
131 server_name www.westos.org;
132 default_type text/html;
133
134
135 location /{
136 if (-f $request_filename){
137 break;
138 }
139 rewrite ^/bbs$ http://bbs.westos.org;
140 rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1;
141 root /www;
142 index index.html;
143 echo "hello world";
144 }
145
146 location /break/ {
147 rewrite ^/break/(.*) /test/$1 break;
148 echo "break page";
149 }
150
151 location /last/ {
152 rewrite ^/last/(.*) /test/$1 last;
153 echo "last page";
154 }
155
156 location /test/ {
157 echo "test page";
158 }
159 }
160 server {
161 listen 80;
162 server_name bbs.westos.org;
163 charset utf-8;
164
165 location /{
166 root /bbs;
167 index index.html;
168 }
169 }
浏览器:
客户端请求www.westos.org 后边是空的,136行判断,请求的文件名不存,不执行break(不跳出重写规则),执行139行rwrite规则,然而不满足匹配进行下一条,还是不匹配,继而输出也就是143行echo语句
www.westos.org
实验2
http://www.westos.org/bbs
同样136行判断bbs文件确实不存在(/www/)执行rewrite语句满足匹配到rewrite规则的第一条,定向到http://bbs.westos.org 直接输出
![]()
![]()
很快就跳转,curl看下
实验3:
www.westos.org/bbs/123
浏览器会报404,肯定的了,bbs.westos.org/就没123文件,curl可以看出302临时重定向了,执行的是140条rewrite,可以给139永久重定向,实验效果更明显
实验4:
http://www.westos.org/break/**
当访问域名为www.westos.org/break/** ,break跳过当前请求的rewrite阶段,并继续执行本请求的其他阶段
![]()
实验5:
http://www.westos.org/last/
last会重新发起一个新请求,并重新匹配location,所以对于/last,重新匹配请求以后会匹配到/test/,所以最终对应的content阶段的输出是test page;
![]()
15stub_status模块
160 server {
161 listen 80;
162 server_name bbs.westos.org;
163 charset utf-8;
164
165 location /{
166 root /bbs;
167 index index.html;
168 }
169 location /status{
170 stub_status on;
171 access_log off;
172 }
173 }
查看nginx时候有安装该模块。
/usr/local/nginx/sbin/nginx -V
注意是大写的V,小写的v是查看版本信息的
浏览器访问:
http://bbs.westos.org/status
返回各数据项说明:
Active connections: 当前nginx正在处理的活动连接数.
Server accepts handled requests request_time: nginx总共处理了13057 个连接,成功创建13057 握手(证明中间没有失败的),总共处理了11634 个请求,总共请求时间2230854。
Reading: nginx读取到客户端的Header信息数.
Writing: nginx返回给客户端的Header信息数.
Waiting: 开启keep-alive的情况下,这个值等于 active – (reading + writing),意思就是nginx已经处理完成,正在等候下一次请求指令的驻留连接。
所以,在访问效率高,请求很快被处理完毕的情况下,Waiting数比较多是正常的.如果reading +writing数较多,则说明并发访问量非常大,正在处理过程中。
日志脚本
vim /opt/nginxlog.sh
cd /usr/local/nginx/logs && /bin/mv access.log access_$(date +%F -d -1day)
chmod +x /opt/nginxlog.sh
定时任务:
实验:执行一下看看: