Nginx静态资源站点
Nginx虚拟主机
虚拟主机指的就是一个独立的站点,具有独立的域名,有完整的www服务,例如网站、FTP、邮件等。
Nginx支持多虚拟主机,在一台机器上可以运行完全独立的多个站点。
nginx的多虚拟主机,可以基于
- 多域名的形式
- 多IP的形式
- 多端口的形式

一些草根流量站长,常会搭建个人站点进行资源分享交流,并且可能有多个不同业务的站点,如果每台服务器只运行一个网站,那么将造成资源浪费,成本浪费。
利用虚拟主机的功能,就不用为了运行一个网站而单独配置一个Nginx服务器,或是单独再运行一组Nginx进程。
虚拟主机可以在一台服务器,同一个Nginx进程上运行多个网站。
nginx.conf主配置文件中,最简单的一段虚拟主机配置如下
http{# 在平级关系内,编写第二个、第三个,server{}就是代表配置多个虚拟主机# 一个server{}标签就可以理解为是一个网站# 从上往下加载server {#监听端口 定义虚拟主机端口号,也是用户访问网站的入口listen 80;#填写域名匹配 没有域名,就是localhostserver_name localhost;#访问日志access_log logs/host.access.log main;#url匹配 如下的规则是最低级的规则,任何nginx的请求,都会进入如下的localhost配hi,去它所定义的目录中寻找资料。location / {# root是关键词,是定义网页的根目录,这个html是以nginx安装的路径为相对root html;# index关键词,定义nginx首页文件名字,默认找哪个文件index index.html index.htm;}}}
搭建一个静态资源网站
修改nginx.conf,自上而下找到第一个server{}指令块,修改如下
准备好资源文件目录,内容自定义[root@chaogelinux website]# pwd/website[root@chaogelinux website]# lsindex.html pic1.修改nginx.confserver {listen 80;server_name localhost;#默认编码charset utf-8;access_log logs/host.access.log main;location / {#定义虚拟主机的资源目录,root /website/;#定义首页文件的名字index index.html index.htm;}}2.重载nginx配置文件nginx -s reload
访问网站首页
http://123.206.16.61:80/index.html简写http://123.206.16.61/

访问网站图片资源
http://123.206.16.61/pic/2.jpg

访问gif动图
http://123.206.16.61/pic/1.gif

访问文本http://123.206.16.61/learn_linux.txt
静态资源压缩
nginx支持gzip对资源压缩传输,经过gzip压缩后的页面大小可以为原本的30%甚至更小,用户浏览体验会快很多。
准备好nginx静态资源[root@bogon html]# ll -htotal 1.2M-rw-r--r--. 1 root root 537 Feb 11 18:35 50x.html-rw-r--r--. 1 root root 1.2M Feb 11 19:06 apple.txt-rw-r--r--. 1 root root 612 Feb 11 18:35 index.html
开启gzip前,静态资源加载如下
nginx.conf开启gzip压缩功能,添加如下语句,针对静态资源压缩gzip on;gzip_http_version 1.1;# 等级越低,压缩效率越高,越消耗CPUgzip_comp_level 4;gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;#重载nginxnginx -s reload

开启了gzip压缩后,整体的传输资源大小,以及相应速度,都大幅度提高了
基于IP多虚拟主机
Linux操作系统都能够支持给网卡绑定多个IP地址,可以使得一块网卡上运行多个基于IP的虚拟主机。
环境准备
添加ip别名[root@bogon ~]# ifconfig ens33:1 192.168.178.200 broadcast 192.168.178.255 netmask 255.255.255.0 up#此时机器有2个ip,确保都可以通信即可[root@bogon ~]# ifconfig |grep 192inet 192.168.178.181 netmask 255.255.255.0 broadcast 192.168.178.255inet 192.168.178.200 netmask 255.255.255.0 broadcast 192.168.178.255[root@bogon ~]# curl 192.168.178.200[root@bogon ~]# curl 192.168.178.181修改nginx.conf文件,在http{}标签中添加最后一行,添加如下参数include extra/*.conf;
修改nginx.conf支持多虚拟主机
#第一个虚拟主机server {#监听的端口和iplisten 192.168.178.181:80;#主机域名server_name 192.168.178.181;charset utf-8;access_log logs/host.access.log;#url匹配location / {#HTML文件存放的目录root /website/s1;#默认首页文件,从左往右寻找,index.html或是index.htm文件index index.html index.htm;}}#第二个ip虚拟主机#第二个虚拟主机server {listen 192.168.178.200:80;server_name 192.168.178.200;location / {index index.html index.htm;root /website/s2;}}
分别准备好网站资源
[root@bogon nginx]# echo "我是来自于192.168.178.181的站点 s1.html" > /website/s1/index.html[root@bogon nginx]# echo "我是来自于192.168.178.200的站点 s2.html" > /website/s2/index.html
基于域名的多虚拟主机
基于多IP的虚拟主机可能会造成IP地址不足的问题,如果没有特殊需求,更常用的是基于多域名的形式。
只需要你单独配置DNS服务器,将主机名对应到正确的IP地址,修改Nginx配置,可以识别到不同的主机即可,这样就可以使得多个虚拟主机用同一个IP,解决了IP不足的隐患。
1.在本地hosts文件中,添加对应的解析记录,由于测试使用[root@bogon ~]# cat /etc/hosts|grep 127.0.0.1127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4127.0.0.1 www.chaogenginx.com127.0.0.1 www.chaogelinux.com
修改nginx.conf支持多域名的虚拟主机
1.第一个server{}指令块的配置server {#监听的端口和iplisten 80;#主机域名server_name www.chaogelinux.com;charset utf-8;access_log logs/host.access.log;#url匹配location / {#HTML文件存放的目录root /website/s1;#默认首页文件,从左往右寻找,index.html或是index.htm文件index index.html index.htm;}}2.第二个server{}的配置#第二个虚拟主机server {listen 80;server_name www.chaogenginx.com;location / {index index.html index.htm;root /website/s2;}}3.生成2个站点的首页echo "我是多域名虚拟主机,来自于域名www.chaogelinux.com" > /website/s1/index.htmlecho "我是来自于域名www.chaogenginx.com的多域名虚拟主机" > /website/s2/index.html
测试访问多域名
[root@bogon ~]# curl www.chaogelinux.com我是多域名虚拟主机,来自于域名www.chaogelinux.com[root@bogon ~]#[root@bogon ~]# curl www.chaogenginx.com我是来自于域名www.chaogenginx.com的多域名虚拟主机[root@bogon ~]#[root@bogon ~]#[root@bogon ~]# curl 127.0.0.1 #默认server{}匹配顺序,自上而下我是多域名虚拟主机,来自于域名www.chaogelinux.com
基于端口的多虚拟主机
基于端口的配置在生产环境比较少见,用于特殊场景,例如公司内部测试平台网站,使用特殊端口的后台,OA系统、网站后台,CRM后台等。
案例:运行基于80、81端口的虚拟主机运行
1.第一个虚拟主机server {#监听的端口和iplisten 80;#主机域名server_name www.chaogelinux.com;access_log logs/www.chaogelinux.log;charset utf-8;#url匹配location / {#HTML文件存放的目录root /website/s1/;#默认首页文件,从左往右寻找,index.html或是index.htm文件index index.html index.htm;#autoindex off;}}2.#第二个虚拟主机server {listen 81;server_name www.chaogenginx.com;access_log logs/www.chaogenginx.com;charset utf-8;location / {index index.html index.htm;root /website/s2;#autoindex on;}}3.nginx -s reload4.访问80、81端口[root@bogon nginx]# curl 127.0.0.1:81我是来自于域名www.chaogenginx.com的多域名虚拟主机[root@bogon nginx]# curl 127.0.0.1:80我是多域名虚拟主机,来自于域名www.chaogelinux.com<img src="./1.jpg"><img src="./2.jpg"><img src="./3.jpg"><head><link rel="shortcut icon" href="#"/></head>
Nginx访客日志功能
日志对于程序员很重要,可用于问题排错,记录程序运行状态,一个好的日志能够给与精确的问题定位。
Nginx日志功能需要在nginx.conf中打开相关指令log_format,设置日志格式,以及设置日志的存储位置access_log,指定日志的格式,路径,缓存大小。
nginx.conf中有关访客日志定义如下#alog_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log logs/access.log main;参数解释$remote_addr :记录访问网站的客户端地址$remote_user :记录远程客户端用户名称$time_local :记录访问时间与时区$request :记录用户的 http 请求起始行信息$status :记录 http 状态码,即请求返回的状态,例如 200 、404 、502 等$body_bytes_sent :记录服务器发送给客户端的响应 body 字节数$http_referer :记录此次请求是从哪个链接访问过来的,可以根据 referer 进行防盗链设置$http_user_agent :记录客户端访问信息,如浏览器、手机客户端等$http_x_forwarded_for :当前端有代理服务器时,设置 Web 节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的 x_forwarded_for 设置
查看日志格式
tail -2 logs/access.log192.168.178.1 - - [11/Feb/2020:19:24:37 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"127.0.0.1 - - [12/Feb/2020:10:26:26 +0800] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0"
多虚拟主机定义日志
由于Nginx支持多虚拟主机,日志功能也是可以区分开的,用access_log定义存储位置。
日志指令语法
access_log path [format buffer=size | off]path代表日志存放路径
【关闭日志】
access_log off;
【多虚拟主机的访客日志】
1.虚拟主机1server {#监听的端口和iplisten 80;#主机域名server_name www.chaogelinux.com;access_log logs/www.chaogelinux.log;charset utf-8;#url匹配location / {#HTML文件存放的目录root /website/s1;#默认首页文件,从左往右寻找,index.html或是index.htm文件index index.html index.htm;}}2.虚拟主机2server {listen 80;server_name www.chaogenginx.com;access_log logs/www.chaogenginx.com;location / {index index.html index.htm;root /website/s2;}}3.重载nginxnginx -s reload4.分别发送请求,检测日志动态[root@bogon logs]# pwd/opt/nginx/logs[root@bogon logs]# lserror.log nginx.pid www.chaogelinux.log www.chaogenginx.com[root@bogon ~]# curl www.chaogenginx.com我是来自于域名www.chaogenginx.com的多域名虚拟主机[root@bogon ~]# curl www.chaogelinux.com我是多域名虚拟主机,来自于域名www.chaogelinux.com
Nginx目录浏览功能
例如将你电脑的资料共享出来,方便快速访问
server {#监听的端口和iplisten 80;#主机域名server_name www.chaogelinux.com;access_log logs/www.chaogelinux.log;#目录有中文的时候,这里必须改charset utf-8;#url匹配location / {#需要列出目录索引的位置root /;#开启目录索引功能autoindex on;}
Nginx的浏览器缓存
配置浏览器缓存可以加速静态资源的访问,浏览器对用户访问的资源进行存储,下次访问,不用再去向服务器寻求资料,直接本地显示,加速访问体验,节省网络资源,提高效率。
Nginx通过expires指令配置缓存,可以控制HTTP响应中的Expires和Cache-Control的头部信息,用来控制页面缓存
例如HTML页面经常引用JavaScript以及图片等文件,这些文件很少被修改,可以设置浏览器对该类资源在本地缓存定期的时间。
添加缓存之前响应信息
添加缓存配置之后
nginx.conf修改server{}语句块
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {root /website/s1/;expires 30d;}location ~ .*\.(js|css)?$ {root /website/s1/;expires 1h;}
规范Nginx.conf
对于Nginx的使用,需要反复修改Nginx.conf,修改次数多了之后,就难以观看了,Nginx提供了include指令,可以将其他目录的配置文件,导入进主配置文件nginx.conf中。
思路可以根据虚拟主机域名或是功能别名,创建配置文件,例如
- bbs.conf
- crm.conf
- blog.conf
然后使用include指令
include mime.types;include fastcgi_params;include vhosts/*.conf;
Nginx优化配置文件案例
nginx.conf主配置文件,修改为如下简略信息
1.创建统一管理配置文件目录mkdir -p /opt/nginx/conf/extra2.读取nginx.conf配置文件,将第一个server{}虚拟主机配置导出为bbs.conf[root@bogon conf]# sed -n '29,87p' nginx.conf > extra/bbs.conf3.删除原有的配置[root@bogon conf]# sed -i '29,87d' nginx.conf4.生成第二个blog.conf,导出第二个虚拟主机的配置[root@bogon conf]# sed -n '29,41p' nginx.conf > extra/blog.conf[root@bogon conf]# sed -i '29,41d' nginx.conf #删除主配置文件的参数5.主配置文件,添加include配置http {include mime.types;# 定义日志的内容格式(记录内容的详细程度)default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';sendfile on;tcp_nopush on;include extra/*.conf;}'$remote_addr' 记录访客的客户端IP地址'$remote_user' 记录远程客户端的访客用户名[$time_local] 记录访客的时间和地区信息'$request' 记录用户的http请求的首行信息'$status' 记录用户的http请求状态'$body_bytes_sent' 记录服务器发给客户端的相应数据字节大小'$http_referer' 本次请求是从哪个连接过来的'$http_user_agent' 记录客户端的访问信息,如浏览器喜喜,手机浏览器信息'$http_x_forwarded_for' 捉到藏在代理IP后边的真实客户端IP信息6.此时nginx的两个虚拟主机任然可以用[root@bogon conf]# curl 127.0.0.1我是多域名虚拟主机,来自于域名www.chaogelinux.com<img src="./1.jpg"><img src="./2.jpg"><img src="./3.jpg"><head><link rel="shortcut icon" href="#"/></head>[root@bogon conf]# curl 127.0.0.1:81我是来自于域名www.chaogenginx.com的多域名虚拟主机实现了配置文件拆分,方便可观
Nginx状态信息功能
Nginx状态信息(status)配置及信息详解 nginx与php-fpm一样内建了一个状态页,对于想了解nginx的状态以及监控nginx非常有帮助。为了后续的zabbix监控,我们需要先了解一下nginx的状态页。
Nginx状态信息(status)介绍 Nginx软件在编译时又一个with-http_stub_status_module模块,这个模块功能是记录Nginx的基本访问状态信息,让使用者了解Nginx的工作状态。 要想使用状态模块,在编译时必须增加—with-http_stub_status_module参数。
检查Nginx是否开启此功能[root@bogon conf]# nginx -Vnginx version: nginx/1.14.0built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)built with OpenSSL 1.0.2k-fips 26 Jan 2017TLS SNI support enabledconfigure arguments: --prefix=/opt/nginx/ --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio
有的,那么修改nginx.conf,支持此功能
[root@bogon extra]# cat status.confserver {listen 85;location / {stub_status on;access_log off;}}nginx -s reload
使用ab命令,进行nginx压力测试
yum -y install httpd-toolsab -kc 1000 -n 100000 http://127.0.0.1/ #开启会话保持,1000个并发,发送十万个请求-n requests #执行的请求数,即一共发起多少请求。-c concurrency #请求并发数。-k #启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。
Nginx错误日志
Nginx能够将自身运行故障的信息也写入到指定的日志文件中。对于错误信息的调试,是维护Nginx的重要手段,指令是error_log,可以放在http{}全局中,也可以单独为虚拟主机记录。
语法:error_log file level;日志级别在乎debug|info|notice|warn|error|crit|alert|emerg级别越高,日志记录越少,生产常用模式是warn|error|crit级别日志的记录,会给服务器增加额外大量的IO消耗,按需修改
nginx.conf修改如下,针对虚拟主机添加错误日志
#修改配置文件[root@bogon extra]# cat blog.conf#第二个虚拟主机server {listen 81;server_name www.chaogenginx.com;access_log logs/www.chaogenginx.com;charset utf-8;error_log logs/blog.error.log; #添加本行即可location / {index index.html index.htm;root /website/s2;}}#检查日志[root@bogon extra]# nginx -s reload[root@bogon extra]#[root@bogon extra]#[root@bogon extra]# ls ../../logs/access.log blog.error.log error.log nginx.pid www.chaogelinux.log www.chaogenginx.com
Nginx location作用
Nginx的locaiton作用是根据用户请求的URI不同,来执行不同的应用。
针对用户请求的网站URL进行匹配,匹配成功后进行对应的操作。
nginx.conf中server{}指令块的location指令如下location / {root html;index index.html index.htm;}location = /50x.html {root html;}
语法
location [ = | ~| ~* | ^~ ] url {#指定对应的动作}#正则表达式解释匹配符 匹配规则 优先级= 精确匹配 1^~ 以某个字符串开头,不做正则 2~* 正则匹配 3/blog/ 匹配常规字符串,有正则就优先正则 4/ 通用匹配,不符合其他location的默认匹配 5
实际演练
| 请求url | 完整url | 匹配后动作 |
|---|---|---|
| / | http://192.168.178.134/ | 配置A |
| /index.html | http://192.168.178.134/index.html | 配置B |
| /blog/blog.html | http://192.168.178.134/blog/blog.html | 配置C |
| /img/1.jpg | http://192.168.178.134/1.jpg | 配置D |
| /blog/1.jpg | http://192.168.178.134/blog/1.jpg | 配置E |
修改nginx.conf如下
[root@bogon extra]# cat www.confserver {listen 83;server_name _;#最低级匹配,不符合其他locaiton就来这location / {return 401;}#优先级最高,精确匹配location = / {return 402;}#以/blog/开头的url,来这里,如符合其他locaiton,则以其他优先location /blog/ {return 403;}#匹配任何以/img/开头的请求,不匹配正则location ^~ /img/ {return 404;}#匹配任何以.gif结尾的请求,支持正则location ~* \.(gif|jpg|jpeg)$ {return 500;}}
curl命令-s 不输出错误和进度信息,静默输出-o 输出写入到指定文件中 /dev/null 就是丢弃输出,扔进黑洞-I 只显示响应头-w 完成后输出哪些内容
#用户请求的url为空或者有一个/[root@bogon extra]# curl -s -o /dev/null -I -w "%{http_code}\n" 127.0.0.1:83402[root@bogon extra]# curl -s -o /dev/null -I -w "%{http_code}\n" 127.0.0.1:83/402#用户请求存在index.html或者其他任意不符合其他location的字符串[root@bogon extra]# curl -s -o /dev/null -I -w "%{http_code}\n" 127.0.0.1:83/index.html401#访问以/blog/开头的url[root@bogon extra]# curl -s -o /dev/null -I -w "%{http_code}\n" 127.0.0.1:83/blog/index.html403#访问以/img/开头的url[root@bogon extra]# curl -s -o /dev/null -I -w "%{http_code}\n" 127.0.0.1:83/img/2.gif404#匹配以gif结尾的url,由于/blog/优先级最低,因此匹配1.gif的规则[root@bogon extra]# curl -s -o /dev/null -I -w "%{http_code}\n" 127.0.0.1:83/blog/1.gif500#由于/img/优先级更高,因此优先匹配[root@bogon extra]# curl -s -o /dev/null -I -w "%{http_code}\n" 127.0.0.1:83/img/1.gif404
Nginx地址重写
Nginx rewrire技术主要是实现URL地址重写,且支持正则表达式的规则。
rewrite能够实现URL的跳转,需要nginx在编译安装的时候,装好了PCRE这个软件。
通过rewrite可以规范URL、根据变量进行URL跳转等,常用的功能如
- 对于爬虫的封禁,让其跳转无用页面
- 动态的URL伪装成HTMl页面,便于搜索引擎的抓取
- 旧域名、旧目录的更新,需要跳转到新的URL地址
语法
rewrite ^/(.*) http://192.168.178.134/$1 permanent;#解释rewrite是指令,开启一个跳转规则正则是 ^/(.*) 表示匹配所有,匹配成功后跳转到后面的url地址$1 表示取出前面正则括号里的内容permanent表示 301 重定向的标记
【rewrite的结尾参数 flag标记】
| 标记 | 解释a |
|---|---|
| last | 规则匹配完成后,继续向下匹配新的Locaiton |
| break | 本条规则完成匹配后,立即停止 |
| redirect | 返回302临时重定向,浏览器地址栏显示跳转后的URL,爬虫不会更新url |
| permanent | 返回301永久重定向,浏览器地址显示跳转后的URL |
last和break用于实现URL重写,浏览器地址栏不发生变化
redirect和permanent用于实现URL跳转,浏览器地址栏跳转新的URL
实现301 URL跳转
#请求直接跳转到百度[root@bogon extra]# cat learn_rewrite.confserver {listen 90;server_name _;rewrite ^/(.*) http://www.baidu.com/$1 permanent;}
Nginx访问认证
有时候,我们一些站点内容想要进行授权查看,只能输入账号密码之后才能访问,例如一些重要的内网平台,CRM,CMDB,企业内部WIKI等等。
htpasswd是Apache密码生成工具,Nginx支持auth_basic认证,因此我门可以将生成的密码用于Nginx中,输入一行命令即可安装:yum -y install httpd-tools ,参数如下:-c 创建passwdfile.如果passwdfile 已经存在,那么它会重新写入并删去原有内容.-n 不更新passwordfile,直接显示密码-m 使用MD5加密(默认)-d 使用CRYPT加密(默认)-p 使用普通文本格式的密码-s 使用SHA加密-b 命令行中一并输入用户名和密码而不是根据提示输入密码,可以看见明文,不需要交互-D 删除指定的用户#接认证文件,htpasswd -bc .access username password#在当前目录生成.access文件,用户名username,密码:password,默认采用MD5加密方式。
nginx的认证模块指令,语法:location / {auth_basic "string"; 可以填写off或是stringauth_basic_user_file conf/htpasswd;}
实际操作案例
[root@chaogelinux extra]# cat www.confserver {listen 80;server_name _;location / {root html/www;index index.html;auth_basic "learn nginx auth_module";#nginx会去这个文件中验证账号密码auth_basic_user_file /home/Learn_Nginx/nginx/conf/extra/htpasswd;}}[root@chaogelinux www]# cat index.html<meta charset=utf8>只有正确输入了账号密码,才能看到此页面重启nginxnginx -s reload
生成密码文件[root@chaogelinux extra]# htpasswd -bc ./htpasswd chaoge 666Adding password for user chaoge
root和alias区别

PPT 两周准备时间
- 这周准备下周试讲
10号晚上或者11号上午 或者周末再来一次
20讲述 5分钟问答
- 总结成果
- 准备进行交接工作


