nginx基础
Nginx(“engine x”) 是一个高性能的HTTP和反向代理web服务器
Nginx是由Igor Sysoev(伊戈尔·赛索耶夫)为俄罗斯访问量第二的Rambler.ru站点开发的,采用C语言开发编写的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx1.0.4发布
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。由俄罗斯的程序设计师IgorSysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度BWS、新浪、网易、腾讯等
Nginx默认使用80端口
由于nginx放在最前面让用户访问,所有它也被称为网关服务器,它的功能很多,静态资源展示,伪静态,动静分离,负载等
nginx版本
- nginx开源版本
- nginx plus商业版
- Openresty版本
- Tengine版本
nginx开源版本
我们将要学习的版本
官网:http://nginx.org/
nginx plus商业版
F5官方出品
官网:https://www.nginx.com/
Openresty版本
OpenResty® 是一款基于 NGINX 和 LuaJIT 的 Web 平台
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关
OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统
OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应
官网;http://openresty.org/
Tengine版本
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。(可以这样理解:淘宝拿到了Nginx源代码之后,进行了功能的填充,优化等等,然后提交给Nginx官方,但是由于Nginx官方相应慢或者不响应,加上语言沟通的不顺畅,于是淘宝公司就自己打包,在遵循GPL的原则上进行二次开发,于是就出了现在的Tengine这个版本)
官网网站:http://tengine.taobao.org/
演示系统说明:
centos7,ip:192.168.3.60作为nginx服务器地址
centos7,ip:192.168.3.61作为被代理的服务器,Apache服务
centos7,ip:192.168.3.62作为被代理的服务器,Apache服务
安装
linux源码安装-centos7
安装环境:centos7系统
开源版本安装:1.22.1版本
0、关闭防火墙
防火墙实际中如果不需要全部关闭就需要配置对应的策略,这里方便演示直接停止
# 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
# 关闭selinux
setenforce 0
vim /etc/selinux/config
#SELINUX=enforcing
SELINUX=disabled
#将SELINUX=enforcing改为SELINUX=disabled
1、官网下载
版本有linux版本与windows版本
2、将下载的包上传到linux系统之中
[root@centos7-60 ~]# ls nginx-1.22.1.tar.gz
nginx-1.22.1.tar.gz
# 上传到家目录之中
3、解压
tar xzvf nginx-1.22.1.tar.gz
[root@centos7-60 ~]# tar xzvf nginx-1.22.1.tar.gz
4、安装依赖
源码安装的时候需要各种依赖,需要先安装依赖以及各种库,部分库缺少不影响使用,但会缺少某些功能(依赖其实就是nginx的运行环境,好比运行python脚本先安装python环境)
Nginx代码完全用C语言写的,需要安装C语言环境,在linux中是gcc包, gcc是c语言的解释器
依赖 | 说明 |
---|---|
gcc | nginx的运行环境,必须安装 |
pcre | 中文Perl兼容正则表达式,安装pcre库是为了使nginx支持HTTP Rewrite模块,必须安装 |
zlib | nginx使用zlib对http包的内容进行gzip,必须安装 |
openssl | 需要ssl的支持,如果不需要ssl支持,可以不安装 |
通过yum源安装,可以本地,也可以网络,这里是本地yum源
# 本地镜像挂载,yum已经提前配置完毕,没有配置需要进行配置
[root@centos7-60 ~]# mount /dev/sr0 /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
编译安装
# 安装gcc,本地已经存在,我这里之前已经存在
[root@centos7-60 ~]# yum -y install gcc
# 安装pcre库是为了使nginx支持HTTP Rewrite模块
[root@centos7-60 ~]# yum -y install pcre pcre-devel
# nginx使用zlib对http包的内容进行gzip
[root@centos7-60 ~]# yum -y install zlib zlib-devel
5、编译安装
安装完必须的依赖之后才能行编译,缺少依赖在安装的时候会有报错提示
[root@centos7-60 ~]# cd nginx-1.22.1/
[root@centos7-60 nginx-1.22.1]# ./configure --prefix=/usr/local/nginx
#指定安装的路径,可以任意,一般都安装在/usr/local/nginx
#编译以及安装,没有报错命令执行完说明安装成功
[root@centos7-60 nginx-1.22.1]# make -j 2 && make install
configure:检测你的安装平台的目标特征的
6、启动
# 进入到目录进行启动
[root@centos7-60 nginx-1.22.1]# cd /usr/local/nginx/sbin/
启动
[root@centos7-60 sbin]# ./nginx
7、访问
8、将nginx设置为脚本开机启动
1、文件不存在,需要创建,不使用脚本启动没有任何问题,这是方便运维
[root@centos7-60 ~]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance 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
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
文件内容解释:
[Unit]:服务的说明
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径
[Install]服务安装的相关设置,可设置为多用户
2、关闭原有服务
# 查看原来服务是否启动,启动就关闭
[root@centos7-60 ~]# ps -ef|grep nginx
[root@centos7-60 ~]# cd /usr/local/nginx/sbin/
[root@centos7-60 sbin]# ./nginx -s stop
3、启动并设置为开机自启
[root@centos7-60 system]# systemctl start nginx.service
[root@centos7-60 system]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
4、访问
源码安装编译参数
参数 | 说明 |
---|---|
–prefix | 指定安装目录 |
Nginx命令
源码安装进入到对应的目录去执行
./nginx:启动服务
./nginx -s stop:快速停止,强制关闭
./nginx -s quit:优雅关闭,不在请求新连接,等使用的连接断开之后关闭
./nginx -s reload:重新加载配置,在不重启服务的情况下(开一个新进程,原有进程不在接收请求,直至全部断开使用新进程)
01 基本使用
目录结构
目录 | 说明 |
---|---|
conf | 配置文件相关,以及nginx.conf对其他文件进行引用 |
sbin | 主程序,启动目录 |
logs | 访问日志目录 |
nginx.pid | 纪录主进程的id |
html | 默认网页以及站点资源 |
Nginx请求流程
- 开启nginx服务
- 服务启动后会在系统开辟一个主进程master
- 主进程读取并校验配置文件无错误之后创建子进程worker
- 主进程与子进程启动之后等待用户接入
- 用户通过网络访问请求
- 用户请求接入之后,有worker进程响应解析
- worker响应解析根据nginx.conf查找路径解析
Nginx在启动之后是多进程同时运行,主进程创建多进程,由多进程同时来完成用户的请求
Nginx配置文件
nginx配置文件
#user nobody;
# 启动用户是那个,默认nobody
worker_processes 1;
# 进程个数
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
# 事件驱动,每个worker_processes可以创建多少个连接
events {
worker_connections 1024;
}
http {
include mime.types; # include 引入其他模块 mime.types是请求头,标明类型,由服务端定义,也就是nginx,文件类型不是右后缀名决定的,由返回的 mime.types决定,在mime.types文件中指定,默认已经写了很多,告诉浏览器这个是啥文件
default_type application/octet-stream; #类型不存在就以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; # 数据零拷贝,类似复制文件的时候免除中间的环节,直接就传过去,减少了中间件的调度等过程
nginx是软件,运行在操作系统之上,操作系统通过网络接口把数据转发给nginx,nginx才能读取到用户请求(nginx在启动东的时候会向操作系统申请资源,这里是端口,通过此端口的请求转发到nginx),nginx根据请求在操作系统的磁盘中查找请求要访问的文件,这里开始是否开启sendfile(数据零拷贝),没有sendfile的过程(这里面有read和write两个过程,read就是nginx去read文件,完整的加载到应用程序的内存,读完之后发送到操作系统的网络接口,这里面会经过DMA的调度,网卡驱动缓存以及内核缓存,层层缓存会去层层复制;之后网络接口把数据推送给用户);有sendfile的过程(通过nginx向操作系统发送信号,用户请求到nginx上,nginx的应用内存不去加载(复制)磁盘上的文件,直接推送信号sendfile(sendfile是个方法,里面包含socket以及要发送的文件),发送给操作系统的网络接口,网络接口去读取对应的文件,读取的文件之后,直接发送给用户(这里面减少了复制的过程)
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #保持连接的超时时间,两个方向,客户端以及代理端
#gzip on;
# server这里是一个主机,主机可以有多个,主机与主机之间不干扰,指定不同的端口来区分,多个主机又叫做虚拟主机,简称vhost
server {
listen 80; #当前主机端口
server_name localhost; #当前主机的主机名或者域名,通过域名或主机名进行访问
#charset koi8-r;
#access_log logs/host.access.log main;
#域名后的路径资源,url:admin,192.168.3.60:admin
location / { #location用来匹配url,就是路由分发,一个主机下面可以有多个location
root html; #相对路径,相对于nginx的主目录/usr/local/nginx/,这里的html对应的是/usr/local/nginx/下的html
index index.html index.htm; #当前location生效,默认主页
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #服务器错误提示这些错误码的会转向内部的某地址,/50x.html表示直接从192.168.3.60/50x.html
location = /50x.html { # 跳转的页面50x.html不存在,用户方访问/50x.html的时候会指向root目录下的html目录,从html目录中去寻找50x.html
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
mime.types
mime.types指明文件类型
文件类型 | 代表 | 说明 |
---|---|---|
application/octet-stream | bin exe dll; | 以数据流的形式进行弹窗下载 |
虚拟主机与域名解析
域名、dns、ip地址的关系
浏览器、nginx与http协议
电脑通过dns获取到ip,会发起tcp/ip请求,http协议在tcp/ip之上,http协议中规定了某些标准,https加了一层认证
虚拟主机原理:一个ip对用多个域名,通过不同的域名寻找对应的资源
本机域名:在host文件中,本机有效
1、修改host文件:
2、访问
公网域名解析
域名可以在阿里云、腾讯云等众多平台购买
公网的域名可以解析自己本地内网ip,但是通过外网域名解析,只能是自己本地内网能访问,其他人访问不了,外网也不行
公网域名的配置这里不说
设置完毕后,启动解析,不同云平台的设置方法不同
1、配置公网域名解析与本地的服务器ip对应
2、访问
泛解析:多个域名全部找某ip地址(多用户二级域名),使用通配符*
1、泛解析配置
2、访问
虚拟主机不同端口的配置
80端口对应host1站点,81端口对应host2站点
站点目录不要创建在用户的家目录中,可能会出问题
1、创建多个站点
目录可以任意,这里创建在root目录中的www_hosts目录下
[root@centos7-60 ~]# mkdir /www_hosts
[root@centos7-60 ~]# cd /www_hosts/
[root@centos7-60 www_hosts]# mkdir host1
[root@centos7-60 www_hosts]# mkdir host2
站点主页设置
[root@centos7-60 www_hosts]# echo '我是host1的主页' > host1/index.html
[root@centos7-60 www_hosts]# echo '我是host2的主页' > host2/index.html
2、配置文件创建
复制个server进行编写就行
[root@centos7-60 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80; #端口
server_name localhost;
location / {
root /www_hosts/host1; #站点路径
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 81;
server_name localhost;
location / {
root /www_hosts/host2;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
3、重启
systemctl restart nginx
4、访问
虚拟主机域名配置
首先在云服务器上的域名已经做好配置,本地可以使用主机名来代替域名(修改为不同的主机名可以代替域名)。修改域名不会立即生效,需要等待一定的时间
host1站点对应站点1,也就是host1.damu.ltd
host2站点对应站点2,也就是host2.damu.ltd
1、创建多个站点
目录可以任意,这里创建在root目录中的www_hosts目录下
[root@centos7-60 ~]# mkdir www_hosts
[root@centos7-60 ~]# cd www_hosts/
[root@centos7-60 www_hosts]# mkdir host1
[root@centos7-60 www_hosts]# mkdir host2
2、站点主页设置
[root@centos7-60 www_hosts]# echo '我是host1的主页' > host1/index.html
[root@centos7-60 www_hosts]# echo '我是host2的主页' > host2/index.html
3、配置文件设置
使用域名进行访问端口就无所谓了,当然也可以通过端口来访问,这里就全部修改为80端口了
端口与域名有冲突的时候会报错,有的话根据报错来进行修改就行,主机名+端口唯一
[root@centos7-60 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name host1.damu.ltd; #主机名或域名
location / {
root /www_hosts/host1;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name host2.damu.ltd;
location / {
root /www_hosts/host2;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
4、重启
[root@centos7-60 ~]# systemctl restart nginx
5、访问
server_name匹配规则
匹配队则:由上而下进行匹配,第一个匹配到就不会在匹配后面的,全都没有匹配上会显示第一个,懂url路径分发的这里容易理解些
1、一个server里面可以配置多个server_name,多个域名指向同一个主机
多个server_name直接在第一个后面写,用空格区分
server_name host1.damu.ltd host2.damu.ltd;
2、通配符进行匹配,通配符匹配的范围比较广,所以使用通配符的server都写在下面
前缀匹配
server_name *.damu.ltd;
结束匹配
server_name host2.damu.*;
3、正则匹配
正则匹配很强大,所以你要学会正则,这里不讲解正则,因为正则需要单独拿出来讲解
以数字开头并且以.ltd结尾
server_name ~^[0-9]+\.damu\.ltd$;
需求解析应用
应用场景意义不大,没有啥必要,这是逻辑上的,实际上想怎么来怎么来
1、多用户二级域名系统
通过服务器配置,将访问的url转换为实际的url
用户访问nginx,nginx通过反向代理去寻找服务器,也就是真实的服务器,真实的服务器数据库把数据传给nginx,nginx把消息发送给用户
2、短网址
短网址唯一
用户访问nginx,nginx通过反向代理去寻找真实的服务器,在数据库中存储用户提交的短网址,想要进行跳转的地址(真实地址),系统返回一个短网址(短网址唯一:字典形式,uuid作为key,真实地址作为value,都存在数据库中)
3、httpdns
用户在请求之前会通过dns把域名解析出来,dns走的是udp协议,全网广播
httpdns走的是http协议
httpdns一般都是用在手机的app应用,或者基于c/s架构的
应用中内置服务器的地址,应用启动之后回想服务器发送请求,请求某域名的当前的ip,以参数的形式进行传递(ip.html?name=www.baidu.com),服务器系统读取参数ip并返回给服务器
在浏览器中htppdns不适用,逻辑就违背
反向代理
原理:用户通过网络访问到nginx服务器(通过网络可能是内网、外网种种情况都有),nginx服务器会把所有请求转发到后端的应用服务器(你能访问到nginx服务器,但不一定能访问到后端的真实服务器,提高安全性),后端应用服服务在返回到nginx服务器,然后在返回给用户
代理:代表用户传递请求
反向:对于用户而言代理服务器就是真正的服务器,nginx反向提供的
正向代理:用户通过代理上网就是正向代理的一种
问题:使用代理服务器需要考虑带宽,取决于最低的那个,如nginx的带宽是10M的,代理的是100M的,最大也就是10M
避免方式:LVS的DR模型,内置在centos系统中了
DR模型:经过nginx到后端服务器,后端服务器直接把数据给用户,不经过nginx,实际这种不太现实
应用场景:
1、传统场景
用户–路由器–外网网络(dns解析)–机房网关–防火墙–路由器交换机等–nginx服务器–各种后端服务器
通过nginx代理流媒体等超大文件数据,nginx会成为瓶颈,多配制一些nginx分组代理,也就是负载均衡
反向代理配置
配置文件恢复默认,再默认上面进行修改
在location里面进行配置
proxy_pass与root目录二选一,一般都使用proxy_pass
proxy_pass后面两种写法,1、直接写代理的地址(主机或网址)2、配置成一组服务器upstream
proxy_pass后面可以使用虚拟名字,任意,与upstream中对应,upstream与server模块是同一级别,不要写到server里面,可以使用它进行负载均衡配置
proxy_pass把请求发送到目标主机,目标主机在返回给nginx
proxy_pass默认不支持https
在另一个主机上创建一个Apache的httpd服务器,主机ip是192.168.3.61,作为真实的服务端1
1、httpd服务安装与启动
[root@centos7-61 ~]# mount /dev/sr0 /mnt/ # 使用的是本地yum源
[root@centos7-61 ~]# yum -y install httpd
[root@centos7-61 ~]# systemctl start httpd
[root@centos7-61 ~]# systemctl enable httpd
2、主机站点设置
[root@centos7-61 ~]# echo 'my 192.168.3.61 index' > /var/www/html/index.html
3、访问
看是否能访问到
4、配置文件修改
在192.168.3.60nginx服务器上进行配置
[root@centos7-60 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://192.168.3.61; # 配置代理服务器
#root html; #注释掉
#index index.html index.htm; ##注释掉,这是对应上面的html的
}
5、重启服务或者重新加载
[root@centos7-60 ~]# systemctl restart nginx
6、访问
负载均衡
需要负载均衡的一般是集群
集群:众多服务器,某个出问题不会影响,所有服务器提供的服务是一样的
轮询:用户访问nginx,nginx轮流访问后端集群服务器
轮询是负载均衡的算法之一
retry机制:请求某个服务器不能访问就访问其他的
载均衡配置
使用上面的192.168.3.61作为第一个站点,192.168.3.62作为第二个站点,也就是用户通过nginx访问的时候一会看到的是3.61的页面,一会是3.62的页面,这样做是为了演示负载效果,通过页面的变化演示访问效果
在另一个主机上创建一个Apache的httpd服务器,主机ip是192.168.3.62,作为真实的服务端2,3.61已经存在
1、httpd服务安装与启动
[root@centos7-61 ~]# mount /dev/sr0 /mnt/ # 使用的是本地yum源
[root@centos7-61 ~]# yum -y install httpd
[root@centos7-61 ~]# systemctl start httpd
[root@centos7-61 ~]# systemctl enable httpd
2、主机站点设置
[root@centos7-62 ~]# echo 'my 192.168.3.62 index' > /var/www/html/index.html
3、访问
看是否能访问到
4、配置文件修改
在192.168.3.60nginx服务器上进行配置
upstream与server模块是同一级别,不要写到server里面,upstream不存在,需要创建
[root@centos7-60 ~]# vim /usr/local/nginx/conf/nginx.conf
upstream httpd{
server 192.168.3.61:80;
server 192.168.3.62:80;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://httpd; #这里名字可以任意
#root html;
#index index.html index.htm;
}
5、重启
[root@centos7-60 ~]# systemctl restart nginx
6、访问
负载均衡策略权重
每个服务器的轮询的比例不同(这里比例取决于实际的各种各样的原因,如网络带宽,主次之分等),可以根据权重weight分配,down分配,backup分配
权重值weight的数字越大越优先,权重高,分配的次数就多,访问不是完全按照权重比例访问,基本上也差不多
down表示主机不参与负载
backup是备用服务器,其他的不能访问在访问这个
这些都不常用,一般用不到,实际我也没碰见过使用的,除非你你要这样进行分配
轮询无法保持会话,切换会话就会断开
1、192.168.3.60是nginx服务器,192.168.3.61是后端服务器1,192.168.3.62是服务器2,上面都已经配置好了
2、配置文件修改
[root@centos7-60 ~]# vim /usr/local/nginx/conf/nginx.conf
upstream httpd{
server 192.168.3.61:80 weight=4;
server 192.168.3.62:80 weight=2;
}
3、重启
[root@centos7-60 ~]# systemctl restart nginx
4、访问
down配置,使用down相当于使用down的没有配置
[root@centos7-60 ~]# vim /usr/local/nginx/conf/nginx.conf
upstream httpd{
server 192.168.3.61:80 weight=4 down;#相当于这个不存在,相当于这里只有3.62
server 192.168.3.62:80 weight=2;
}
backup配置,当主服务器断掉的时候,自动切换到这个
[root@centos7-60 ~]# vim /usr/local/nginx/conf/nginx.conf
upstream httpd{
server 192.168.3.61:80 weight=4;
server 192.168.3.62:80 weight=2 backup; #上面的出故障访问不了就会访问这个
}
负载均衡其它策略
一般只有特殊要求使用,否则基本用不到,在upstream中配置
策略 | 说明 |
---|---|
ip_hash | 判断来源的ip地址,相同的ip指向相同的服务器 |
least_conn | 最少连接访问,nginx转发到后端服务器,一台后端连接多,一台连接少,通过此方法控制 |
fair | fair是nginx负载均衡5大算法之一,属于第三方模块,yum安装的nginx没有fair模块,需要手动编译安装,根据后端服务器的响应时间去转发请求 |
url_hash | 定向流量转发,相同的hash值转发到相同的服务器上,一般用于访问固定资源,固定资源不在同一服务器nginx本身不支持,需要打patch .Url_hash你nginx在做负载均衡的时候。把转发的URL以hash的形式保存。这样可以保证同一个URL始终 分给同一个real server,来提高访问速度 |
ip_hash
ip_hash:nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session会话
简单来说就是在一些情况下需要将进行负载均衡的连接打到同一个服务器上
注意:nginx的ip hash默认只用了ip地址的前三位,这样做是为了让来自同一个地区的请求落在一个后台服务上,但是在内网项目,有的ip的前三段基本一样,所以就导致了基本上所有的链接都落在了一个后台服务上,在内网中使用怎么解决
1、使用搜索找到对应的文件ngx_http_upstream_ip_hash_module.c,修改里面的配置,在180行左右会找到hash变量的赋值语句
[root@centos7-60 nginx]# find / -name *ip_hash*
/root/nginx-1.22.1/src/http/modules/ngx_http_upstream_ip_hash_module.c
2、配置文件说明
3、修改iphp->addrlen长度,一共有3处地方需要修改,将3修改为4
4、重启
[root@centos7-60 ~]# systemctl restart nginx
一旦使用了ip_hash,当我们需要移除一台服务器的时候,不能直接删除这个配置项,而是需要在这台服务器配置后面加上关键字down,表示不可用;因为如果直接移除配置项,会导致hash算法发生更改,后续所有的请求都会发生混乱
配置ip_hash
1、当配置ip_hash之后,我们在访问nginx服务器192.168.3.60之后,第一次打开的是那个网页,就一直显示某个网页
2、修改配置文件,在对应的位置加上ip_hash就可以了
3、重启
[root@centos7-60 ~]# systemctl restart nginx
4、访问
动静分离
Nginx 动静分离简单来说就是把动态跟静态请求分开,可以提高访问效率
适用于中小型网站,大型网站过于复杂,因为中小型网站的并发量并不是特别高,需要分离出来的静态资源不是特别多。那么需要把这些静态资源,挪到前置的nginx服务器里,如果大型系统的话,文件就太多,不适合动静分离这种简单的技术架构
原理:用户访问nginx,nginx去后端请求资源,有静态的如js,css,img等,那这些静态的资源分离出来直接放到nginx上让用户来访问,减少再次去后端请求的时间与流量,提高并发量
使用192.168.3.61作为后端的服务器一个就可以,这里是实验动静分离效果,静态资源放到nginx上面
网络上下载网站源码上传到后端服务器模拟效果,对应的环境找对应的源码,这里是apache的httpd服务,使用下面的源码,源码可以在网络上下载
网站源码:这是一个开源的后台系统源码
1、上传网站源码到192.168.3.61的对应的目录,并解压,将里面的文件放进去就行,默认目录时/var/www/html
2、重启
[root@centos7-61 html]# systemctl restart httpd
3、访问,这是在192.168.3.61上安装完之后的效果
4、nginx配置文件修改,先进行代理访问,成功之后在进行下一步,熟悉的可以直接配置location进行访问
其他配置都注释,一条代理就行
5、重启
[root@centos7-60 ~]# systemctl restart nginx
6、访问
7、为了演示效果,可以将192.168.3.61的静态资源删除
删除之后访问,样式都消失了
8、将删除的目录传到nginx的目录上,这里上传到/usr/local/nginx/html目录中
[root@centos7-60 html]# ls
css images js
9、配置多个location或者通过正则匹配,实现静态资源分离到nginx上
nginx配置文件修改
多个location写法
location / {
proxy_pass http://192.168.3.61;
#root html;
#index index.html index.htm;
}
location /css {
root html;
index index.html index.htm;
}
location /js {
root html;
index index.html index.htm;
}
location /images {
root html;
index index.html index.htm;
}
正则匹配写法
location / {
proxy_pass http://192.168.3.61;
#root html;
#index index.html index.htm;
}
location ~*/(css|js|images) {
root html;
index index.html index.htm;
}
10、重启
[root@centos7-60 ~]# systemctl restart nginx
11、访问
location匹配规则
location 后还要加 ~ 相关表达式、 才能表示后面是正则表达式
location [=|~|~*|^~] /uri/ { }
正则由上而下进行匹配,/的优先级最低,多个目录写多个location可以,也可以通过正则表达式来进行匹配,直接在location后面跟上正则,正则在这里不区分大小写
正则以~开头,说明开始要进行正则匹了,:不区分大小写,(js|css|img)
location ~/(js|css|img)
Nginx正则路径匹配符号
= 表示精确匹配
^~ 表示uri以某个常规字符串开头,大多情况下用来匹配url路径,nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 正则匹配(区分大小写)
~* 正则匹配(不区分大小写)
!~ 区分大小写不匹配
!~* 不区分大小写不匹配
/ 任何请求都会匹配
符号优先级
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求
URL Rewrite地址重写
UrlRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址
将真实地址伪装成某个地址,隐藏真实的URL地址,可以伪装静态、动态地址,常用于将动态地址伪装成静态地址
负载均衡+URL rewrite经常一起使用
将192.168.3.61页面恢复为之前的my 192.168.3.61 index这个页面,在nginx上将这个地址重写为其他地址进行演示,nginx的配置文件,在location中添加rewrite,这里的3.61是个静态页面,在nginx重写为动态页面,反之亦然,里面可以使用正则
rewrite 正则 真实地址 动作标记
rewrite:使用rewrite进行地址重写
正则:正则匹配的是用户所看到的,重写之后的地址
真实地址:真正的地址
动作标记:匹配之后的动作
rewrite动作标记 | 说明 |
---|---|
last | 本条规则匹配到之后,继续向下匹配新的location url规则 |
break | 本条规则匹配到之后就停止,后面的不在进行匹配 |
redirect | 302临时重定向,浏览器会显示跳转后的url |
permanent | 301永久重定向,浏览器会显示跳转后的url |
1、恢复192.168.3.61动静分离,还是之前的页面,在配置文件中先注释掉或删除动静分离的配置,这里演示url rewrite地址重写
2、配置文件修改
3、访问正常
4、url rewrite地址重写配置
这是主页地址http://192.168.3.60/index.html,将主页地址重写为其他地址,实际就根据需求来写就行,这里重写为一个index.jsp的网页
5、访问http://192.168.3.60/index.jsp,成功