文章目录
- 一、Nginx的应用概述
- 概述
- 四大应用场景
- 服务器
- 2.反向代理
- 3.负载均衡
- 4.动静分离
- 二、Nginx的下载安装及其配置指令
- 1.环境准备
- 的下载与安装
- 的普通下载与安装
- 目录详解:
- 下载安装Nginx
- 的启动和停止
- 3. Nginx配置指令详解
- 1.全局配置
- 块的配置
- 块的配置
- 4. Nginx虚拟主机
- 1.虚拟主机的分类
- 2.基于单网卡多ip虚拟主机配置(几乎不用)
- 3.基于域名虚拟主机配置(最常用)
- 4.基于多端口虚拟主机配置
- 5.核心指令
- 和alias指令
- 指令
- 指令
- 指令
- 和break指令
- 压缩指令
- 总结:
一、Nginx的应用概述
概述
- Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。Nginx专为性能优化而开发,使用异步非阻塞事件驱动模型。
异步非阻塞,即我通知了他,等他好了通知我,在此期间,我不白等待,我做我自己的事。
异步非阻塞,从项目讲,即调用业务时通知它,让它好了把结果返回给我,在此期间,我继续执行其他业务。
四大应用场景
服务器
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是一个静态页面的话,那么就可以通过这种方式来实现部署。
在动静分离时,可将静态资源缓存在这里。
2.反向代理
反向代理应该是Nginx使用最多的功能了,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
使用反向代理,不会将原服务器的ip地址暴露给客户端,从而提高了安全性。
3.负载均衡
负载均衡也是Nginx常用的一个功能,负载均衡的意思是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其他关键人物服务器等,从而共同完成工作任务。
即让集群的各个服务均衡的负载。
使用负载均衡可以提高项目的可用性。
4.动静分离
动静分离是让动态网站里的动态页面根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特性将其做缓存操作,这就是网站静态化处理的核心思路。
使用动静分离可以减小对服务器的压力。
引用反向代理实现负载均衡。
Nginx:
- 它可以高并发连接,在实际生产环境中可以支撑2到4万并发连接
- 内存消耗少
- 内置健康检查功能:如果Nginx proxy后端的某台服务器宕机了,不会影响前端访问。
- 节省带宽,支持gzip压缩。压缩后 请求和返回的速度更快
- 稳定性高:用于反向代理(负载均衡),宕机的概率微乎其微。
- 支持热部署。在不间断服务的情况下,对软件版本升级。
负载均衡主要解决稳定性。
二、Nginx的下载安装及其配置指令
1.环境准备
- 退出mysql:
shutdown;
- 查看防火墙状态:
firewall-cmd --state
,需要关闭防火墙 - 确认yum是否可用:
yum list
,需要yum可用 - 确认网络:
ping
,需要有网络 - 确认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握手过程中建立的密钥和算法 进行加密。
的下载与安装
的普通下载与安装
- 进入到opt目录中:
cd /opt
- 下载当前稳定版的nginx:
wget /download/nginx-1.22.
wget命令是Linux系统用于从Web下载文件的命令行工具 - 将Nginx压缩文件解压缩到/usr/local/目录下:
tar -zxvf nginx-1.22. -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
- 拉取官方的Nginx镜像:
docker pull nginx
- Nginx使用默认的配置来启动一个Nginx容器:
docker run --rm --name nginx-test -p 8080:80 -d nginx
,该nginx只需要拿到他的文件即可。
参数的含义:
–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/ /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/:/etc/nginx/ \
nginx
俩个-v就是将自己创建的html目录和文件挂载到容器对应的文件或文件夹上。
的启动和停止
- 启动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配置指令详解
1.全局配置
-
进入到nginx/conf,先备份配置文件:
cp
防止配置错误。 -
配置运行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/;
-
配置错误日志:
error_log logs/;
-
先创建一个文件,配置文件的引入:
include ;
#可运行的用户 用户组 #user zzx zzx; # # #工作进程数 通常设置为cpu数量相等。 cpu 1*1 worker_processes 1; #配置pid文件 #pid logs/; #配置错误日志 #error_log logs/; #配置文件引入 #include ;
块的配置
事件驱动模型
-
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/ main;
-
在http块中配置超时时间:
keepalive_timeout 120 100;
即120是服务端保持连接的时间,发给用户端的应答报文头部中的超时时间是100。100可不写且单位为秒s。 -
http块下的server块的配置
- 配置网络监听
- 第一种:
listen 192.168.126.4:80
即监听该ip地址192.168.126.4下的80端口的连接 - 第二种:
listen 80
即监听所有ip地址的80端口的连接
- 第一种:
- 基于名称来虚拟主机配置
这里的"主机",就是指此server块对外提供的虚拟主机。设置了主机的名称并配置好DNS,用户就可以使用该名称向此虚拟主机发送请求了。
即通过该名称访问nginx,该名称一般为域名,找到绑定域名的ip地址发送请求。 - 通过这个域名访问与之绑定的主机或者是ip:
server_name ;
使用完整的域名叫精准匹配,优先级最高。
使用将左侧(www)改为通配符*,优先级第二。
使用将右侧(com)改为通配符*,优先级第三。
使用正则表达式,优先级最低。
即通过网络监听端口的连接,该连接可以基于名称访问对应server块的虚拟主机。
-
配置server块下的location块
语法:
location[ = | ~ | ~* | ^~ ] uri{
}=,即精准匹配,例如location = /images/{...} ^~,即匹配到立即停止搜索,例如location ^~ /images/{...} ~,即正则匹配,区分大小写,例如location ~ .(jpg | gif)${...} ~* ,即正则匹配,不区分大小写,例如location ~* .(jpg | jif)${...} 不带任何符号,例如location /{...}
- 优先级:= > ^~ > ~ > ~* > 不带任何符号。与主机名称的匹配相似。
-
匹配请求的根目录
- Web服务器接收到网络请求后,首先要在服务器端指定目录中寻找请求资源。在nginx服务器中,指令root就是用来匹配这个根目录的。
- 指定nginx查找资源的根目录:
root html;
,即指定为nginx下的html目录;也可指定其他目录。 - 退出编辑,进入到sbin目录下,热重启:
./nginx -s reload
- 此时可以将一张图片上传到html下,通过浏览器访问:
192.168.126.4/;
如果端口号为80则可以省略,否则需要添加端口号。
配置文件:
#运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志及PID文件
#error_log logs/;
#error_log logs/ notice;
#error_log logs/ info;
#pid logs/;
#工作模式及连接数上限
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类型,类型由文件定义
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;
#定义使用 访问
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;
}
}
}
4. Nginx虚拟主机
1.虚拟主机的分类
基于多ip的虚拟主机,即ip不同,几乎不用
基于多端口的虚拟主机,即端口不同,应用于公司内部网站,网站后台
基于域名的虚拟主机,即域名不同,应用于外部网站
- 虚拟主机是一种特殊的软硬件技术,他可以将网络上的每一台计算机分城多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响。
2.基于单网卡多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" >
-
进入到html7中,创建index文件:
echo "this is html7" >
-
进入到conf目录,创建并编辑文件,用以创建server虚拟主机:
vim
,让对应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; } }
-
编辑,在http块内引入文件:
include ;
,此时需要先将server块的server_name的 *.*修改为其他值才可以重启。 -
到nginx目录下热重启nginx:
sbin/nginx -s reload
,热重启即生效配置文件
3.基于域名虚拟主机配置(最常用)
-
俩个域名指向同一个nginx服务器,用户访问不同的域名时显示不同的内容。
-
将hosts文件添加以下2个ip与域名绑定,也可使用hostsswitch软件。
192.168.126.4
192.168.126.4
此时的域名是假的。 -
进入到nginx目录下,创建2个域名的文件夹:
mkdir qiantai
,mkdir houtai
-
进入到qiantai目录,然后将前面的代码输入并创建:
echo "this is qiantai" >
-
进入到houtai目录,然后将前面的代码输入并创建:
echo "this is houtai" >
-
进入到conf目录,编辑并创建新文件:
vim
添加如下内容:server{ listen 80; server_name www.qiantai.cn; location /{ root qiantai; } } server{ listen 80; server_name www.houtai.cn; location /{ root houtai; } }
-
将引入到的http块中:
include ;
-
进入sbin目录,热重启:
./nginx -s reload
-
在浏览器通过域名访问,显示qiantai或houtai即可。
4.基于多端口虚拟主机配置
-
通过不同端口来区分不同的虚拟主机。此类虚拟主机对应的企业应用主要为公司内部的网站。
-
进入到nginx目录下,创建html8888和html9999目录:
mkdir html8888
,mkdir html9999
-
进入到html8888目录下,编辑文件,并添加this is html8888
-
进入到html9999目录下,创建并添加this is html8888进中:
echo "this is html9999 >"
-
进入到conf目录,编辑并创建:
vim
,添加如下内容:server{ listen 8888; server_name *.*; location /{ root html8888; } } server{ listen 9999; server_name *.*; location /{ root html9999; } }
-
编辑,在http块中将其他server引入注释掉,将引入:
include ;
-
进入到nginx目录,热重启:
sbin/nginx -s reload
-
通过浏览器访问:
192.168.126.4:8888
,192.168.126.4:9999
,都可以访问。
也就是说,3种分别是用ip,域名,端口来区分,还可以指定对应的html,也就是静态文件。
虚拟主机是主要作用就是多个服务器不需要启动多个nginx,只需要启动一个nginx。
5.核心指令
和alias指令
- 进入到conf目录,编辑并创建一个:
vim
- 在/opt/nginx/html目录下存放一张图片
- 编辑,将引入,其他的server注释:
include ;
- 热重启:
./nginx -s reload
server{
listen 8000;
server_name *.*;
location /images {
alias /opt/nginx/html/;
}
}
- 通过浏览器访问:
192.168.126.4:8000/images/
此时文件目录它不会将images路径叠加进来,所以现在的静态资源访问路径是/opt/nginx/html/。
root和alias的区别就是location /path中的path会不会被叠加进uri来访问静态资源,root会叠加,alias不会。
alias指令最后一定要加/。
指令
功能
1.停止处理请求,直接返回响应码或重定向到其他URL;
2.执行return指令后,location的后续指令将不再执行。
语法结构
code [text];如果返回2XX才有意义,text会在body中。
code URL;主要用于重定向。
URL;须以http或https开头。
3.返回的状态码:
301:永久重定向
302:临时重定向,禁止被缓存
303:临时重定向,禁止缓存,允许改变方法
307:临时重定向,禁止缓存,不允许改变方法
308:永久重定向,不允许改变方法
code[text] :
-
进入到conf目录,创建并编辑文件:
vim
,添加如下server块:server{ listen 8000; server_name *.*; location /{ return 200 "this is return"; } }
即在server块的location块里添加return语句:return 200 "this is return";
- 在文件中注释其他include的server块,将引入:
include ;
- 热重启:
../sbin/nginx -s reload
- curl提起一个http请求:
curl http://192.168.126.4:8000
code URL(常用于页面的跳转):
- 修改文件,将location中return的响应码修改为302并指定重定向的路径:
return 302 /bbs;
- 再指定一个location块,作为重定向的映射,模拟重定向:
server{
listen 8000;
server_name *.*;
location /{
return 302 /bbs;
}
location /bbs{
root html;
}
}
URL:
- 修改文件,将location中的return指向http或https开头的网址:
retuen ;
指令
rewrite是实现URL重定向的重要指令。
URI由存放资源的主机名、片段标志符和相对URI三部分组成。存放资源的主机名一般由传输协议(Scheme)、主机和资源路径三部分组成;片段标志符指向资源内容的具体元素;相对URI表示资源在主机的相对路径。
一般格式:Scheme:[//][[用户名[:密码]@]主机名[:端口号]][/资源路径]
URL是URI的子集,主要包括传输协议(Scheme)、主机(IP、端口号或者域名)和资源具体地址(目录和文件名)等三部分。
一般格式:Scheme://[主机名[:端口号]][/资源路径]
-
rewrite常用全局变量:
KaTeX parse error: Expected 'EOF', got '&' at position 35: …/?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: …/?a=1&̲b=2的document_uri就是,不包含后面的参数
$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 / 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引入到文件:
include rewrite_test.conf;
-
通过浏览器访问:
http://192.168.126.4:8000/search
,此时会永久重定向到百度。
rewrite ^/(.*) permanent;即重写从/开始(端口号/)后面的零个或多个字符(所有字符)为百度,且永久重定向。
redirect,临时重定向也就是普通的重定向。不会产生影响,只是重定向而已。
- break,
- html目录下创建三个文件夹images,photos,pics:
mkdir images
,mkdir photos
,mkdir pics
- 进入到photos目录,创建并输入一段话:
echo "this is photos > "
,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/页面。
在/images下面的rewrite加一个break,此时就重写为/pics/: rewrite /images/(.*) /pics/$1 break;
在/images下面的rewrite加一个last,此时就重写为photos/: rewrite /images/(.*) /pics/$1 last;
,也就是说默认为last。
last在匹配完本条规则后,再向server重新发起一个请求。
- 域名永久重定向
permanent,新网址完全继承旧网址,旧网址的排名等完全清零,永久重定向到,创建并编辑:vim
,添加如下:
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 ;
- 修改hosts文件:
192.168.126.4
,192.168.126.4
- 热重启:
../sbin/nginx -s reload
- 通过浏览器访问:
:8000
,此时永久重定向到上
指令
-
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目录创建并编辑:
vim
,添加以下:server{ listen 8000; server_name *.*; location /search{ if ($remote_addr = 192.168.126.4) { return 200 "if test success"; } return 500; } }
此时的if需要空格隔开,否则会热重启报错。
-
将引入中:
include ;
-
热重启:
../sbin/nginx -s reload
-
在命令行通过curl指令测试:
curl http://192.168.126.4:8000/search
-
在中的location里面再添加如下:
if ($http_user_agent ~ Chrome) { return 500; }
$http_user_agent,记录客户端浏览器的相关信息
即如果客户端通过谷歌浏览器访问则报500错误。
- 热重启:
../sbin/nginx -s reload
- 通过谷歌浏览器访问:
http://192.168.126.4:8000/search
和break指令
指令用于设置一个新的变量:
-
进入conf目录,创建并编辑一个文件:
vim
,添加如下:server{ listen 8000; server_name *.*; location / { set $test 10; return 200 $test; } }
$后面是变量名test,10则是变量的值。
-
进入到文件中,将引入:
include ;
-
热重启:
../sbin/nginx -s reload
-
通过命令行的curl指令测试:
curl http://192.168.126.4:8000
,返回一个10;但是让浏览器访问会自动下载一个文件10。
指令
用于中断当前相同作用域中的其他配置。
与java语法相同,想中断退出时,声明一个break;即可。
压缩指令
的压缩作用:
Nginx开启Gzip压缩功能,可以使网站的css、js、xml、html文件在传输时进行压缩,提高访问速度,进而优化Nginx性能。
将响应报文发送至客户端之前可以启用压缩功能,这样能够有效地节约宽带,并提高响应至客户端的速度。Gzip压缩可以配置http、server和location模块下。
即gzip能提高访问速度,节约宽带和提高响应速度。就是说在客户端浏览器请求到服务器的速度变快和服务器响应到客户端浏览器的速度变快,都得益于gzip压缩,使得在网络传输的时间缩减,并且节约宽带。
开启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目录,创建并编辑文件:
vim
,添加如下: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块中生效。
-
进入文件,在http块中将文件引入:
include ;
-
热重启:
../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; }
总结:
服务器、反向代理、负载均衡、动静分离四大应用场景。
首先反向代理,可以使用域名访问,由nginx来转发,提高服务器的安全性。
负载均衡,由于nginx的并发量实际可以达到2-4w,然后将客户端的请求按照规则分发给集群的各个服务器,达到负载均衡的效果。
HTTP服务器,也就是说它本身就是一个web服务器,可以存放静态资源,这样就可以实现一个动静分离;动态资源从服务器中请求,静态资源可以缓存在nginx服务器中。
2.可以通过从官网下载nginx进行安装,也可以通过docker进行下载安装,docker镜像比较方便。
nginx的目录有html,也就是存放静态资源的目录;conf,存放配置文件的目录;logs,存放日志的目录;sbin,存放脚本的目录,在此目录启动、关闭和重启nginx服务。
文件又分为全局、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使用最多的功能。