1.Nginx概述
- Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。Nginx专为性能优化而开发,使用异步非阻塞事件驱动模型。
异步非阻塞,即我通知了他,等他好了通知我,在此期间,我不白等待,我做我自己的事。
异步非阻塞,从项目讲,即调用业务时通知它,让它好了把结果返回给我,在此期间,我继续执行其他业务。
2.Nginx四大应用场景
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是一个静态页面的话,那么就可以通过这种方式来实现部署。
在动静分离时,可将静态资源缓存在这里。
反向代理应该是Nginx使用最多的功能了,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
使用反向代理,不会将原服务器的ip地址暴露给客户端,从而提高了安全性。
负载均衡也是Nginx常用的一个功能,负载均衡的意思是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其他关键人物服务器等,从而共同完成工作任务。
即让集群的各个服务均衡的负载。
使用负载均衡可以提高项目的可用性。
动静分离是让动态网站里的动态页面根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特性将其做缓存操作,这就是网站静态化处理的核心思路。
使用动静分离可以减小对服务器的压力。
引用反向代理实现负载均衡。
Nginx:
- 它可以高并发连接,在实际生产环境中可以支撑2到4万并发连接
- 内存消耗少
- 内置健康检查功能:如果Nginx proxy后端的某台服务器宕机了,不会影响前端访问。
- 节省带宽,支持gzip压缩。压缩后 请求和返回的速度更快
- 稳定性高:用于反向代理(负载均衡),宕机的概率微乎其微。
- 支持热部署。在不间断服务的情况下,对软件版本升级。
负载均衡主要解决稳定性。
1.环境准备
- 退出mysql:
shutdown;
- 查看防火墙状态:
firewall-cmd --state
,需要关闭防火墙 - 确认yum是否可用:
yum list
,需要yum可用 - 确认网络:
ping www.baidu.com
,需要有网络 - 确认SELinux:
vim /etc/selinux/config
,需要关闭SELINUX的策略
将 SELINUX=enforcing 修改为 SELINUX=disabled 即可
Nginx的环境安装:yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel
参数的含义:
- gcc:因为Nginx是用C语言编写的,需要C语言的环境,即编译依赖gcc环境
- pcre:PCRE(Perl Compatible Regular
Expressions)是一个Perl库,包括Perl兼容的正则表达式库。因为Nginx是支持正则表达式。 - zlib:zlib库提供了很多中压缩和解压缩的方式,Nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
- openssl:OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其他目的使用。
SSL协议的应用:所有业务 都使用在SSL握手过程中建立的密钥和算法 进行加密。
2.Nginx的下载与安装
- 进入到opt目录中:
cd /opt
- 下载当前稳定版的nginx:
wget http://nginx.org/download/nginx-1.22.0.tar.gz
wget命令是Linux系统用于从Web下载文件的命令行工具 - 将Nginx压缩文件解压缩到/usr/local/目录下:
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
- 此时nginx内部存在一个Makefile文件,查询该目录下的文件:
ll
- 编译并安装Nginx:
make && make install
- 检验是否安装成功,退到上级目录,查询是否存在nginx目录,进入并查询该目录下的文件,看是否存在4个文件,存在则成功。
压缩包都是放在/opt目录下,而解压缩文件都是放在/usr/local/目录下。
–help用来给出参数的提示。
- conf:存放配置文件的目录
- html:存放静态资源,html、css、js等文件。
- logs:存放日志文件,一个是客户端请求Nginx服务记录的日志,还有一个是Nginx出现异常时记录的日志。
- sbin:是一个二进制的文件,主要作用是通过该文件对Nginx进行启动、停止、重启等操作,
- 拉取官方的Nginx镜像:
docker pull nginx
- Nginx使用默认的配置来启动一个Nginx容器:
docker run --rm --name nginx-test -p 8080:80 -d nginx
,该nginx只需要拿到他的nginx.conf文件即可。
参数的含义:
–rm:容器终止运行后,自动删除容器文件。
–name:自定义容器名
-p:端口进行映射,将前者的端口映射到后者
-d:容器启动后,在后台运行 - Nginx服务部署,映射本地目录到Nginx容器
递归创建2个本地目录,用于存放Nginx的相关文件信息:mkdir -p /opt/nginx/html /opt/nginx/conf
其中html目录将映射为Nginx容器配置的虚拟目录;conf目录里的配置文件将映射为Nginx容器的配置文件。 - 将nginx的配置文件复制到创建的本地目录/opt/nginx/conf/中:
docker cp 9817106e3c3a:/etc/nginx/nginx.conf /opt/nginx/conf/
- 关闭该nginx容器后会自动删除该容器:
docker stop 98
,98是docker ps后,容器id的前2位 - nginx正常部署启动:
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
俩个-v就是将自己创建的html目录和nginx.conf文件挂载到容器对应的文件或文件夹上。
- 启动Nginx,进入到nginx的sbin目录下:
./nginx
- 查看Nginx进程的命令:
ps aux|grep nginx
或者ps -ef|grep nginx
- 显示nginx可以带的其他参数:
./nginx -h
参数的含义:
-v:打印版本号
-V:打印版本号和配置
-t:测试配置正确性并退出
-q:测试配置时只显示错误
-s:向主进程发送信号
-p:指定nginx服务路径前缀
-c:指定nginx配置文件路径
-g:指定nginx附加配置文件路径 - 关闭Nginx,分为俩种方式:
1.快速关闭:nginx -s stop
即立即停止当前Nginx服务正在处理的所有网络请求,马上丢弃连接,停止工作。
2.平缓停止:nginx -s quit
即允许Nginx服务当前正在处理的网络请求处理完成,但不再接收新的请求,之后关闭连接,停止工作。 - Nginx服务重启:
1.nginx -s reload
向主进程发送信号,重新加载配置文件,热重启。即不需要关闭的"重启"。
2.nginx -s reopen
,向主进程发送信号,重启nginx。
3. 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;
worker_processes 1;
事件驱动模型
-
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。
- 配置网络监听
- 第一种:
listen 192.168.126.4:80
即监听该ip地址192.168.126.4下的80端口的连接 - 第二种:
listen 80
即监听所有ip地址的80端口的连接
- 第一种:
- 基于名称来虚拟主机配置
这里的"主机",就是指此server块对外提供的虚拟主机。设置了主机的名称并配置好DNS,用户就可以使用该名称向此虚拟主机发送请求了。
即通过该名称访问nginx,该名称一般为域名,找到绑定域名的ip地址发送请求。 - 通过www.baidu.com这个域名访问与之绑定的主机或者是ip:
server_name www.baidu.com;
使用完整的域名叫精准匹配,优先级最高。
使用将左侧(www)改为通配符*,优先级第二。
使用将右侧(com)改为通配符*,优先级第三。
使用正则表达式,优先级最低。
即通过网络监听端口的连接,该连接可以基于名称访问对应server块的虚拟主机。
-
匹配请求的根目录
- Web服务器接收到网络请求后,首先要在服务器端指定目录中寻找请求资源。在nginx服务器中,指令root就是用来匹配这个根目录的。
- 指定nginx查找资源的根目录:
root html;
,即指定为nginx下的html目录;也可指定其他目录。 - 退出编辑,进入到sbin目录下,热重启:
./nginx -s reload
- 此时可以将一张图片上传到html下,通过浏览器访问:
192.168.126.4/1.jpg;
如果端口号为80则可以省略,否则需要添加端口号。
配置文件nginx.conf:
user nobody; worker_processes 1; events {use epoll; worker_connections 1024;}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"';access_log logs/access.log main;sendfile on;keepalive_timeout 65;tcp_nodelay on;gzip on;gzip_disable "MSIE [1-6].";client_header_buffer_size 128k;large_client_header_buffers 4 128k;server {listen 80;server_name www.Nginx.cn;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 {}location ~ ^/(images|javascript|js|css|flash|media|static)/ {expires 30d;}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;}location ~ /.ht {deny all;}} }
4. Nginx虚拟主机
基于多ip的虚拟主机,即ip不同,几乎不用
基于多端口的虚拟主机,即端口不同,应用于公司内部网站,网站后台
基于域名的虚拟主机,即域名不同,应用于外部网站
- 虚拟主机是一种特殊的软硬件技术,他可以将网络上的每一台计算机分城多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响。
-
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。
5.核心指令
- 进入到conf目录,编辑并创建一个alias.conf:
vim alias.conf
- 在/opt/nginx/html目录下存放一张图片1.jpg
- 编辑nginx.conf,将alias.conf引入,其他的server注释:
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
此时文件目录它不会将images路径叠加进来,所以现在的静态资源访问路径是/opt/nginx/html/1.jpg。
root和alias的区别就是location /path中的path会不会被叠加进uri来访问静态资源,root会叠加,alias不会。
alias指令最后一定要加/。
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";
- 在nginx.conf文件中注释其他include的server块,将return.conf引入:
include return.conf;
- 热重启:
../sbin/nginx -s reload
- curl提起一个http请求:
curl http://192.168.126.4:8000
5.return code URL(常用于页面的跳转):
- 修改return.conf文件,将location中return的响应码修改为302并指定重定向的路径:
return 302 /bbs;
- 再指定一个location块,作为重定向的映射,模拟重定向:
server{listen 8000;server_name *.*;location /{return 302 /bbs;}location /bbs{root html;}}
6.return URL:
- 修改return.conf文件,将location中的return指向http或https开头的网址:
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,临时重定向也就是普通的重定向。不会产生影响,只是重定向而已。
- html目录下创建三个文件夹images,photos,pics:
mkdir images
,mkdir photos
,mkdir pics
- 进入到photos目录,创建1.html并输入一段话:
echo "this is photos > 1.html"
,images和pics也是这个相应的步骤。 - 到conf目录下编辑rewrite_test.conf文件:
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重新发起一个请求。
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;} }
- 编辑nginx.conf文件,将rewrite.conf文件引入:
include rewrite.conf;
- 修改hosts文件:
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使用最多的功能。
原文链接:https://www.rstk.cn/news/889763.html