nginx(2)

因为之前做的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地址作为键。注意,这里使用的是 b i n a r y r e m o t e a d d r remote_addr变量。
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 ^/(.*) h t t p s : / / w w w . w e s t o s . o r g / 1 redirect; 意思是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 ^/(.*) 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 / 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

这里写图片描述

定时任务:
这里写图片描述

实验:执行一下看看:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/xixlxl/article/details/80146639