常用版本分为四大阵营:
Nginx开源版
http://nginx.org/
Nginx plus 商业版
https://www.nginx.com
openresty
http://openresty.org/cn/
Tengine
http://tengine.taobao.org/
解压下载好的安装包
tar zxvf nginx-1.21.6.tar.gz
进入到解压好的目录中
cd nginx-1.21.6/
编译安装依次执行
./configure --prefix=/usr/local/nginx
make
make install
如果出现警告或报错
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
进入安装好的目录 /usr/local/nginx/sbin
./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload 重新加载配置
创建服务脚本
vi /usr/lib/systemd/system/nginx.service
脚本内容
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重新加载系统服务
systemctl daemon-reload
启动服务
systemctl start nginx.service
开机启动
systemctl enable nginx.service
进入Nginx的主目录我们可以看到这些文件夹
其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件
client_body_temp
fastcgi_temp
proxy_temp
scgi_temp
用来存放配置文件相关
用来存放静态文件的默认目录 html、css等
nginx的主程序
nginx的日志文件
[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp # POST 大文件暂存目录
├── conf # Nginx所有配置文件的目录
│ ├── fastcgi.conf # fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件
│ ├── fastcgi_params # fastcgi的参数文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒体类型
│ ├── mime.types.default
│ ├── nginx.conf #这是Nginx默认的主配置文件,日常使用和修改的文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相关参数文件
│ ├── scgi_params.default
│ ├── uwsgi_params # uwsgi相关参数文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi临时数据目录
├── html # Nginx默认站点目录
│ ├── 50x.html # 错误页面优雅替代显示文件,例如出现502错误时会调用此页面
│ └── index.html # 默认的首页文件
├── logs # Nginx日志目录
│ ├── access.log # 访问日志文件
│ ├── error.log # 错误日志文件
│ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp # 临时目录
├── sbin # Nginx 可执行文件目录
│ └── nginx # Nginx 二进制可执行程序
├── scgi_temp # 临时目录
└── uwsgi_temp # 临时目录
Nginx的进程是使用经典的「Master-Worker」模型,Nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。worker进程主要处理基本的网络事件,多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。
worker_processes
:默认为1,表示开启一个业务进程 (通常情况下进程数和cpu内核数一致,能达到最好的性能)
worker_connections
:默认1024,表示单个业务进程可接受连接数
include mime.types;
:引入http mime类型 ,mime.type文件中存储了各种文件后缀对应的请求头信息
default_type application/octet-stream;
:如果mime类型没匹配上,默认使用二进制流的方式传输。
sendfile on;
使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。 即不将文件加载到nginx的应用内存中,直接通过网络端口进行传输
未开启sendfile
开启后
keepalive_timeout 65;
超时时间
server
虚拟主机配置
server {
listen 80;#监听端口号
server_name localhost;#主机名
location / { #匹配路径
root html; #文件根目录
index index.html index.htm;#默认页名称
}
error_page 500 502 503 504 /50x.html; #报错编码对应页面
location = /50x.html {#/50x.html文件所在位置
root html;
}
}
虚拟主机使用特殊的软硬件技术,把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每一台虚拟主机都具有独立的域名,具有完整的Internet服务器(WWW、FTP、Email等)功能,虚拟主机之间完全独立,并可由用户自行管理,在外界看来,每一台虚拟主机和一台独立的主机完全一样。
域名解析就是域名到IP地址的转换过程,IP地址是网路上标识站点的数字地址,为了简单好记,采用域名来代替ip地址标识站点地址,。域名的解析工作由DNS服务器完成。
域名是相对网站来说的,IP是相对网络来说的。当输入一个域名的时候,网页是如何做出反应的?
输入域名---->域名解析服务器(dns)解析成ip地址—>访问IP地址—>完成访问的内容—>返回信息。
Internet上的计算机IP是唯一的,一个IP地址对应一个计算机。
一台计算机上面可以有很多个服务,也就是一个ip地址对应了很多个域名,即一个计算机上有很多网站。
IP地址和DNS地址的区别
IP地址是指单个主机的唯一IP地址,而DNS服务器地址是用于域名解析的地址。
一个是私网地址,一个是公网地址;
一个作为主机的逻辑标志,一个作为域名解析服务器的访问地址。
IP地址
IP,就是Internet Protocol的缩写,是一种通信协议,我们用的因特网基本是IP网组成的。
IP地址就是因特网上的某个设备的一个编号。
IP地址一般由网络号,主机号,掩码来组成。
IP网络上有很多路由器,路由器之间转发、通信都是只认这个IP地址,类似什么哪?就好像你寄包裹,你的写上发件人地址,你的姓名,收件人地址,收件人姓名。
这个发件人地址就是你电脑的IP的网络号,你的姓名就是你的主机号。
收件人的地址就是你要访问的IP的网络号,收件人的姓名就是访问IP的主机号。
现在还有了更复杂的IPV6,还有IPV9。
DNS是什么?
我们访问因特网必须知道对端的IP地址,可是我们访问网站一般只知道域名啊,怎么办?
这时候DNS就有用处了,电脑先访问DNS服务器,查找域名对应的IP,于是,你的电脑就知道要发包到IP地址了。
http协议
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:
客户端与服务器的数据交互的流程:
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容,例如返回一个HTML的文本。
客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了
虚拟主机是为了在同一台物理机器上运行多个不同的网站,提高资源利用率引入的技术。
一般的web服务器一个ip地址的80端口只能正确对应一个网站。web服务器在不使用多个ip地址和端口的情况下,如果需要支持多个相对独立的网站就需要一种机制来分辨同一个ip地址上的不同网站的请求,这就出现了主机头绑定的方法。简单的说就是,将不同的网站空间对应不同的域名,以连接请求中的域名字段来分发和应答正确的对应空间的文件执行结果。举个例子来说,一台服务器ip地址为192.168.8.101,有两个域名和对应的空间在这台服务器上,使用的都是192.168.8.101的80端口来提供服务。如果只是简单的将两个域名A和B的域名记录解析到这个ip地址,那么web服务器在收到任何请求时反馈的都会是同一个网站的信息,这显然达不到要求。接下来我们使用主机头绑定域名A和B到他们对应的空间文件夹C和D。当含有域名A的web请求信息到达192.168.8.101时,web服务器将执行它对应的空间C中的首页文件,并返回给客户端,含有域名B的web请求信息同理,web服务器将执行它对应的空间D中的首页文件,并返回给客户端,所以在使用主机头绑定功能后就不能使用ip地址访问其上的任何网站了,因为请求信息中不存在域名信息,所以会出错。
我们可以在同一个servername中配置多个域名,中间通过空格隔开即可
完整匹配
server_name localhost fate.com;
通配符匹配
server_name *.fate.com;
需要注意的是精确匹配的优先级大于通配符匹配和正则匹配。
通配符结束匹配
server_name www.fate.*;
正则匹配
server_name ~^[0-9]+\.mmban\.com$;
匹配顺序
精确的名字
以*号开头的最长通配符名称,例如.example.org
以号结尾的最长通配符名称,例如 mail.*
第一个匹配的正则表达式(在配置文件中出现的顺序)
反向代理
描述:反向代理是指以代理服务器来接受连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器,而且整个过程对于客户端而言是透明的。
隧道式代理:一进一出一个口
正向代理
描述:正向代理意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后由代理向原始服务器转交请求并将获得的内容返回给客户端。
简单的说类似于采用VPN来访问google:
lvs(DR模型)
location / {
proxy_pass http://www.bilibili.com/;
# root html;
# index index.html index.htm;
}
当访问该ip地址时就会被代理到哔站
注意不支持https协议
可以有多个server。然后根据策略、调度。
负载均衡也是Nginx常用的一个功能。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。
而Nginx目前支持自带3种负载均衡策略还有2种常用的第三方策略。
upstream tests{
server fate.com:80;
server fate.com:81;
server fate.com:82;
}
server {
listen 80;
server_name localhost fate.com;
location / {
proxy_pass http://tests;
}
}
upstream
:配置别名,当其中存在多个ip端口,会自动采用负载均衡策略,nginx默认采用轮训策略
weight
:权重down
:当前server暂时不参与负载均衡backup
:备用预留服务器,当其他非backup机器忙碌或者down的时候,请求backup机器max_fails
:请求失败次数限制fail_timeout
:经过max_fails
后服务的暂停时间max_conns
:最大链接数轮询
:默认算法按时间顺序逐一分配到不同的后端服务器;
加权轮询
:Weight值越大,分配到访问几率越高;
ip_hash
:为每一个请求访问的IP的hash结果分配,可以将来自一个IP的固定访问一个后端服务器;
url_hash
:需要安装模块安装访问的URL的hash结果来分配,这样每个URL定向到同一个后端服务器
least_conn
:按照某台机器最少连接数的进行分配访问;
hash关键数值
: hash 自定义 KEY
fair
:根据后端服务器响应时间转发请求
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路;
增加每一个location
location /css {
root /usr/local/nginx/static;
index index.html index.htm;
}
location /images {
root /usr/local/nginx/static;
index index.html index.htm;
}
location /js {
root /usr/local/nginx/static;
index index.html index.htm;
}
使用正则
location ~*/(css|img|js) {
root /usr/local/nginx/static;
index index.html index.htm;
}
/ 通用匹配,任何请求都会匹配到。
~* 正则匹配,不区分大小写
^~ 非正则匹配,匹配以指定模式开头的location
location匹配顺序
alias与root
location /css {
alias /usr/local/nginx/static/css;
index index.html index.htm;
}
root用来设置根目录,而alias在接受请求的时候在路径上不会加上location。
1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的; 2)root指定
的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的; 3)使用
alias标签的目录块中不能使用rewrite的break(具体原因不明);另外,alias指定的目录后面必须要加上"/“符
号!! 4)alias虚拟目录配置中,location匹配的path目录如果后面不带”/“,那么访问的url地址中这个path目录后
面加不加”/“不影响访问,访问时它会自动加上”/“; 但是如果location匹配的path目录后面加上”/“,那么访问的url地
址中这个path目录必须要加上”/“,访问时它不会自动加上”/“。如果不加上”/“,访问就会失败! 5)root目录配置
中,location匹配的path目录后面带不带”/",都不会影响访问。
server {
listen 80;
server_name localhost fate.com;
location / {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=? break;
proxy_pass http://192.168.44.101:8080;
}
rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,
重定向到replacement,结尾是flag标记。
rewrite [flag];
关键字 正则 替代内容 flag标记
关键字:其中关键字error_log不能改变
正则
:perl兼容正则表达式语句进行规则匹配
替代内容
:将正则匹配的内容替换成replacement
flag标记
:rewrite支持的flag标记
rewrite参数的标签段位置
: server,location,if
flag标记说明: l
ast
#本条规则匹配完成后,继续向下匹配新的location URI规则
break
#本条规则匹配完成即终止,不再匹配后面的任何规则
redirect
#返回302临时重定向,浏览器地址会显示跳转后的URL地址 (防爬虫)
permanent
#返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
例子
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
systemctl start firewalld
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.101" port protocol="tcp" port="8080" accept"
查看已配置规则
firewall-cmd --list-all
systemctl restart firewalld
重载规则
firewall-cmd --reload
完成以上步骤后,发现无法访问192.168.44.104:8080端口,但是可以通过101(这里的localhost)访问104:8080
且URLrewrite把动态资源的地址隐藏起来了。
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
valid_referers none | blocked | server_names | strings ....;
none
, 检测 Referer 头域不存在的情况。blocked
,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以“http://” 或 “https://” 开头。server_names
,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。在需要防盗链的location中配置
valid_referers 192.168.44.101;
if ($invalid_referer) {
return 403;
}
原理很简单,先前的配置中是让nginx返回403的状态码,我们只需要为403状态码配置好反馈的页面即可
location ^~/images/ {
valid_referers 192.168.8.102 baidu.com;
if ($invalid_referer) {
return 403; # 返回错误码
}
root /www/resources;
}
error_page 403 /403.html;
location = /403.html {
root html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
原理依旧很简单,在if中使用rewrite将需要反馈的图片转发即可
location ^~/images/ {
valid_referers 192.168.8.102 baidu.com;
if ($invalid_referer) {
rewrite ^/ /images/x.png;
}
root /www/resources;
}
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。所以,Keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
keepalived官网http://www.keepalived.org
keepalived服务的三个重要功能:
yum安装:
yum install -y keepalived
配置文件路径
/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LB_102
}
vrrp_instance VI_102 { #虚拟路由器名称,在一个keepalived可以启多个虚拟路由器,每个虚拟路由器的名字都不一样
state MASTER#当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP,一般都是配置backup,该值无法决定身份,最终还是通过比较priority
interface ens33 #绑定为当前虚拟路由器使用的物理接口,如:ens32,eth0,bond0,br0#绑定为当前虚拟路由器使用的物理接口,如:ens32,eth0,bond0,br0
virtual_router_id 51#每个虚拟路由器惟一标识,范围:0-255,同一组虚拟路由器的vrid必须一致
priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254,每个keepalived主机节点此值不同
advert_int 1 #vrrp通告的时间间隔,默认1s
authentication { #认证机制
auth_type PASS #AH(不推荐)或PASS
auth_pass 1111 #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必须一样
}
virtual_ipaddress { #虚拟IP
192.168.8.200 #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认为/32
}
}
keepalive并非只检测nginx而是检测整个主机的状态,即keepalive自身,当nginx挂掉时keepalive进程可能还是正常,因此可以使用脚本来检测nginx的状态,当nginx错误时,kill掉keepalive进程,此种方式也适用于其他服务