nginx2

虚拟主机

一个web服务器软件(如:nginx)默认情况下只能发布一个web,因为web网站三要素:IP地址,端口,域名。此时只有一个网站时,就叫默认网站。

虚拟主机就是把一台物理服务器划分成多个“虚拟”的服务器,每一个虚拟主机都可以有独立的域名和独立的目录。简单来说就是使用一个web服务器软件同时发布多个网站。每一个虚拟主机对应一个web。

发布多个web就要在三要素中寻找差异了

基于IP的虚拟主机

同时发布两个网站

网站根目录(DocumentRoot):

  • /usr/local/nginx/html/web1
  • /usr/local/nginx/html/web2

使用逻辑网卡的方式增加一个子网卡:ifconfig ens33:1 192.168.112.120/24 up

关闭子 网卡:ifconfig ens33:1 down

配置虚拟主机:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       192.168.112.128:80;
        server_name  localhost;
        location / {
            root   html/web1;
            index  index.html index.htm;
        }
    }
    server {
        listen       192.168.112.120:80;
        server_name  localhost;
        location / {
            root   html/web2;
            index  index.html index.htm;
        }
    }

}

启动虚拟主机:

测试虚拟主机:

基于端口的虚拟主机

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        location / {
            root   html/web1;
            index  index.html index.htm;
        }
    }
    server {
        listen       8080;
        location / {
            root   html/web2;
            index  index.html index.htm;
        }
    }

}

基于域名的虚拟主机

一个网站必然有一个域名。

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.abc.com;
        location / {
            root   html/web1;
            index  index.html index.htm;
        }
    }
    server {
        listen       80;
        server_name  www.def.com;
        location / {
            root   html/web2;
            index  index.html index.htm;
        }
    }

}

在测试的时候可以配置域名解析文件,这个是我们可以去随意更改的
vim /etc/hosts

访问测试:

可以不用买服务器,买个网站空间来发布web,费用很便宜。

使用环境

基于IP:每个网站都需要一个IP,如果是公网IP,每个IP都需要付费。
基于端口:只需要一个IP,缺点是端口无法告诉公网用户,无法适用于公网用户,只适合于内部用户。
基于域名:多个域名指向一个服务器软件的不同虚拟主机。

反向代理

方向代理,代理的是服务器。客户机在发送请求时,不会直接发送到目的主机,而是先发送到代理服务器,代理服务器接收客户机的请求后,向目标主机发出,并接收目的主机返回的数据,存放在代理服务器后,再发送到客户机。

反代服务器配置

对百度增加一个反向代理,端口默认80,其ip地址是:

代理服务器的ip地址是:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://14.215.177.38:80;  # 访问我的根目录要数据的时候,反代去指定的地址要数据。
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

在本地win10机器上进行测试:

反代服务器配置优化

我们配置了代理服务器后,业务服务器并不知道真实的用户是谁,只能知道是代理服务器在拿数据。
代理服务器可以配置请求头,告知业务服务器是替谁(真实用户)来拿数据。是给反代服务器配置的请求头,在访问业务服务器时候的请求。

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://14.215.177.38:80;
            proxy_set_header X-Real-IP $remote_addr;  # 增加请请求头
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 增加请求头
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

限速

限速介绍

  1. 限速可以限制某一用户在一个给定的时间段内能够产生的HTTP请求数。
  2. 在安全上,可以通过限制进来的请求速率,并且结合日志标来帮助防范DDos攻击。
  3. 保护IO,所有人都下载,机器扛不住。
    一般的来说,限速是保护应用服务器不会被在同一时刻的大量用户请淹没。

限速原理


限速实现

limit_req_zone 用来限制单位时间内的请求数,即速率限制。

限制同一IP并发为1,下载速度为100k

limit_conn_zone $binary_remote_addr zone=addr:10m
location /abc {
  limit_conn addr 1;  # 限制同时下载的数量,并发的数量
  limit_rate 100k;  # 限制下载速度
  # limit_rate_after 100m; # 在下载到100m时开始限速。  
}

limit_req_conn 用来限制同一时间连接数,即并发限制。

URL重写

应用场景

  • 域名变更,使用就域名,就跳转到了新域名,平稳的过渡到新域名。
    如京东,旧域名是https://www.360buy.com/,在网址栏输入就会自动跳转到京东新的域名。
  • 用户跳转,从某个连接跳转到另一个连接。
    老连接已经没了,变成了新连接。用户不知道变更,重写跳转就行了。
  • 伪静态场景,便于CDN缓存动态页面数据。

重写原理

  1. 客户机发送url到nginx
  2. nginx将url重写,告诉客户端一个新的url
  3. 客户机通过新的url与业务服务器进行交互

实现

URL模块语法

set 设置变量
if 语句的判断
return 返回 返回值或URL
break 终止后续的rewrite规则,后续的规则就不执行
rewrite  重定向url

set

将任何网址跳转到百度上

location / {
  set $name hehe;
  rewrite ^(.*)$ http://www.baidu.com/s?wd=$name;
}

在本地访问nginx服务器任何地址,直接跳转到百度的界面

if

模糊匹配:~ 匹配; !~ 不匹配; ~* 不区分大小写匹配;
精确匹配:= !=

是谷歌浏览器不返回数据。

location / {
  if ($http_user_agent ~* 'chrome') {
      return 403;
  }
}

posted on 2021-11-23 22:16  爱吃沙拉的狮  阅读(32)  评论(0)    收藏  举报