虚拟主机
一个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;
}
}
}
限速
限速介绍
- 限速可以限制某一用户在一个给定的时间段内能够产生的HTTP请求数。
- 在安全上,可以通过限制进来的请求速率,并且结合日志标来帮助防范DDos攻击。
- 保护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缓存动态页面数据。
重写原理
- 客户机发送url到nginx
- nginx将url重写,告诉客户端一个新的url
- 客户机通过新的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;
}
}

浙公网安备 33010602011771号