nginx 官方文档
http://nginx.org/en/docs/
编译安装 很多功能可以自己定义
./configure
http://nginx.org/en/docs/configure.html
--user=lixinhai #注:指定启动nginx的进程的用户
--group=lixinhai #注:指定启动的组
--prefix=/usr/local/nginx1 #注:指定nginx的安装路径
--with-threads #注:启用线程池的使用
--with-http_ssl_module #注:https
#注:启用构建将HTTPS协议支持添加 到HTTP服务器的模块的功能。默认情况下未构建此模块。需要OpenSSL库来构建和运行此模块。
--with-http_realip_module #注:负载均衡
#注:启用构建ngx_http_realip_module 模块的功能,该 模块将客户端地址更改为在指定的标头字段中发送的地址。默认情况下未构建此模块。
--with-http_v2_module #注:http2.0
--with-file-aio #注:异步IO
#注:支持 在FreeBSD和Linux上使用 异步文件I / O(AIO)。
--with-http_stub_status_module #注:状态统计
#注:支持构建ngx_http_stub_status_module 模块,该 模块提供对基本状态信息的访问。默认情况下未构建此模块。
--with-stream #注:四层负载均衡的支持
--with-stream=dynamic #注:支持构建 用于通用TCP / UDP代理和负载平衡的 流模块。默认情况下未构建此模块。 --> 四层负载均衡的支持
--with-http_flv_module #注:开启某个功能
--without-http_gzip_module #注:禁用某个功能
目录解释
[root@cPen_nginx nginx-1.19.6]# cd /usr/local/nginx1/
[root@cPen_nginx nginx1]# ls
conf html logs sbin
# conf 存放配置文件
# html 存放网页(网站)
# logs 存放日志
# sbin 存放启动nginx的程序
启动nginx
[root@cPen_nginx sbin]# pwd
/usr/local/nginx1/sbin
[root@cPen_nginx sbin]# ./nginx #注:启动nginx
[root@cPen_nginx sbin]# /usr/local/nginx1/sbin/nginx #注:绝对路径启动
[root@cPen_nginx sbin]# ps aux|grep nginx #注:查看nginx的进程
root 19558 0.0 0.0 41084 848 ? Ss 15:01 0:00 nginx: master process ./nginx
lixinhai 19559 0.0 0.2 74644 4740 ? S 15:01 0:00 nginx: worker process
#注:master process 管理进程 父进程
#注:worker process 工作进程 子进程
#注:只要master进程在,worker进程被杀死后 会自动生成;但是master进程不在了,worker进程被杀死后 不会自动生成。
修改PATH
# 可以实现直接输入nginx启动
[root@cPen_nginx sbin]# PATH=$PATH:/usr/local/nginx1/sbin/ #注:临时修改
# 永久修改
#注:修改PATH变量,可以对下面的4个文件都可以追加进去
[root@cPen_nginx nginx]# vim /etc/bashrc #注:4个文件都可
[root@cPen_nginx nginx]# vim /etc/profile
[root@cPen_nginx nginx]# vim /root/.bashrc
[root@cPen_nginx nginx]# vim /root/.bash_profile #注:永久修改
PATH=$PATH:$HOME/bin:/usr/local/nginx1/sbin/
# 脚本写法
#修改PATH变量
echo "PATH=$PATH:/usr/local/nginx1/sbin" >>/root/.bashrc
#执行修改了环境变量的脚本
source /root/.bashrc
nginx 命令
nginx -s stop
nginx -s quit 推荐
nginx -s reload 重新加载 灰度处理 旧 --> 新的 中间并没有暂停业务
修改了nginx的配置文件
相当于刷新服务 启动新的配置
nginx -t 测试nginx.conf配置文件是否有错误
官方文档解释
nginx -s signal
Where signal may be one of the following:
·stop — fast shutdown #注:立马停止
·quit — graceful shutdown #注:正常的关闭 (已经服务的服务完)
·reload — reloading the configuration file #注:重新加载配置文件 (慢慢从旧的进程过渡到新的进程)
·reopen — reopening the log files #注:重新生成1个新的日志文件
设置开机启动
[root@cPen_nginx nginx]# vim /etc/rc.local
/usr/local/nginx1/sbin/nginx
[root@cPen_nginx nginx]# chmod +x /etc/rc.d/rc.local
判断nginx 是否启动
# 看端口、看进程
[root@cPen_nginx ~]# ps aux|grep nginx
[root@cPen_nginx ~]# lsof -i:80
关闭防火墙
方便其他机器访问
#firewalld and selinux
#stop firewalld和设置下次开机不启动firewalld
service firewalld stop
systemctl disable firewalld
#临时停止selinux和永久停止selinux
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/sysconfig/selinux
#!/bin/bash
#解决软件的依赖关系,需要安装的软件包
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make
#useradd lixinhai
id lixinhai || useradd -s /sbin/nologin lixinhai
#download nginx
mkdir -p /nginx
cd /nginx
curl -O http://nginx.org/download/nginx-1.19.6.tar.gz
#解压 下载的nginx的源码包
tar xf nginx-1.19.6.tar.gz
cd nginx-1.19.6
#生成编译前配置工作 --> Makefile
./configure --prefix=/usr/local/nginx1 --user=lixinhai --group=lixinhai --with-threads --with-http_ssl_module --with-http_realip_module --with-http_v2_module --with-file-aio --with-http_stub_status_module --with-stream
#编译
make -j 2
#编译安装 --> 将编译好的二进制程序安装到指定目录 /usr/local/nginx1
make install
#修改PATH变量
echo "PATH=$PATH:/usr/local/nginx1/sbin" >>/root/.bashrc
#执行修改了环境变量的脚本
source /root/.bashrc
#启动nginx
/usr/local/nginx1/sbin/nginx
#firewalld and selinux
#stop firewalld和设置下次开机不启动firewalld
service firewalld stop
systemctl disable firewalld
#临时停止selinux和永久停止selinux
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/sysconfig/selinux
#开机自启
echo "/usr/local/nginx1/sbin/nginx" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local
如何卸载编译安装的nginx
# 删除安装指定的目录 --prefix指定的路径
[root@cPen_nginx ~]# rm -rf /usr/local/nginx1/
查看nginx版本
[root@cPen_nginx conf]# nginx -v
nginx version: nginx/1.19.6
nginx是一个模块,一个功能
编译安装的参数
--with-http_stub_status_module 状态统计功能
--with-stream 4层负载均衡功能
--with-http_ssl_module https
--with-http_realip_module 负载均衡器 中间件
功能:https
http + SSL --> 对http数据进行加密
去阿里云或者腾讯云申请免费的证书 --> 证书是什么?
证书:其实就是我们的加密使用的密钥
#步骤1.1:去申请证书,并且下载下来
======================================================================
#步骤1.2:证书需要上传到自己的linux服务器里
[root@cPen_nginx conf]# pwd
/usr/local/nginx1/conf #注:证书建议存放在conf目录下
[root@cPen_nginx conf]# ls 5151781_www.cpen.top_nginx.zip
5151781_www.cpen.top_nginx.zip
[root@cPen_nginx conf]# unzip 5151781_www.cpen.top_nginx.zip
[root@cPen_nginx conf]# ls 5151781_www.cpen.top*
5151781_www.cpen.top.key 5151781_www.cpen.top_nginx.zip 5151781_www.cpen.top.pem
======================================================================
#步骤1.3:修改nginx.conf配置文件,使用证书
#注:配置文件改之前 做备份
[root@cPen_nginx conf]# cp nginx.conf nginx.conf.20210202.bak
[root@cPen_nginx conf]# vim nginx.conf #注:可以复制注释的部分
server { #注:https的配置
listen 443 ssl; #注:监听的端口号
server_name www.cpen.top; #注:虚拟主机对应的域名
access_log logs/cpen.top.access.log main; #注:正常的访问信息(访问日志)
error_log logs/cpen.top.error.log; #注:出错的信息(错误日志)
ssl_certificate 5151781_www.cpen.top.pem; #注:公钥 --> 证书
ssl_certificate_key 5151781_www.cpen.top.key; #注:私钥
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html/cpen.top;
index index.html index.htm;
}
}
----------------------------------------------------------------------
[root@cPen_nginx conf]# nginx -s reload
[root@cPen_nginx cpen.top]# netstat -anplut|grep nginx #注:https监听443端口
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 955/nginx: master p
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 955/nginx: master p
======================================================================
#步骤1.4:修改本地hosts文件
C:\Windows\System32\drivers\etc\hosts
192.168.1.11 www.cpen.top
效果
www.cpen.top --> https://www.cpen.top/ #注:虚拟主机 匹配不到时,默认选第一个虚拟主机
或者直接访问 https://www.cpen.top/ 成功
3种方法:proxy_pass、return 301、rewrite
#步骤:修改配置文件
[root@cPen_nginx conf]# vim nginx.conf
server { #注:http虚拟主机
listen 80;
server_name www.cpen2.top;
location / {
#proxy_pass https://www.cpen.top; #效果不是特别好
return 301 https://www.cpen.top; #效果非常好 (最好)
#rewrite /(.*) https://www.qq.com permanent;
#rewrite /(.*) https://www.cpen.top permanent; #效果也非常好
}
}
=========================================================================
#注:修改本地hosts文件
C:\Windows\System32\drivers\etc\hosts (Windows)
192.168.1.11 www.cpen2.top
=========================================================================
#注:效果 Chrome浏览器
www.cpen2.top --> https://www.cpen.top/
编译安装时 加上 --with-http_realip_module模块
让后端real server知道前端(client)的ip地址
模块 ngx_http_realip_module
real-ip模块的使用
当本机的nginx处于一个反向代理的后端时获取到真实的用户IP
给后端的backend服务器使用的
后端的real server不知道前端真正访问的ip地址,只是知道负载均衡的ip地址,如何让后端的real server知道前端真正的用户的ip地址?
解决方法1:后端real server不使用realip模块
解决方法2:后端real server使用realip模块
#解决方法1:后端real server不使用realip模块
#步骤1.1:在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段
[root@cPen-LB conf]# vim nginx.conf
http {
……
upstream myweb1 {
server 192.168.1.161 weight=1;
server 192.168.1.162 weight=1;
server 192.168.1.163 weight=1;
}
server {
listen 80;
server_name www.sc.com;
location / {
proxy_pass http://myweb1;
proxy_set_header X-Real-IP $remote_addr;
}
}
……
}
#注:详解
将nginx内部的remote_addr这个变量的值,赋值给X-Real-IP这个变量,X-Real-IP这个变量会在http协议的请求报文里添加一个X-Real-IP的字段,后端的real server 服务器上的nginx就可以读取这个字段的值
X-Real-IP 这个变量名可以自己定义,随便取名,后面引用的时候,不区分大小写
proxy_set_header 指令的作用就是告诉nginx去修改http协议的头部信息,增加一个字段
--------------------------------------------------------------------------------------------
#步骤1.2:在后端real server上使用这个x_real_ip这个字段
#注:详解
在主配置文件nginx.conf里的日志部分调用这个变量,获取x_real_ip的值
$HTTP_X_REAL_IP
[root@cPen-web1 conf]# vim nginx.conf
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $HTTP_X_Real_IP - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
……
}
--------------------------------------------------------------------------------------------
#注:效果
Chrome浏览器
192.168.1.160 --> 192.168.1.161 real server1
[root@cPen-web1 conf]# tail -f /usr/local/nginx1/logs/feng.com.access.log #注:real server1 的访问日志
192.168.1.160 - 192.168.1.3 - - [04/Feb/2021:20:01:18 +0800] "GET / HTTP/1.0" 200 626 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" "-"
#注:获取到真实的用户IP 192.168.1.3
===========================================================================================
#解决方法2:后端real server使用realip模块
#步骤2.1:同上
在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段
[root@cPen-LB conf]# vim nginx.conf
http {
……
upstream myweb1 {
server 192.168.1.161 weight=1;
server 192.168.1.162 weight=1;
server 192.168.1.163 weight=1;
}
server {
listen 80;
server_name www.sc.com;
location / {
proxy_pass http://myweb1;
proxy_set_header X-Real-IP $remote_addr;
}
}
……
}
--------------------------------------------------------------------------------------------
#步骤2.2:在后端real server上使用set_real_ip_from 192.168.0.160
[root@cPen-web2 conf]# vim nginx.conf
server {
listen 80;
set_real_ip_from 192.168.1.160; #告诉本机的nginx 192.168.0.160 是负载均衡器,不是真正的client
……
#注:详解
set_real_ip_from 192.168.0.160; 告诉本机的nginx 192.168.0.160 是负载均衡器,不是真正的client
--------------------------------------------------------------------------------------------
#注:效果
Chrome浏览器
192.168.1.160 --> 192.168.1.161 real server1
[root@cPen-web2 conf]# tail -f /usr/local/nginx1/logs/feng.com.access.log #注:real server2 的访问日志
192.168.1.3 - - [04/Feb/2021:20:01:17 +0800] "GET / HTTP/1.0" 200 626 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" "-"
#注:获取到真实的用户IP 192.168.1.3
模块学习:利用nginx做网站提供下载功能
ngx_http_autoindex_module 模块,把文件夹里的东西列出来给你看
autoindex on 指令放在 location / 下,实现下载功能
#步骤1:修改配置文件
[root@cPen_nginx conf]# vim nginx.conf
server {
listen 80;
server_name www.a.com;
access_log logs/a.com.access.log main;
location / {
root html/a.com;
index index.html index.htm;
autoindex on;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html/a.com;
}
}
-------------------------------------------------------------------
#步骤2:刷新nginx服务
[root@cPen_nginx conf]# nginx -s reload
-------------------------------------------------------------------
#步骤3:准备一个下载的目录,赋值一些文件到里面去,供其他人可以下载,测试这个下载功能
[root@cPen_nginx b.com]# mkdir download
[root@cPen_nginx b.com]# mkdir cPen
[root@cPen_nginx b.com]# cd download/
[root@cPen_nginx download]# cp /nginx/nginx-1.19.6 . -r
[root@cPen_nginx download]# cp /etc/hosts .
[root@cPen_nginx download]# cp /etc/passwd .
效果
Chrome浏览器
http://www.b.com/download/
只能提供下载功能,别人不能上传文件(不能提供上传)
模块学习:nginx状态统计功能
要求:编译安装时构建模块 --with-http_stub_status_module
功能:知道当前时刻有多少人在线,进行状态统计
官网示例
location = /basic_status {
stub_status;
}
#步骤:添加路由
[root@cPen_nginx conf]# vim nginx.conf
server {
listen 80;
server_name www.c.com;
access_log logs/c.com.access.log main;
location / {
root html/c.com;
index index.html index.htm;
}
location = /status { #注:= 号 精准匹配
stub_status;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html/c.com;
}
}
-------------------------------------------------------------------
#效果
Chrome浏览器
http://www.c.com/status
模块学习:认证功能 (认证模块)
官网示例
location / {
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}
可以给任意的url增加认证功能:
给 http://www.c.com/status --> 访问这个url需要提供用户名和密码
给 http://www.b.com/download/ --> 访问这个url需要提供用户名和密码
步骤1:修改配置文件
[root@cPen_nginx conf]# vim /usr/local/nginx1/conf/nginx.conf
server {
listen 80;
server_name www.b.com;
……
#下载需要提交用户名和密码
location = /download { #注:路由/download
auth_basic "sanchuang download site"; #注:站点名
auth_basic_user_file b.com.htpasswd; #注:认证文件
}
}
……
server {
listen 80;
server_name www.c.com;
……
location = /status { #注:路由/status
auth_basic "sanchuang site"; #注:站点名
auth_basic_user_file htpasswd; #注:认证文件
stub_status;
}
-----------------------------------------------------------------------------------------
步骤2:生成 htpasswd文件,文件里存放我们的用户名和密码
#注:认证文件放在conf目录下
#问:htpasswd文件 到底需要放到哪里?哪个目录?
#答:/usr/local/nginx1/conf目录下
/usr/local/nginx1/conf/htpasswd
/usr/local/nginx1/conf/b.com.htpasswd
[root@cPen_nginx conf]# yum provides htpasswd
httpd-tools-2.4.37-30.module_el8.3.0+561+97fdbbcc.x86_64 : Tools for use with the Apache HTTP Server
[root@cPen_nginx conf]# yum install httpd-tools -y #注:得到htpasswd命令
[root@cPen_nginx conf]# htpasswd -c /usr/local/nginx1/conf/htpasswd cali #注:设置认证文件
New password: #注:认证用户名和密码
[root@cPen_nginx conf]# htpasswd -c /usr/local/nginx1/conf/b.com.htpasswd feng
New password:
[root@cPen_nginx conf]# cat htpasswd
cali:$apr1$agL3hnrA$dWwcbnAe5HnifgnIItJrC1
[root@cPen_nginx conf]# cat b.com.htpasswd
feng:$apr1$cqOa9pfC$02gF0.0c.9kKmz/KGzQp91
-----------------------------------------------------------------------------------------
步骤3:重新启动nginx服务
[root@cPen_nginx conf]# nginx -s reload
========================================
效果:
Chrome浏览器
http://www.c.com/status
模块学习:rewrite功能
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
rewrite功能 https://www.cnblogs.com/brianzhu/p/8624703.html
rewrite功能 https://www.cnblogs.com/crazymagic/p/11034300.html
rewrite功能 https://segmentfault.com/a/1190000002797606
示例1:页面跳转
www.360buy.com --> www.jd.com
www.jd.com --> 111.13.149.108
<head>
…… #注:5 5s跳转
<meta http-equiv="refresh" content="5;url=https://www.sanchuangedu.cn">
head>
#注:0 0s跳转
<meta http-equiv="refresh" content="0;url=https://www.sanchuangedu.cn">
示例2:对url进行转发
rewrite ^/(.*) http://www.sanchuangedu.cn/$1 permanent;
#解释:
http://www.b.com/feng --> http://www.sanchuangedu.cn/feng #注:$1表示 第一个组 feng
http://www.b.com/lixinhia --> http://www.sanchuangedu.cn/lixinhia
#注:permanent永久重定向的意思
rewrite是实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转到相应的网站
#步骤:修改配置文件
[root@cPen_nginx conf]# vim nginx.conf
server {
listen 80;
server_name www.b.com;
access_log logs/b.com.access.log main;
location / {
root html/b.com;
index index.html index.htm;
autoindex on;
rewrite ^/(.*) http://www.sanchuangedu.cn/$1 permanent;
}
……
}
-----------------------------------------------
#效果:
http://b.com --> https://www.sanchuangedu.cn/
http://b.com/cpen --> https://www.sanchuangedu.cn/cpen/
模块 ngx_http_referer_module 与引用相关的模块
http://nginx.org/en/docs/http/ngx_http_referer_module.html#valid_referers
防盗链
rewrite功能可以帮我们去做,防止别人盗
http标签里有 http_referer,这个字段写明你曾经从哪个网站跳转过来的
http_referer 从哪个网站导流过来的 --> 引流过来的
#步骤:修改配置文件 (图片防盗链)
[root@cPen_nginx conf]# vim nginx.conf
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.a.cn www.b.com; # 定义有效的引用
if ($invalid_referer) {
return 404;
}
} # 防盗链
#注解:
none blocked www.a.cn www.b.com 有效的引用
直接访问的,requests 包头里的refere字段没有内容 --> none
blocked代表有 referer 但是被防火墙或者是代理给去除了
refere字段的内容里有 www.a.cn www.b.com 这些字符串
当不满足 valid_referers 指令的条件,就返回1赋值给$invalid_referer这个变量
模块 ngx_http_limit_conn_module 限制连接的模块
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
官网示例
可以根据ip地址或者域名来限制
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
...
limit_conn perip 10;
limit_conn perserver 100;
}
#示例:
[root@cPen_nginx conf]# vim nginx.conf
limit_conn_zone $binary_remote_addr zone=perip:10m;
server {
listen 80;
limit_conn perip 1;
#注:for循环写个脚本,发起10个进程去下载资源,后面9个会下载失败
限制请求数
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
官方示例
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; #注:在http里面开辟空间
limit_req_zone $server_name zone=perserver:10m rate=10r/s;
server {
...
limit_req zone=perip burst=5 nodelay;
limit_req zone=perserver burst=10;
}
#示例:修改配置文件
[root@cPen_nginx conf]# vim nginx.conf
http {
……
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
server {
listen 80;
server_name www.feng.com;
limit_req zone=perip burst=1 nodelay;
……
}
属于nginx核心模块内容
http://nginx.org/en/docs/http/ngx_http_core_module.html
[root@cPen_nginx conf]# vim nginx.conf
#user nobody; #注:默认使用nobody用户去启动nginx
worker_processes 1; #注:工作进程的数量,建议工作进程的数量和CPU核心一致
#error_log logs/error.log; #注:错误日志 /usr/local/nginx1/logs/……
#error_log logs/error.log notice; #注:notice通知
#error_log logs/error.log info; #注:级别 info级别
#pid logs/nginx.pid; #注:nginx master的进程号pid
#注:/usr/local/nginx1/logs/nginx.pid
events {
#注:需要根据实际的CPU,内存,带宽,磁盘IP能力来进行压力测试
#注:1个cpu核心 --> 4G的内存
worker_connections 1024; #注:并发数量,同时可以允许多少人同时访问nginx
} #注:--> 同时1024个人访问 (开的线程)
#注:一个用户访问,nginx就会起一个线程来接待
#注:worker_processes * worker_connections = 2 * 1024=2048
http { #注:http协议的相关的配置
include mime.types; #注:nginx服务器支持打开哪些文件类型 /usr/local/nginx1/conf/mime.types
default_type application/octet-stream;
#注:日志格式 log_format
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#注:远程ip地址、远程用户、本地时间、请求报文、状态码……
#access_log logs/access.log main; #注:正常的访问日志 /usr/local/nginx1/…
sendfile on; #注:发送文件 启动异步数据加载 传输方面的加速
#tcp_nopush on; #注:传输层push标志位,nopush
#keepalive_timeout 0;
keepalive_timeout 65; #注:65秒后nginx会主动断开连接
#gzip on; #注:启用压缩功能 --> 加快传输的速度 gzip模块
#注:将index.html压缩 传送过来,所用的时间短一些
server { #注:提供web服务的配置 --> 虚拟主机 --> 网站
listen 80; #注:监听80端口
server_name localhost; #注:网站服务的域名
#charset koi8-r;
#access_log logs/host.access.log main; #注:访问日志的路径和格式
location / { #注:提供某个路由的配置 --> / 访问网站的根目录
root html; #注:html是存放网页的根目录 --> /usr/local/nginx1/html
index index.html index.htm; #注:指定首页
}
#注:错误页面,访问不到网页的时候,会给用户返回这个页面
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80 #注:lnmp的架构
#
#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 #注:对HTTPS的支持的配置
#
#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;
# }
#}
}
/usr/local/nginx1/conf/nginx.conf
配置文件:给进程传参
[root@cPen_nginx conf]# pwd
/usr/local/nginx1/conf
[root@cPen_nginx conf]# ls nginx.conf
nginx.conf
[root@cPen_nginx conf]# cat /proc/cpuinfo #注:cpu信息,比如CPU核心数
虚拟主机是核心模块的功能
virtual server --> 虚拟主机
nginx服务器 --> 跑很多的虚拟主机 --> 网站
虚拟主机的配置
基于域名的
最常见的
基于 IP 的虚拟主机
一个网站对应一个公网ip
基于端口的虚拟主机
一个网站一个端口
www.a.com 192.168.1.11
www.b.com 192.168.1.11
www.c.com 192.168.1.11
#注:架构 (修改nginx.conf主配置文件)
[root@cPen_nginx conf]# vim nginx.conf
http{
server{
server_name www.a.com
……
}
server{
server_name www.b.com
……
}
server{
server_name www.c.com
……
}
}
步骤1:第1步是修改nginx.conf主配置文件,添加3个虚拟主机的配置
# 修改主配置文件,添加3个虚拟主机的配置
[root@cPen_nginx conf]# vim nginx.conf
http {
……
server {
listen 80;
server_name www.a.com;
access_log logs/a.com.access.log main;
location / {
root html/a.com;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html/a.com;
}
}
server {
listen 80;
server_name www.b.com;
……
……
}
# 重启服务
[root@cPen_nginx conf]# nginx -t
[root@cPen_nginx conf]# nginx -s reload
步骤2:到存放网页的地方新建文件夹和网页
[root@cPen_nginx conf]# cd /usr/local/nginx1/html/
[root@cPen_nginx html]# mkdir a.com b.com c.com
[root@cPen_nginx html]# cd a.com/
[root@cPen_nginx a.com]# vim index.html
[root@cPen_nginx a.com]# vim 404.html
[root@cPen_nginx a.com]# vim 50x.html
[root@cPen_nginx a.com]# cd ..
[root@cPen_nginx html]# cp a.com/* b.com/
[root@cPen_nginx html]# cp a.com/* c.com/
[root@cPen_nginx html]# yum install tree -y
[root@cPen_nginx html]# tree
.
├── a.com
│?? ├── 404.html
│?? ├── 50x.html
│?? └── index.html
├── b.com
……
步骤3:在客户机上直接修改hosts文件进行域名解析
# Linux里修改
[root@web-client ~]# vim /etc/hosts
192.168.1.11 www.a.com
192.168.1.11 www.b.com
192.168.1.11 www.c.com
# Windows系统里修改
C:\Windows\System32\drivers\etc\hosts
192.168.1.11 www.a.com
192.168.1.11 www.b.com
192.168.1.11 www.c.com
查看效果
# Linux客户机
[root@web-client ~]# curl www.a.com #注:访问 查看效果
welcome to a.com
[root@web-client ~]# curl www.a.com/chenpeng
404 error a.com
[root@web-client ~]# curl www.a.com/50x.html
50x error a.com
# Windows客户机
http://www.a.com/ welcome to a.com
http://www.a.com/chenpeng 404 error a.com
http://www.a.com/50x.html 50x error a.com
location 属于 ngx_http_core_module 模块
= 优先级最高(进准匹配);/ 优先级最低(模糊匹配)
location对url的匹配
http://nginx.org/en/docs/http/ngx_http_core_module.html#location
URI和URL
http://www.a.com/download/a.txt --> URL
download/a.txt --> URI (不看前面的域名、协议)
location语法规则
https://blog.csdn.net/zwl18210851801/article/details/81699977
示例:location路由转发功能
#步骤:修改配置文件
[root@cPen_nginx conf]# vim nginx.conf
server {
listen 80;
server_name www.d.com;
location / {
proxy_pass http://www.qq.com; #注:proxy_pass --> 转发
#注:也可以rewrite 转发
#rewrite ^/(.*) http://www.sanchuangedu.cn/$1 permanent;
}
}
-------------------------------------------------------
#步骤:修改hosts文件 (Windows)
C:\Windows\System32\drivers\etc\hosts
192.168.1.11 www.d.com
-------------------------------------------------------
#步骤:访问www.d.com
www.d.com --> https://www.qq.com/
http://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate
官网示例
location /flv/ {
flv;
limit_rate_after 500k;
limit_rate 50k;
}
此处官方网站介绍有误
不起限速作用
放在http里或者server里 生效
当一个文件下载到指定大小(本例中为500k)之后开始限速
#示例:修改配置文件
[root@cPen_nginx conf]# vim nginx.conf
server {
listen 80;
limit_rate_after 10k;
limit_rate 5k;
------------------------------------------
#注:配置不能放在location里,不然不会生效
#注:放在http里或者server里 生效 (只是http里会影响所有的server)
反向代理和正向代理区别
https://www.cnblogs.com/taostaryu/p/10547132.html
正向代理
正向代理类似一个跳板机,代理内部机器去访问外部资源 #注:站在用户一方去思考
反向代理
代理服务器在企业一方 #注:为企业加速
为什么需要负载均衡?
答:用户量大。大流量大负载,负载均衡的引入
如何把用户均匀的分散到15台服务器上?
答:负载均衡器 LB HTTP load balancer
http://nginx.org/en/docs/http/load_balancing.html
负载均衡策略 (方法、算法) - 调度方法
round-robin 轮询、轮叫、rr算法 #注:均衡访问,默认的调度算法
least-connected 最小连接数
ip-hash 让同一个ip地址的所有的请求都集中到一台服务器
#注:可以解决session的问题
以上是3种经典算法
Generic Hash #注:url hash
Least Time (NGINX Plus only)
Random
Server Weights
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
Generic Hash #注:根据url做哈希
Least Time (NGINX Plus only) #注:最低平均延迟 PLUS 付钱的插件
Random #注:随机
Server Weights #注:加权 常见加权轮询
#注:weight 权重 默认是1,越大权重越高
http://nginx.org/en/docs/http/load_balancing.html
实验:nginx - 负载均衡实验
准备环境:
网卡类型使用桥接
4台Linux服务器 1个核心1G
nginx - 负载均衡实验图 (数据流向图 + 物理连接图)
默认的调度算法 是rr 轮询调度
官网示例
http {
upstream myapp1 { #注:upstream上游,指后端 real server
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
示例:默认轮询
#示例:HTTP load balancer #注:默认算法 rr 轮询
[root@cPen-LB conf]# vim nginx.conf
http {
……
#定义上游服务器集群,定义一个负载均衡器
upstream myweb1 {
server 192.168.1.161;
server 192.168.1.162;
server 192.168.1.163;
}
server {
listen 80;
server_name www.sc.com; #注:基于域名的访问
location / {
proxy_pass http://myweb1;
}
}
……
}
#注:LB不需要真正的提供web服务(但要打开nginx)
#注:real server需要真正的提供web服务
-------------------------------------------------------------------------------
#注:效果
Chrome浏览器
192.168.1.160 --> 192.168.1.161 real server1
192.168.1.160 --> 192.168.1.162 real server2
192.168.1.160 --> 192.168.1.163 real server3
或
www.sc.com --> 192.168.1.161 real server1
www.sc.com --> 192.168.1.162 real server2
www.sc.com --> 192.168.1.163 real server3
示例:最小连接数 - ip_hash - 加权轮询
#示例:算法 最小连接数 least-connected
[root@cPen-LB conf]# vim nginx.conf
#定义上游服务器集群,定义一个负载均衡器
upstream myweb1 {
least_conn; #注:添加这个
server 192.168.1.161;
server 192.168.1.162;
server 192.168.1.163;
}
server {
listen 80;
server_name www.sc.com;
location / {
proxy_pass http://myweb1;
}
}
===============================================================================
#示例:算法 ip_hash
#注:Session persistence 会话持久性
#注:让同一个ip地址的所有的请求都集中到一台服务器
[root@cPen-LB conf]# vim nginx.conf
#定义上游服务器集群,定义一个负载均衡器
upstream myweb1 {
ip_hash; #注:添加这个
server 192.168.1.161;
server 192.168.1.162;
server 192.168.1.163;
}
server {
listen 80;
server_name www.sc.com;
location / {
proxy_pass http://myweb1;
}
}
===============================================================================
#示例:算法 加权负载均衡
#注:Weighted load balancing
#注:weight权重值 默认值是1
#注:weight值越大权重越高,得到的请求数就会越多
-----------------------------------------------------
#示例:加权轮询 (加权 + 轮询)
[root@cPen-LB conf]# vim nginx.conf
#定义上游服务器集群,定义一个负载均衡器
upstream myweb1 {
server 192.168.1.161 weight=1;
server 192.168.1.162 weight=3;
server 192.168.1.163 weight=6;
}
server {
listen 80;
server_name www.sc.com;
location / {
proxy_pass http://myweb1;
}
}
#注:轮询、ip_hash、最小连接数 应该都适合加权
#注:加权论询 考虑到服务端的性能差异性。加权论询效果最好
#注:weight值越大权重越高,得到的请求数就会越多
#注:数据传到real server1时,源ip变成了LB的ip
[root@cPen-web1 conf]# tail -f /usr/local/nginx1/logs/feng.com.access.log #注:web1 访问日志
192.168.1.160 - - [03/Feb/2021:15:21:14 +0800] "GET / HTTP/1.0" 200 626 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" "-" #注:为LB 的ip地址
后端的real server不知道前端真正访问的ip地址,只是知道负载均衡的ip地址,如何让后端的real server知道前端真正的用户的ip地址?
解决方法1:后端real server不使用realip模块
解决方法2:后端real server使用realip模块
#解决方法1:后端real server不使用realip模块
#步骤1.1:在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段
[root@cPen-LB conf]# vim nginx.conf
http {
……
upstream myweb1 {
server 192.168.1.161 weight=1;
server 192.168.1.162 weight=1;
server 192.168.1.163 weight=1;
}
server {
listen 80;
server_name www.sc.com;
location / {
proxy_pass http://myweb1;
proxy_set_header X-Real-IP $remote_addr;
}
}
……
}
#注:详解
将nginx内部的remote_addr这个变量的值,赋值给X-Real-IP这个变量,X-Real-IP这个变量会在http协议的请求报文里添加一个X-Real-IP的字段,后端的real server 服务器上的nginx就可以读取这个字段的值
X-Real-IP 这个变量名可以自己定义,随便取名,后面引用的时候,不区分大小写
proxy_set_header 指令的作用就是告诉nginx去修改http协议的头部信息,增加一个字段
--------------------------------------------------------------------------------------------
#步骤1.2:在后端real server上使用这个x_real_ip这个字段
#注:详解
在主配置文件nginx.conf里的日志部分调用这个变量,获取x_real_ip的值
$HTTP_X_REAL_IP
[root@cPen-web1 conf]# vim nginx.conf
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $HTTP_X_Real_IP - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
……
}
--------------------------------------------------------------------------------------------
#注:效果
Chrome浏览器
192.168.1.160 --> 192.168.1.161 real server1
[root@cPen-web1 conf]# tail -f /usr/local/nginx1/logs/feng.com.access.log #注:real server1 的访问日志
192.168.1.160 - 192.168.1.3 - - [04/Feb/2021:20:01:18 +0800] "GET / HTTP/1.0" 200 626 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" "-"
#注:获取到真实的用户IP 192.168.1.3
===========================================================================================
#解决方法2:后端real server使用realip模块
#步骤2.1:同上
在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段
[root@cPen-LB conf]# vim nginx.conf
http {
……
upstream myweb1 {
server 192.168.1.161 weight=1;
server 192.168.1.162 weight=1;
server 192.168.1.163 weight=1;
}
server {
listen 80;
server_name www.sc.com;
location / {
proxy_pass http://myweb1;
proxy_set_header X-Real-IP $remote_addr;
}
}
……
}
--------------------------------------------------------------------------------------------
#步骤2.2:在后端real server上使用set_real_ip_from 192.168.0.160
[root@cPen-web2 conf]# vim nginx.conf
server {
listen 80;
set_real_ip_from 192.168.1.160; #告诉本机的nginx 192.168.0.160 是负载均衡器,不是真正的client
……
#注:详解
set_real_ip_from 192.168.0.160; 告诉本机的nginx 192.168.0.160 是负载均衡器,不是真正的client
--------------------------------------------------------------------------------------------
#注:效果
Chrome浏览器
192.168.1.160 --> 192.168.1.161 real server1
[root@cPen-web2 conf]# tail -f /usr/local/nginx1/logs/feng.com.access.log #注:real server2 的访问日志
192.168.1.3 - - [04/Feb/2021:20:01:17 +0800] "GET / HTTP/1.0" 200 626 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" "-"
#注:获取到真实的用户IP 192.168.1.3
real-ip模块的使用
当本机的nginx处于一个反向代理的后端时获取到真实的用户IP
给后端的backend服务器使用的
根据不同的url做转发
基于url做转发,转到不同的服务器。成为 网关服务器、API服务器、中台系统 (API Gateway)
为什么实验 要用7层负载均衡,而不是四层负载均衡?
答:因为根据url做转发,需要读取http里的请求报文 request url,需要打开应用层,去获取http里面的信息,基于url做的转发。而四层负载均衡的配置 是关于端口号
#步骤1:负载均衡器的配置
[root@cPen-LB conf]# vim nginx.conf
server {
listen 80;
server_name www.cpen.top;
location /login {
proxy_pass http://192.168.1.161;
}
location /pic {
proxy_pass http://192.168.1.162;
}
location /music {
proxy_pass http://192.168.1.163;
}
location /download {
proxy_pass http://192.168.1.163;
}
}
#注:* 转发过去后,url是不会变的
例:www.cpen.top/login --> 192.168.1.161/login
--------------------------------------------------------------------------------------------------------------------
#注:添加路由转发的策略
需要去新建login、pic、music、download目录,里面还需要存放主页或者其他的内容,确保能正常访问
#注:后端的real server需要增加真正能访问的目录,并且有主页index.html
#注:download不需要有主页,因为real server3有url的转发
#步骤2:后端real server上需要能访问
需要去新建login、pic、music、download目录,里面还需要存放主页或者其他的内容,确保能正常访问
例2.1:real server1 --> login
[root@cPen-web1 login]# pwd
/usr/local/nginx1/html/feng.com/login
[root@cPen-web1 login]# cat index.html
161 login
例2.2:real server3 --> download功能
[root@cPen-web3 conf]# vim nginx.conf
location / {
autoindex on;
root html/feng.com;
index index.html index.htm;
}
--------------------------------------------------------------------------------------------------------------------
#注:效果
www.cpen.top/login --> 161 login (192.168.1.161/login index.html)
www.cpen.top/download/ --> 下载页面 (192.168.1.163/download/)
如果有多个download 怎么解决?
本质上就是实现了基于某个url做负载均衡
#步骤:修改配置文件
[root@cPen-LB conf]# vim nginx.conf
upstream mydownload { #定义 负载均衡器
server 192.168.1.161 weight=1;
server 192.168.1.162 weight=1;
server 192.168.1.163 weight=1;
}
server {
listen 80;
server_name www.cpen.top;
location /login {
proxy_pass http://192.168.1.161;
}
location /pic {
proxy_pass http://192.168.1.162;
}
location /music {
proxy_pass http://192.168.1.163;
}
location /download { #使用/转到 负载均衡器
proxy_pass http://mydownload;
}
}
----------------------------------------------------------------------
#注:效果 轮询
www.cpen.top/download/ --> 下载页面 (192.168.1.161/download/)
www.cpen.top/download/ --> 下载页面 (192.168.1.162/download/)
www.cpen.top/download/ --> 下载页面 (192.168.1.163/download/)
TCP and UDP Load Balancing
https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/
full nat
4层负载均衡 动了ip地址
数据转发这块是full nat
不但修改了源ip和目的ip,还修改了源端口和目的端口
#注:示例
[root@cPen-LB conf]# vim nginx.conf
#4层的负载均衡
stream {
#负载均衡器的定义web
upstream scweb {
least_conn; #注:算法 最小连接数
server 192.168.1.161:80;
server 192.168.1.162:8080;
server 192.168.1.163:80;
}
#负载均衡器的定义dns
upstream dns_servers {
hash $remote_addr consistent; #注:算法 hash
server 192.168.1.130:53;
server 192.168.1.131:53;
}
server {
listen 80;
proxy_pass scweb;
}
server {
listen 53;
proxy_pass dns_servers;
}
}
高可用:HA 高可用性 (HighAvailability)
问题1. 如何理解高可用HA?
答:防止单点故障
有备份
软件 keepalived
官网 https://www.keepalived.org/
问题2. 什么是keepalived?
Keepalived是用C语言编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础结构提供负载均衡和高可用性的简单而强大的功能。
keepalived实现负载均衡的功能是依靠lvs这个软件来实现的
负载平衡框架依赖于提供第4层负载平衡的著名且广泛使用的Linux虚拟服务器(IPVS)内核模块。
负载均衡和高可用性是2个概念
负载均衡:将很多的请求分散到后端很多的服务器上 --> 化解压力的一个软件
高可用:有2个或者多个服务器做相同的事情,互相备份
vrrp协议
虚拟路由器冗余协议(vrrp)
vrrp协议 参考文档
https://blog.csdn.net/zhongzh86/article/details/81537644
https://blog.csdn.net/u010391029/article/details/48311699
https://blog.51cto.com/billy98/2064252
VRRP通告(advertisement)。它使用IP多播数据包进行封装,组地址为224.0.0.18,发布范围只限于同一局域网内
HA的步骤:
1.安装keepalived,在2台LB上都要安装
2.调试
3.验证
#步骤1:安装keepalived,在2台LB上都要安装
[root@cPen-LB-1 ~]# cat /etc/centos-release
CentOS Linux release 8.2.2004 (Core)
[root@cPen-LB-1 ~]# yum install keepalived -y
[root@cPen-LB-2 ~]# yum install keepalived -y
---------------------------------------------------------------------------------------------------------------------------------
#步骤2:修改配置文件,添加vip等相关的配置
[root@cPen-LB-1 ~]# cd /etc/keepalived/
[root@cPen-LB-1 keepalived]# ls
keepalived.conf
------------------------------------------------------------------------------
#注:master上的配置
#注:删除一些不相关的配置(和lvs有关的,在下面)
#注:注释掉vrrp_strict 严格的vrrp协议 注释掉
[root@cPen-LB-1 keepalived]# vim keepalived.conf
vrrp_instance VI_1 { #注:vrrp实例名字VI_1 --> 相当于启动一个vrrp进程去工作
state MASTER #注:指定服务器充当的角色为MASTER
interface ens33 #注:在ens33接口上监听vrrp报文
virtual_router_id 99 #注:虚拟路由组的id 为99 此值有个范围 0~255
priority 110 #注:优先级
advert_int 1 #注:发宣告报文的间隔时间为1秒
authentication { #注:认证
auth_type PASS #注:密码认证 password
auth_pass 123456 #注:密码为123456
}
virtual_ipaddress { #注:定义vip 可以多个,这次文件只用1个 单vip
192.168.1.180
}
}
#注:virtual_router_id 虚拟路由id一定要一样,否则会出现脑裂现象
------------------------------------------------------------------------------
#注:backup服务器上的配置
[root@cPen-LB-2 conf]# cd /etc/keepalived/
[root@cPen-LB-2 keepalived]# scp 192.168.1.160:/etc/keepalived/keepalived.conf .
[root@cPen-LB-2 keepalived]# vim keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 99 #注:虚拟路由组id合master一致
priority 100 #注:优先级比master低
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.180
}
}
---------------------------------------------------------------------------------------------------------------------------------
#步骤3:启动keepalived服务
[root@cPen-LB-1 keepalived]# service keepalived start #注:master上启动
[root@cPen-LB-1 keepalived]# ps aux|grep keepalived
root 2007 0.0 0.0 106212 996 ? Ss 15:16 0:00 /usr/sbin/keepalived -D
root 2008 5.0 0.0 106212 1000 ? S 15:16 0:00 /usr/sbin/keepalived -D
root 2010 0.0 0.0 12324 1080 pts/0 S+ 15:16 0:00 grep --color=auto keepalived
[root@cPen-LB-2 keepalived]# service keepalived start #注:backup上也要启动
#注:keepalived 有进程,没有端口
---------------------------------------------------------------------------------------------------------------------------------
#注:注意两边都要关闭防火墙:防火墙会阻止2台机器之间交流选举vrrp报文
[root@cPen-LB-1 keepalived]# service firewalld stop
[root@cPen-LB-1 keepalived]# systemctl disable firewalld
[root@cPen-LB-2 keepalived]# service firewalld stop
[root@cPen-LB-2 keepalived]# systemctl disable firewalld
---------------------------------------------------------------------------------------------------------------------------------
#效果:vip出现在LB-1上
[root@cPen-LB-1 keepalived]# ip add
……
inet 192.168.1.160/24 brd 192.168.1.255 scope global noprefixroute ens33
inet 192.168.1.180/32 scope global ens33
……
现象1:vip漂移
1.在master上停止keepalived服务
[root@cPen-LB-1 keepalived]# service keepalived stop #注:master上 停止服务
-----------------------------------------------------
2.backup上就会立马配上vip
[root@cPen-LB-2 keepalived]# ip add
……
inet 192.168.1.164/24 brd 192.168.1.255 scope global noprefixroute ens33
inet 192.168.1.180/32 scope global ens33 #注:vip漂移现象
……
C:\Users\15334>arp -a #注:win 查看arp缓存表
192.168.1.160 00-0c-29-ab-9e-eb 动态
192.168.1.164 00-0c-29-86-f7-6c 动态
192.168.1.180 00-0c-29-86-f7-6c 动态 #注:LB-2的mac地址
-----------------------------------------------------
3.在master上启动keepalived服务,vip会再次漂移回来
[root@cPen-LB-1 keepalived]# service keepalived start
[root@cPen-LB-1 keepalived]# ip add
……
inet 192.168.1.160/24 brd 192.168.1.255 scope global noprefixroute ens33
inet 192.168.1.180/32 scope global ens33
……
C:\Users\15334>arp -a #注:win 查看arp缓存表
192.168.1.160 00-0c-29-ab-9e-eb 动态
192.168.1.164 00-0c-29-86-f7-6c 动态
192.168.1.180 00-0c-29-ab-9e-eb 动态 #注:LB-1的mac地址
现象2:脑裂
脑裂:就是2台或者多台LB上都有vip地址
原因:
1.防火墙阻止了keepalived的vrrp消息的通告
2.virtual_router_id 不一样的时候
脑裂现象是否有危害?如果有,你觉得有什么危害?
答:没有危害。都能访问,但这样master和backup就没有意义了,对于运维人员,不能决定外面的客户机选择哪个负载均衡器去访问
如果只是单vip,master会工作,backup服务器会闲置,如何让backup不闲置,你也什么方法?
方法1:故意制造脑裂
方法2:dns域名解析 + 使用双vip
如何实现双vip的效果?
dns域名集群解析记录 + 双vip实现,master和backup都不闲置
www 192.168.0.181
www 192.168.0.180
如何实现双vip的效果?
dns域名集群解析记录+双vip实现,master和backup都不闲置
#步骤:dns域名集群解析记录
#注:dns集群域名解析记录,dns域名负载均衡,dns域名解析,使用论询调度算法 dns域名方面的负载均衡
www.cpen.top 192.168.0.181
www.cpen.top 192.168.0.180
-------------------------------------------------------------------------------------------
同一个域名对应2或者多条A记录
ip地址不同名字相同
使用dns域名解析实现第1层负载均衡 默认的调度算法是轮询 round-robin
#注:去阿里云域名控制台添加域名解析 A记录
-------------------------------------------------------------------------------------------
[root@cPen-LB-2 keepalived]# yum install bind-utils -y
[root@cPen-LB-2 keepalived]# nslookup www.cpen.top
Name: www.cpen.top
Address: 47.110.144.55
Name: www.cpen.top
Address: 47.110.144.66
#步骤:双vip的配置文件
#注:第1台服务器上的配置
[root@cPen-LB-1 keepalived]# vim keepalived.conf
……
#vrrp_strict
……
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 199
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.180
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 200
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.181
}
}
------------------------------------------------
#注:第2台服务器上的配置
[root@cPen-LB-2 keepalived]# vim keepalived.conf
……
#vrrp_strict
……
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 199
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.180
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 200
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.181
}
}
============================================================================================
#步骤:重启keepalived服务
[root@cPen-LB-1 keepalived]# service keepalived restart
[root@cPen-LB-2 keepalived]# service keepalived restart
============================================================================================
#注:效果
#注:第1台上的效果
[root@cPen-LB-1 keepalived]# ip add
inet 192.168.1.160/24 brd 192.168.1.255 scope global noprefixroute ens33
inet 192.168.1.180/32 scope global ens33
--------------------------------------------
#注:第2台上的效果
[root@cPen-LB-2 keepalived]# ip add
inet 192.168.1.164/24 brd 192.168.1.255 scope global noprefixroute ens33
inet 192.168.1.181/32 scope global ens33
一个nginx进程可以同时开启很多虚拟主机
一个server其实就是虚拟主机 --> 对应一个网站
步骤:
1.修改配置文件
2.去新建我们的存放网页的目录,以及我们的首页,其他的网页
3.重启nginx
4.需要修改客户机的hosts文件,linux和windows系统都需要修改
[root@cPen_nginx ~]# vim /usr/local/nginx1/conf/nginx.conf
……
server {
listen 80;
server_name www.feng.com; #注:域名
#charset koi8-r;
access_log logs/feng.com.access.log main; #注:打开访问日志,格式是main;指定文件
location / {
root html/feng.com; #注:存放网页的根目录
index index.html index.htm; #注:指定首页
}
error_page 404 /404.html; #注:错误页面 返回404错误页面
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #注:nginx服务错误 访问根目录下…
location = /50x.html {
root html/feng.com;
}
#步骤:测试nginx.conf内容是否有错误
[root@cPen_nginx conf]# nginx -t #注:测试nginx.conf配置文件内容是否有错误
nginx: [emerg] unknown log format "main" in /usr/local/nginx1/conf/nginx.conf:39 #注:出错
nginx: configuration file /usr/local/nginx1/conf/nginx.conf test failed
[root@cPen_nginx ~]# vim /usr/local/nginx1/conf/nginx.conf
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"';
[root@cPen_nginx conf]# nginx -t #注:测试nginx.conf配置文件是否有错误
nginx: the configuration file /usr/local/nginx1/conf/nginx.conf syntax is ok #注:成功
nginx: configuration file /usr/local/nginx1/conf/nginx.conf test is successful
#步骤:重启nginx
[root@cPen_nginx conf]# nginx -s reload
步骤4:修改客户机hosts文件
需要修改客户机的hosts文件,Linux和windows系统都需要修改
Linux
[root@cPen_nginx ~]# vim /etc/hosts
192.168.1.11 www.feng.com
Windows
C:\Windows\System32\drivers\etc\hosts
192.168.1.11 www.feng.com
效果:访问www.feng.com 测试是否成功
# Linux客户机 访问
[root@cPen_nginx ~]# curl www.feng.com
Welcome to feng.com!
[root@cPen_nginx ~]# curl www.feng.com/404.html
404 error sanchaung
# Windows客户机 访问
http://www.feng.com/
http://www.feng.com/404.html
#步骤:修改配置文件
[root@cPen_nginx conf]# vim nginx.conf
……
server {
listen 80;
server_name www.a.com;
access_log logs/a.com.access.log main;
location / {
root html/a.com;
index index.html index.htm;
autoindex on;
deny 192.168.1.12;
}
-------------------------------------------
#效果:192.168.1.12 Linux客户机
[root@web-client ~]# curl www.a.com
<head><title>403 Forbidden</title></head>
[root@cPen_nginx conf]# ulimit -a #注:查看Linux内核的限制
……
open files (-n) 1024
#注:Linux kernel 对一个进程最多能打开多少文件数量的限制 --> 1个进程最多可以打开1024个文件
[root@cPen_nginx conf]# ulimit -n
1024
#注:默认情况下Linux内核允许一个进程打开的文件描述符是1024 默认的范围0~1023
临时修改
#示例:临时修改Linux内核 允许一个进程打开的文件数量 (文件描述符)
[root@cPen_nginx conf]# ulimit -n 1000000 #注:为了不影响nginx的并发数
永久修改
#示例:永久修改文件描述符的限制
如何永久有效?
-----------------------------------------------------------
#方法1:写进/etc/rc.local文件里
[root@cPen_nginx conf]# vim /etc/rc.local
ulimit -n 1000000
[root@cPen_nginx conf]# chmod +x /etc/rc.d/rc.local
-----------------------------------------------------------
#方法2:/etc/security/limits.conf文件
[root@cPen_nginx conf]# vim /etc/security/limits.conf #注:永久修改文件描述符的限制
# - nofile - max number of open file descriptors
* soft nofile 1000000 #注:软限制
* hard nofile 1000000 #注:硬限制
#注:设置完后 需要重启系统