2.23日学习打卡
目录:
- 2.23日学习打卡
- 一. Nginx 虚拟主机
- 虚拟主机的分类
- Nginx支持三种类型的虚拟主机配置
- Nginx虚拟主机单网卡多IP配置
- Nginx虚拟主机_基于域名虚拟主机配置
- Nginx虚拟主机基于多端口的配置4
- 二. Nginx 核心指令
- root和alias指令的区别
- return指令
- rewrite指令
- rewrite实战域名跳转
- if指令
- set和break指令
- Gzip压缩指令
一. Nginx 虚拟主机
概述
虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响的。
虚拟主机的分类
Nginx支持三种类型的虚拟主机配置
基于IP的虚拟主机
基于端口的虚拟主机
基于域名的虚拟主机
Nginx虚拟主机单网卡多IP配置
通过不同的IP区分不同的虚拟主机,此类虚拟主机对应的企业应用非常少见,一般不同业务需要使用多IP的常见都会在负载均衡器上进行VIP绑定,而不是在Web上通过绑定IP区分不同的虚拟机。
需求
一台Linux服务器绑定两个ip:192.168.66.100、192.168.66.101 访问不同的ip请求不同的html目录,即: 访问http://192.168.66.100将访问“html101”目录下的html网页 访问http://192.168.66.101将访问“html99”目录下的html网页
Linux绑定多IP
Linux操作系统允许绑定多IP。是在一块物理网卡上可以绑定多个lP地址。这样就能够在使用单一网卡的同一个服务器上运行多个基于IP的虚拟主机。但是在绑定多IP时需要将动态的IP分配方式修改为静态的指定IP。
将动态IP修改为静态IP
[root@node1 ~]# cd /etc/sysconfig/network-scripts
[root@node1 network-scripts]# ls
ifcfg-ens33
[root@node1 network-scripts]# vim ifcfg-ens33
BOOTPROTO="static"
IPADDR0=192.168.66.100
IPADDR1=192.168.66.101
[root@node1 network-scripts]# service network restart # centos6、7重启网卡
[root@node1 ~]# systemctl restart network #centos7重启网卡
[root@node0 network-scripts]#reboot #各种发行版都是可以的
#CentOS8重启网卡 nmcli c reload ens33
修改Nginx的配置文件完成基于IP的虚拟主机配置
Nginx的配置文件nginx.conf
如上述配置文件所示,主要由5个部分组成:
main:用于进行nginx全局信息的配置
events:用于nginx工作模式的配置
http:用于进行http协议信息的一些配置
server:用于进行服务器访问信息的配置
location:用于进行访问路由的配置
修改配置nginx.conf
[root@node1 network-scripts]# vim /usr/local/nginx/conf/nginx.conf
#一个Server就是一个虚拟主机
server {
listen 80;
#为虚拟机指定IP或者是域名
server_name 192.168.66.100;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root html100;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#一个Server就是一个虚拟主机
server {
listen 80;
#为虚拟机指定IP或者是域名
server_name 192.168.66.101;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root html101;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
Nginx虚拟主机_基于域名虚拟主机配置
需求
两个域名指向同一个nginx服务器,用户访问不同的域名时显示不同的内容。
域名规划:
1, www.baidu.com => 前台
2, www.jiangyu.website =》 后台
修改windows的hosts文件配置域名与ip的映射
文件路径:C:\Windows\System32\drivers\etc\hosts
192.168.66.100 www.baidu.com
192.168.66.100 www.jiangyu.website
修改nginx.conf配置文件
server {
listen 80;
#为虚拟机指定IP或者是域名
server_name www.baidu.cn;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root baidu;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#一个Server就是一个虚拟主机
server {
listen 80;
#为虚拟机指定IP或者是域名
server_name www.jiangyu.website;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root jiangyu;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
准备需要的目录和html页面:
mkdir baidu
cd baidu
echo "this is baidu" >index.html
mkdir jiangyu
cd jiangyu
echo "this is jiangyu" >index.html
重启Nginx服务
[root@node1 html]# ./nginx -s reload
Nginx虚拟主机基于多端口的配置4
通过不同的端口来区分不同的虚拟主机。此类虚拟主机对应的企业应用主要为公司内部的网站。
需求
Nginx对提供8888与9999两个端口的监听服务
请求8888端口则访问html8888目录下的index.html
请求9999端口则访问html9999目录下的index.html
还原IP地址为192.168.66.100:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
#将:
IPADDR0=192.168.66.100
IPADDR1=192.168.66.101
#改为
IPADDR=192.168.66.100
#重启网络服务
systemctl restart network
修改Nginx的配置文件完成基于端口的虚拟主机配置
#一个Server就是一个虚拟主机 基于端口
server {
listen 8888;
#为虚拟机指定IP或者是域名
server_name 192.168.66.100;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root html8888;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#一个Server就是一个虚拟主机
server {
listen 9999;
#为虚拟机指定IP或者是域名
server_name 192.168.66.100;
#主要配置路由访问信息
location / {
#用于指定访问根目录时,访问虚拟主机的web目录
root html9999;
#在不指定访问具体资源时,默认的展示资源的列表
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
准备需要的目录和html页面
mkdir html8888
cd html 8888
echo "this is html8888" >index.html
mkdir html9999
cd html 9999
echo "this is html9999" > index.html
二. Nginx 核心指令
root和alias指令的区别
区别
- 共同点 : root和alias两者都都是用来指定URI和磁盘文件的映射关系;
- 区别: root会将定义路径与URI叠加;而alias只取定义路径;
root示例
客户端请求www.test.com/images/1.jpg,则对应磁盘映射路径/opt/nginx/html/images/images/1.jpg
location /images {
root /opt/nginx/html/images;
index index.html index.htm;
}
注意:
也就是说使用root 请求的真实路径是 rootpath + /uri ,也就是文件目录 + URI / 后面的内容。
alias示例
客户端请求www.test.com/images/1.jpg,则对应磁盘映射路径/opt/nginx/html/images/1.jpg
location /images {
alias /opt/nginx/html/images/; //最后面一定要加 "/"
index index.html index.htm;
}
注意:
使用alias uri和文件路径进行了叠加,其实就是alias + 请求的文件
return指令
return功能
- 停止处理请求,直接返回响应码或重定向到其他URL;
- 执行return指令后,location中后序指令将不会被执行;
return语法结构
- return code [text]; # 如果返回2XX的,text才有意义,text会在body中;
- return code URL; #主要用于重定向;
- return URL; #须以http或者https开头的;
常用状态码:
200 请求成功
301 永久转移到其他URL
404 请求资源不存在
500 内部服务器错误
上下文
server | location | if
示例
code + text
location / {
return 200 'your success';
}
请求:
➜ nginx curl website.com
your success% //响应的内容
code + URL
#302 表示临时性重定向。访问一个Url时,被重定向到另一个url上。常#用于页面跳转。
location / {
return 302 /bbs;
}
location /bbs {
root html;
index index.html;
}
URL
直接重定向到了百度了
location / {
return http://baidu.com;
}
rewrite指令
地址重写与地址转发
地址重写
地址重写是实际上是为了实现址标准化,就像访问www.baidu.cn可以出现www.baidu.com的首页,服务器会把www.baidu.cn重写成www.baidu.com,浏览器的地址栏也会显示www.baidu.com。
地址转发
地址转发一般发生在同一站点项目内,而地址重写则没有限制。
总结:
- 地址转发后客户端浏览器地址栏中的地址显示是不改变的;而地址重写后客户端浏览器地址栏中的地址改变为服务器选择确定的地址。
- 在一次地址转发整个过程中,只产生一次网络请求;而一次地址重写一般会产生两次请求。地址转发一般发生在同一站点项目内;而地址重写没有该限制。
- 地址转发的速度较地址重定向快。
- 地址转发过程中,可以将客户端请求的request范围内的属性传递给新的页面,但地址重写不可以。
rewrite常用全局变量
变量 | 说明 |
---|---|
$args | 请求中的参数,如www.123.com/1.php?a=1&b=2的$args就是a=1&b=2 |
$body_bytes_sent | 服务器发送给客户端的响应body字节数 |
$content_length | HTTP请求信息里的"Content-Length" |
$conten_type | HTTP请求信息里的"Content-Type" |
$document_root | nginx虚拟主机配置文件中的root参数对应的值 |
$document_uri | 当前请求中不包含指令的URI,如www.123.com/1.php?a=1&b=2的$document_uri就是1.php,不包含后面的参数 |
$http_referer | 记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置 |
$host | 主机头,也就是域名 |
$http_user_agent | 客户端的详细信息,也就是浏览器的标识,用curl -A可以指定 |
$http_cookie | 客户端的cookie信息 |
$http_x_forwarded_for | 当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置 |
$limit_rate | 如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0 |
$remote_addr | 客户端的公网ip |
$remote_por | t 客户端的port |
$remote_user | 如果nginx有配置认证,该变量代表客户端认证的用户名 |
$request | 请求的URI和HTTP协议,如“GET /article-10000.html HTTP/1.1” |
$request_body_file | 做反向代理时发给后端服务器的本地资源的名称 |
$request_method | 请求资源的方式,GET/PUT/DELETE等 |
$request_filename | 当前请求的资源文件的路径名称,相当于是 d o c u m e n t r o o t / document_root/ documentroot/document_uri的组合 |
$request_uri | 请求的链接,包括 d o c u m e n t u r i 和 document_uri和 documenturi和args |
$scheme | 请求的协议,如ftp,http,https |
$server_protocol | 客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等 |
$server_addr | 服务器IP地址 |
$server_name | 服务器的主机名 |
$server_port | 服务器的端口号 |
$status | http状态码,记录请求返回的状态码,例如:200、301、404等 |
$uri | 和$document_uri相同 |
$http_referer | 客户端请求时的referer,通俗讲就是该请求是通过哪个链接跳过来的,用curl -e可以指定 |
$time_local | 记录访问时间与时区,如18/Jul/2014:17:00:01 +0800 |
rewrite指令
该指令通过正则表达式的使用来改变URI。可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理。
特别注意:
- URI ( Universal Resource Identifier,通用资源标识符),用于对网络中的各种资源进行标识,由存放资源的主机名、片段标志符和相对URI三部分组成。存放资源的主机名一般由传输协议. Scheme )、 主机和资源路径三部分组成;片段标志符指向资源内容的具体元素;相对URI表示资源在主机上的相对路径。一般格式为:
Scheme:[//][[用户名[:密码]@]主机名[:端口名]][/资源路径]
- URL (Uniform Resource Location,统一资源定位符),是用于在Internet中描述资源的字符串,是URI 的子集,主要包括传输协议(Scheme)、主机(IP、端口号或者域名)和资源具体地址(目录和文件名)等三部分。一般格式为:Scheme:/l主机名[:端口号][/资源路径]。
Scheme://主机名[:端口名]][/资源路径]
该指令可以在server快或者location块中配置,其语法结构为:
rewrite regex replacement [flag];
关键字 正则 替代内容 flag标记
注意:
regex,用于匹配URI的正则表达式。使用括号 “()” 标记要截取的内容。
rewrite参数的标签段位置:
server,location,if
常用正则表达式
字符 | 描述 |
---|---|
\ | 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或者多次 |
+ | 匹配前面字符串一次或者多次 |
? | 匹配前面字符串的零次或者一次 |
. | 匹配除“\n”之外的所有单个字符 |
(pattern) | 匹配括号内的pattern |
rewrite 最后一项flag参数:
标记符号 | 说明 |
---|---|
last | 本条规则匹配完成后继续向下匹配新的location URI规则 |
break | 本条规则匹配完成后终止,不在匹配任何规则 |
redirect | 返回302临时重定向 |
permanent | 返回301永久重定向 |
示例1
无论/search 后面跟什么内容,最后都会被永久重定向到百度页面
location /search {
rewrite ^/(.*) http://baidu.com permanent;
}
示例2
创建三个文件夹,每个文件夹下有个1.html文件;
location /images {
rewrite /images/(.*) /pics/$1; //•将URL /images/1.html 重写为 /pics/1.html
}
location /pics {
rewrite /pics/(.*) /photos/$1; //•将URL /pics/1.html 重写为 /photos/1.html
}
location /photos {
}
示例3
将URL /images/1.html 重写为 /pics/1.html, 并且不再匹配其他location段
location /images {
rewrite /images/(.*) /pics/$1 break;
}
示例4
将URL /images/1.html 重写为 /pics/1.html, 重新进入server段后匹配了/pics location段,然后又被重写。
location /images {
rewrite /images/(.*) /pics/$1 last;
}
rewrite实战域名跳转
Nginx的rewrite功能在企业里应用非常广泛:
- 可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
- 网址换新域名后,让旧的访问跳转到新的域名上。
- 根据特殊变量、目录、客户端的信息进行URL调整等。
域名跳转
旧域名www.test.com直接跳转到新域名www.baidu.com
server {
listen 80;
server_name www.test.com;
rewrite ^/(.*) http://www.baidu.com/$1 permanent;
}
server {
listen 80;
server_name www.baidu.com;
location / {
root html;
index index.html index.htm;
}
access_log logs/brian.log main gzip buffer=128k flush=5s;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
if指令
该指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置,可以在server块或locatio块中配置该指令。
语法结构:
if (condition) { ... }
其中,花括号代表一个作用域,形成一个if配置块,是条件为真时的Nginx配置。condition为判断条件( true/false ),它可以支持以下几种设置方法:
- 变量名-如果变量的值为空字符串或者“0”开头的任意字符串,if指令认为条件为false,其他情况为true,比如:
if ($slow) {
..... #Nginx配置
}
- 使用 “=”(等于) 和 “!=” (不等于) 比较变量和字符串是否相等,相等时if指令为条件为true,反之为false。
if ($request_method = POST) {
return 405;
}
注意:
这里的字符串不需要加引号。
变量与正则表达式
- ~ 表示匹配过程对大小写敏感
- ~* 表示匹配过程对大小写不敏感
- !~ 表示匹配失败是if指令认为条件为true否则为false
if ($http_user_agent ~ MSIE) {
# $http_user_agent 的值中是否包含MSIE字符串,如果包含,为 true
}
示例
判断ip地址是否为192.168.66.10如果是返回“test if ok in Url /serach”
location /search {
if ($remote_addr = "192.168.66.10"){
return 200 "test if ok in url search"
}
}
不允许谷歌浏览器访问,如果时候谷歌浏览器放回500
if ($http_user_agent ~ Chrome){
return 500;
}
set和break指令
set指令
该指令用于设置一个新的变量。
语法结构
set variable value
- variable,为变量的名称。注意要用符号“$”作为变量的第一个字符,且变量不能与Nginx服务器预设的全局变量同名。
- value,为变量的值,可以是字符串、其他变量或变量的组合等。
break指令
该指令用于中断当前相同作用域中的其他Nginx配置。
语法结构
break;
示例
location / {
if ($slow){
set $id $1 ; # 处于break指令之前,配置生效
break;
limit_rate 10k; #处于break指令之后,配置无效
}
}
Gzip压缩指令
Nginx开启Gzip压缩功能, 可以使网站的css、js 、xml、html 文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能!
Gzip压缩作用
将响应报⽂发送⾄客户端之前可以启⽤压缩功能,这能够有效地节约带宽,并提⾼响应⾄客户端的速度。Gzip压缩可以配置http,server和location模块下。Nginx开启Gzip压缩参数说明:
指令 | 含义 |
---|---|
gzip on | 决定是否开启gzip模块,on表示开启,off表示关闭; |
gzip_min_length 1k | 设置允许压缩的页面最小字节(从header头的Content-Length中获取) ,当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩。建议大于1k |
gzip_buffers 4 16k; | 设置gzip申请内存的大小,其作用是按块大小的倍数申请内存空间,param2:int(k) 后面单位是k。这里设置以16k为单位,按照原始数据大小以16k为单位的4倍申请内存 |
gzip_http_version 1.1 | ; 识别http协议的版本,早起浏览器可能不支持gzip自解压,用户会看到乱码 |
gzip_comp_level 2; | 设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大;等级1-9,最小的压缩最快 但是消耗cpu |
gzip_types text/plain application /x-javascripttext/css application /xml``; | 设置需要压缩的MIME类型,非设置值不进行压缩,即匹配压缩类型 |
gzip_vary on; | 启用应答头"Vary: Accept-Encoding" |
gzip_proxied off; | nginx做为反向代理时启用,off(关闭所有代理结果的数据的压缩),expired(启用压缩,如果header头中包括"Expires "头信息),no-cache(启用压缩,header头中包含"Cache-Control:no-cache") , no-store(启用压缩,header头中包含"Cache-Control:no-store" ),private(启用压缩,header头中包含"Cache-Control:private" ),no_last_modefied(启用压缩,header头中不包含 "Last-Modified" ),no_etag(启用压缩,如果header头中不包含"Etag" 头信息),auth(启用压缩,如果header头中包含"Authorization" 头信息) |
gzip_disable msie6; | (IE5.5和IE6 SP1使用msie6参数来禁止gzip 压缩 )指定哪些不需要gzip压缩的浏览器(将和User-Agents进行匹配),依赖于PCRE库 |
如下是线上常使用的Gzip压缩配置
http {
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
}
Nginx的Gzip压缩功能虽然好用,但是下面两类文件资源不太建议启用此压缩功能。
- 图片类型资源 (还有视频文件) 原因:图片如jpg、png文件本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费资源。
- 大文件资源 原因:会消耗大量的cpu资源,且不一定有明显的效果。
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!