异步非阻塞,即我通知了他,等他好了通知我,在此期间,我不白等待,我做我自己的事。
异步非阻塞,从项目讲,即调用业务时通知它,让它好了把结果返回给我,在此期间,我继续执行其他业务。
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是一个静态页面的话,那么就可以通过这种方式来实现部署。
在动静分离时,可将静态资源缓存在这里。
反向代理应该是Nginx使用最多的功能了,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
使用反向代理,不会将原服务器的ip地址暴露给客户端,从而提高了安全性。
负载均衡也是Nginx常用的一个功能,负载均衡的意思是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其他关键人物服务器等,从而共同完成工作任务。
即让集群的各个服务均衡的负载。
使用负载均衡可以提高项目的可用性。
动静分离是让动态网站里的动态页面根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特性将其做缓存操作,这就是网站静态化处理的核心思路。
使用动静分离可以减小对服务器的压力。
引用反向代理实现负载均衡。
Nginx:
负载均衡主要解决稳定性。
shutdown;
firewall-cmd --state
,需要关闭防火墙yum list
,需要yum可用ping www.baidu.com
,需要有网络vim /etc/selinux/config
,需要关闭SELINUX的策略Nginx的环境安装:yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel
参数的含义:
SSL协议的应用:所有业务 都使用在SSL握手过程中建立的密钥和算法 进行加密。
cd /opt
wget http://nginx.org/download/nginx-1.22.0.tar.gz
tar -zxvf nginx-1.22.0.tar.gz -C /usr/local
mkdir -p /var/temp/nginx/client
./configure \
--prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--with-http_ssl_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi
ll
make && make install
压缩包都是放在/opt目录下,而解压缩文件都是放在/usr/local/目录下。
–help用来给出参数的提示。
docker pull nginx
docker run --rm --name nginx-test -p 8080:80 -d nginx
,该nginx只需要拿到他的nginx.conf文件即可。mkdir -p /opt/nginx/html /opt/nginx/conf
docker cp 9817106e3c3a:/etc/nginx/nginx.conf /opt/nginx/conf/
docker stop 98
,98是docker ps后,容器id的前2位docker run -d -p 8081:80 --name nginx-test-web \
-v /opt/nginx/html:/usr/share/nginx/html \
-v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx
./nginx
ps aux|grep nginx
或者ps -ef|grep nginx
./nginx -h
nginx -s stop
nginx -s quit
nginx -s reload
nginx -s reopen
,向主进程发送信号,重启nginx。进入到nginx/conf,先备份nginx.conf配置文件:cp nginx.conf nginx.conf.bak
防止配置错误。
配置运行Nginx服务器用户(组):user user [group];
第二个user是用户名,组名可写可不写
配置所有用户都可以启动,把user注释掉或者:user nobody nobody;
配置允许生成的worker process数,语法格式:worker_process number|auto
number,即指定Nginx进程最多可以产生的worker_process数
auto,设置此值,Nginx进程将自动检测
worker_process的数量可以提高服务器的并发能力。
查看master process和worker_process:ps aux|grep Nginx
配置Nginx进程PID存放路径:pid logs/nginx.pid;
配置错误日志:error_log logs/error.log;
先创建一个test2.conf文件,配置文件的引入:include test2.conf;
#可运行的用户 用户组
#user zzx zzx;
#
#
#工作进程数 通常设置为cpu数量相等。 cpu 1*1
worker_processes 1;
#配置pid文件
#pid logs/nginx.pid;
#配置错误日志
#error_log logs/error.log;
#配置文件引入
#include test2.conf;
事件驱动模型
nginx服务器提供多种事件驱动模型来处理网络消息。配置文件中为我们提供了相关的指令来强制nginx服务器选择哪种事件驱动模型进行处理。
A)标准事件模型
Select、poll属于标准事件模型,如果当前系统不存在高效事件模型,nginx会选择select或poll
B)高效事件模型
Kqueue:使用于FreeBSD 4.1+,OpenBSD 2.9+,NetBSD 2.0和MacOS X。使用双处理器的MacOS X系统使用Kqueue可能会造成内核崩溃。
Epoll:使用于Linux内核2.6版本及以后的系统。
Idev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+和Tru64 UNIX 5.1A+。
Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题,有必要安装安全补丁。
在events块中配置epoll工作模式:use epoll;
即多路io复用 高性能网络io模型
在events块中配置每个worker_process的worker_connections:worker_connections 1024;
,默认为512。
即每个worker_process都有该worker_connections连接数,理论上每台nginx服务器的最大连接数为worker_process*worker_connections。
在http块中,需要引入mime-types:include mime-types;
mime-type:在常用的浏览器中,可以显示的内容有HTML、XML、GIF及Flash等种类繁多的文本、媒体等资源,浏览器为区分这些资源,需要使用mime-type。换言之,mime-type是网络资源的媒体类型。nginx服务器作为web服务器,必须能够识别前端请求的资源类型。
在http块中,配置不指定时的默认类型:default_type application/octet-stream;
配置access_log格式:
log_format main '$remote_addr - $remote_user "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
日志格式参数含义:
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local:用来记录访问时间与时区;
$request:用来记录请求的url和http协议;
$status:用来记录请求状态;成功是200;
$body_bytes_sent:记录发送给客户端文件主体内容大小;
$http_referer:用来记录从哪个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息
web服务器放在反向代理的后面,这样就不能获取到客户的ip地址了,通过$remote_addr拿到的ip地址是反向代理服务器的ip地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的ip地址和原来客户端的请求的服务器地址。
指定access_log的存放路径及其格式引用:access_log logs/access.log main;
在http块中配置超时时间:keepalive_timeout 120 100;
即120是服务端保持连接的时间,发给用户端的应答报文头部中的超时时间是100。100可不写且单位为秒s。
http块下的server块的配置
listen 192.168.126.4:80
listen 80
server_name www.baidu.com;
即通过网络监听端口的连接,该连接可以基于名称访问对应server块的虚拟主机。
配置server块下的location块
语法:
location[ = | ~ | ~* | ^~ ] uri{
}
=,即精准匹配,例如location = /images/{...}
^~,即匹配到立即停止搜索,例如location ^~ /images/{...}
~,即正则匹配,区分大小写,例如location ~ .(jpg | gif)${...}
~* ,即正则匹配,不区分大小写,例如location ~* .(jpg | jif)${...}
不带任何符号,例如location /{...}
匹配请求的根目录
root html;
,即指定为nginx下的html目录;也可指定其他目录。./nginx -s reload
192.168.126.4/1.jpg;
配置文件nginx.conf:
#运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志及PID文件
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/Nginx.pid;
#工作模式及连接数上限
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高Nginx的性能
use epoll;
#单个worker进程的最大并发链接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
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"';
access_log logs/access.log main;
#sendfile 指令指定 Nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#开启gzip压缩
gzip on;
gzip_disable "MSIE [1-6].";
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#设定虚拟主机配置
server {
#侦听80端口
listen 80;
#定义使用 www.Nginx.cn访问
server_name www.Nginx.cn;
#定义服务器的默认网站根目录位置(编译的时候--prefix是整个Nginx的根目录,这里的html文件夹是相对--prefix的路径)
root html;
#设定本虚拟主机的访问日志
access_log logs/Nginx.access.log main;
#默认请求
location / {
#定义首页索引文件的名称
index index.php index.html index.htm;
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#静态文件,Nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}
基于多ip的虚拟主机,即ip不同,几乎不用
基于多端口的虚拟主机,即端口不同,应用于公司内部网站,网站后台
基于域名的虚拟主机,即域名不同,应用于外部网站
linux绑定多ip:vim /etc/sysconfig/network-scripts/ifcfg-ens33;
即在里面添加一个IPADDR1=192.168.126.7即可。
centos6、7重启网卡:service network restart
,CentOS8重启网卡: nmcli c reload ens33
查看该虚拟机的ip地址:ip addr
进入到nginx目录下,创建html4、html7:mkdir html4
,mkdir html7
进入到html4中,创建index文件:echo "this is html4" > index.html
进入到html7中,创建index文件:echo "this is html7" > index.html
进入到conf目录,创建并编辑ip.conf文件,用以创建server虚拟主机:vim ip.conf
,让对应ip去对应html根目录查找资源
添加以下内容:
server{
listen 80;
server_name 192.168.126.4;
location / {
root html4;
}
}
server{
listen 80;
server_name 192.168.126.7;
location / {
root html7;
}
}
编辑nginx.conf,在http块内引入ip.conf文件:include ip.conf;
,此时需要先将server块的server_name的 *.*修改为其他值才可以重启。
到nginx目录下热重启nginx:sbin/nginx -s reload
,热重启即生效配置文件
俩个域名指向同一个nginx服务器,用户访问不同的域名时显示不同的内容。
将hosts文件添加以下2个ip与域名绑定,也可使用hostsswitch软件。
192.168.126.4 www.qiantai.cn
192.168.126.4 www.houtai.cn
此时的域名是假的。
进入到nginx目录下,创建2个域名的文件夹:mkdir qiantai
,mkdir houtai
进入到qiantai目录,然后将前面的代码输入并创建index.html:echo "this is qiantai" > index.html
进入到houtai目录,然后将前面的代码输入并创建index.html:echo "this is houtai" > index.html
进入到conf目录,编辑并创建新文件dns.conf:vim dns.conf
添加如下内容:
server{
listen 80;
server_name www.qiantai.cn;
location /{
root qiantai;
}
}
server{
listen 80;
server_name www.houtai.cn;
location /{
root houtai;
}
}
将dns.conf引入到nginx.conf的http块中:include dns.conf;
进入sbin目录,热重启:./nginx -s reload
在浏览器通过域名访问,显示qiantai或houtai即可。
通过不同端口来区分不同的虚拟主机。此类虚拟主机对应的企业应用主要为公司内部的网站。
进入到nginx目录下,创建html8888和html9999目录:mkdir html8888
,mkdir html9999
进入到html8888目录下,编辑index.html文件,并添加this is html8888
进入到html9999目录下,创建index.html并添加this is html8888进index.html中:echo "this is html9999 >index.html"
进入到conf目录,编辑并创建port.conf:vim port.conf
,添加如下内容:
server{
listen 8888;
server_name *.*;
location /{
root html8888;
}
}
server{
listen 9999;
server_name *.*;
location /{
root html9999;
}
}
编辑nginx.conf,在http块中将其他server引入注释掉,将port.conf引入:include port.conf;
进入到nginx目录,热重启:sbin/nginx -s reload
通过浏览器访问:192.168.126.4:8888
,192.168.126.4:9999
,都可以访问。
也就是说,3种分别是用ip,域名,端口来区分,还可以指定对应的html,也就是静态文件。
虚拟主机是主要作用就是多个服务器不需要启动多个nginx,只需要启动一个nginx。
vim alias.conf
include alias.conf;
./nginx -s reload
server{
listen 8000;
server_name *.*;
location /images {
alias /opt/nginx/html/;
}
}
192.168.126.4:8000/images/1.jpg
1.return功能
1.停止处理请求,直接返回响应码或重定向到其他URL;
2.执行return指令后,location的后续指令将不再执行。
2.return语法结构
1.return code [text];如果返回2XX才有意义,text会在body中。
2.return code URL;主要用于重定向。
3.return URL;须以http或https开头。
3.返回的状态码:
301:永久重定向
302:临时重定向,禁止被缓存
303:临时重定向,禁止缓存,允许改变方法
307:临时重定向,禁止缓存,不允许改变方法
308:永久重定向,不允许改变方法
4.return code[text] :
进入到conf目录,创建并编辑return.conf文件:vim return.conf
,添加如下server块:
server{
listen 8000;
server_name *.*;
location /{
return 200 "this is return";
}
}
即在server块的location块里添加return语句:return 200 "this is return";
include return.conf;
../sbin/nginx -s reload
curl http://192.168.126.4:8000
5.return code URL(常用于页面的跳转):
return 302 /bbs;
server{
listen 8000;
server_name *.*;
location /{
return 302 /bbs;
}
location /bbs{
root html;
}
}
6.return URL:
retuen https://www.baidu.com;
rewrite是实现URL重定向的重要指令。
URI由存放资源的主机名、片段标志符和相对URI三部分组成。存放资源的主机名一般由传输协议(Scheme)、主机和资源路径三部分组成;片段标志符指向资源内容的具体元素;相对URI表示资源在主机的相对路径。
一般格式:Scheme:[//][[用户名[:密码]@]主机名[:端口号]][/资源路径]
URL是URI的子集,主要包括传输协议(Scheme)、主机(IP、端口号或者域名)和资源具体地址(目录和文件名)等三部分。
一般格式:Scheme://[主机名[:端口号]][/资源路径]
rewrite常用全局变量:
KaTeX parse error: Expected 'EOF', got '&' at position 35: …3.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参数对应的值
KaTeX parse error: Expected 'EOF', got '&' at position 51: …3.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_port 客户端的port
$remote_user 如果nginx有配置认证,该变量代表客户端认证的用户名
$request 请求的URI和HTTP协议,如“GET /article-10000.html HTTP/1.1”
$request_body_file 做反向代理时发给后端服务器的本地资源的名称
$request_method 请求资源的方式,GET/PUT/DELETE等
r e q u e s t f i l e n a m e 当前请求的资源文件的路径名称,相当于是 request_filename 当前请求的资源文件的路径名称,相当于是 requestfilename当前请求的资源文件的路径名称,相当于是document_root/$document_uri的组合
r e q u e s t u r i 请求的链接,包括 request_uri 请求的链接,包括 requesturi请求的链接,包括document_uri和$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等
u r i 和 uri 和 uri和document_uri相同
$http_referer 客户端请求时的referer,通俗讲就是该请求是通过哪个链接跳过来的,用curl -e可以指定
$time_local 记录访问时间与时区,如18/Jul/2014:17:00:01 +0800
常用正则表达式:
\,将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用
^,匹配输入字符串的初始位置
$,匹配输入字符串的结束位置
*,匹配前面的字符零次或者多次
+,匹配前面的字符串一次或者多次
?,匹配前面的字符串零次或一次
.,匹配"\n"之外的所有单个字符
(pattern),匹配括号内的pattern
rewrite 最后一项flag参数(默认为last):
last,本条规则匹配完成后继续向下匹配新的location URI规则
break,本条规则匹配完成后,不再匹配任何规则
redirect,返回302临时重定向
permanent,返回301永久重定向
permanent,新网址完全继承旧网址,旧网址的排名等完全清零,永久重定向到百度,创建并编辑rewrite_test.conf:vim rewrite_test.conf
,添加如下:
server{
listen 8000;
server_name *.*;
location /search{
rewrite ^/(.*) https://www.baidu.com permanent;
}
}
再将rewrite_test.conf引入到nginx.conf文件:include rewrite_test.conf;
通过浏览器访问:http://192.168.126.4:8000/search
,此时会永久重定向到百度。
rewrite ^/(.*) https://baidu.com permanent;即重写从/开始(端口号/)后面的零个或多个字符(所有字符)为百度,且永久重定向。
redirect,临时重定向也就是普通的重定向。不会产生影响,只是重定向而已。
mkdir images
,mkdir photos
,mkdir pics
echo "this is photos > 1.html"
,images和pics也是这个相应的步骤。vim rewrite_test.conf
,添加如下:server{
listen 8000;
server_name *.*;
location /images{
rewrite /images/(.*) /pics/$1;
}
location /pics{
rewrite /pics/(.*) /photos/$1;
}
location /photos{
}
}
即此时不加flag,也就是最后一个参数时,它最后会到photos/1.html页面。
在/images下面的rewrite加一个break,此时就重写为/pics/1.html: rewrite /images/(.*) /pics/$1 break;
在/images下面的rewrite加一个last,此时就重写为photos/1.html: rewrite /images/(.*) /pics/$1 last;
,也就是说默认为last。
last在匹配完本条规则后,再向server重新发起一个请求。
vim rewrite.conf
,添加如下:server{
listen 8000;
server_name www.test.com;
rewrite ^/(.*) http://www.zzx.com/$1 permanent;
}
server{
listen 8000;
server_name www.zzx.com;
location /{
root html;
index index.html;
}
}
include rewrite.conf;
192.168.126.4 www.test.com
, 192.168.126.4 www.zzx.com
../sbin/nginx -s reload
www.test.com:8000
,此时永久重定向到www.zzx.com上if指令支持条件判断选择不同的配置,可以在server块或Location块中配置。
使用变量名进行条件判断,变量的值为空字符串或者"0"开头的任意字符串,此时未false,反之为true。
if($slow),即该变量的值是否为空字符串或者"0"开头的任意字符串。
"=“和”!="比较是否相等,相等为true,反之为false。
if($request_method = POST),即请求方法是否为POST。
同时,字符串不需要加引号""。
变量与正则表达式(~,也就是匹配或者是包含的意思):
~表示匹配过程对大小写敏感
~*表示匹配过程对大小写不敏感
!~表示匹配失败是if指令认为条件为true,反之为false
if($http_user_agent ~ MSIE),即 $http_user_agent的值中是否包含MSIE字符串。
在conf目录创建并编辑if.conf:vim if.conf
,添加以下:
server{
listen 8000;
server_name *.*;
location /search{
if ($remote_addr = 192.168.126.4)
{
return 200 "if test success";
}
return 500;
}
}
此时的if需要空格隔开,否则会热重启报错。
将if.conf引入nginx.conf中:include if.conf;
热重启:../sbin/nginx -s reload
在命令行通过curl指令测试:curl http://192.168.126.4:8000/search
在if.conf中的location里面再添加如下:
if ($http_user_agent ~ Chrome)
{
return 500;
}
$http_user_agent,记录客户端浏览器的相关信息
即如果客户端通过谷歌浏览器访问则报500错误。
../sbin/nginx -s reload
http://192.168.126.4:8000/search
1.set指令用于设置一个新的变量:
进入conf目录,创建并编辑一个set.conf文件:vim set.conf
,添加如下:
server{
listen 8000;
server_name *.*;
location / {
set $test 10;
return 200 $test;
}
}
$后面是变量名test,10则是变量的值。
进入到nginx.conf文件中,将set.conf引入:include set.conf;
热重启:../sbin/nginx -s reload
通过命令行的curl指令测试: curl http://192.168.126.4:8000
,返回一个10;但是让浏览器访问会自动下载一个文件10。
2.break指令
用于中断当前相同作用域中的其他配置。
与java语法相同,想中断退出时,声明一个break;即可。
1.Gzip的压缩作用:
Nginx开启Gzip压缩功能,可以使网站的css、js、xml、html文件在传输时进行压缩,提高访问速度,进而优化Nginx性能。
将响应报文发送至客户端之前可以启用压缩功能,这样能够有效地节约宽带,并提高响应至客户端的速度。Gzip压缩可以配置http、server和location模块下。
即gzip能提高访问速度,节约宽带和提高响应速度。就是说在客户端浏览器请求到服务器的速度变快和服务器响应到客户端浏览器的速度变快,都得益于gzip压缩,使得在网络传输的时间缩减,并且节约宽带。
2.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_level2;
设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大;等级1-9,最小的压缩最快 但是消耗cpu
gzip_types text/plain application/x-javascript text/css application/xml;
设置需要压缩的MIME类型,非设置值不进行压缩,即匹配压缩类型
gzip_varyon;
启用应答头"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库
3.实践示例
进入conf目录,创建并编辑gzip.conf文件:vim gzip.conf
,添加如下:
server{
listen 8000;
server_name *.*;
location ~ .*\.(jpg|gif|png)$ {
gzip on;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
root html;
}
}
即在location块中生效。
进入nginx.conf文件,在http块中将gzip.conf文件引入:include gzip.conf;
热重启:../sbin/nginx -s reload
下面俩类文件资源不太建议开启Gzip压缩功能:
1.图片类型资源(还有视频文件)
原因:图片如jpg、png文件本身就会有压缩,所以就算开启gzip后,压缩前后大小区别不大,开启了反而会白白浪费cpu资源。
2.大文件资源
原因:会消耗大量的cpu资源,且不一定有明显效果。
即使用那种本身不会有压缩,且文件不太大,这样能提升用户的体验。
常用的线上Gzip压缩配置,在http块中生效:
http{
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 9;
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;
}
1.HTTP服务器、反向代理、负载均衡、动静分离四大应用场景。
首先反向代理,可以使用域名访问,由nginx来转发,提高服务器的安全性。
负载均衡,由于nginx的并发量实际可以达到2-4w,然后将客户端的请求按照规则分发给集群的各个服务器,达到负载均衡的效果。
HTTP服务器,也就是说它本身就是一个web服务器,可以存放静态资源,这样就可以实现一个动静分离;动态资源从服务器中请求,静态资源可以缓存在nginx服务器中。
2.可以通过从官网下载nginx进行安装,也可以通过docker进行下载安装,docker镜像比较方便。
nginx的目录有html,也就是存放静态资源的目录;conf,存放配置文件的目录;logs,存放日志的目录;sbin,存放脚本的目录,在此目录启动、关闭和重启nginx服务。
3.nginx.conf文件又分为全局、http块和events配置,http块中一个server就是一个虚拟主机。
虚拟主机又可以分别由ip地址、端口和域名来区分。
4.核心指令有root、alias、return、rewrite、gzip、if、set、break。
root就是将location /后面的路径拼接起来,而alias不拼接,然后根据路径寻找对应的静态资源进行呈现。
return执行后,后面的语句不再执行,返回对应的响应码和数据,也可以作用于重定向。
rewrite也可作用重定向,它可以做换域名后的永久重定向,新网址会继承旧网址的所有属性等,而旧网址完全清空,并且返回301响应码。也有临时重定向,还有break和last指令,主要用来处理是否重新向server发起一个请求。
gzip是压缩指令,可以提高在网络上传输数据的速度,从而节约宽带,减少客户端浏览器请求数据到服务器以及服务器响应数据到客户端浏览器的时间,也就是说可以提高用户体验。但是不建议用在本身就有压缩(jpg和png图片)和大文件上。
if可以在server和location块中配置,用来做条件判断,从而选择相应的配置。
set指令可以用来设置一个变量并赋值,break就是在作用域内中断后面的配置。
反向代理是Nginx使用最多的功能。