yum -y install gcc pcre-devel zlib zlib-devel
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bfXR0Lhy-1675915308584)(Nginx-web服务器和反向代理学习.assets/image-20221112175451765.png)]
elinks http://192.168.204.3 --dump
[root@xiongbinbin /]# cat /etc/nginx/nginx.conf
# 启动子进程程序默认用户
user nginx;
# 一个主进程和多个工作进程。工作进程是单进程的,且不需要特殊授权即可运行;这里定义的是工作进程的数量,默认是一个工作进程(子进程);
worker_processes auto;
# 全局错误日志的位置及日志格式
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
# 每个工作进程最大的并发数,即线程数
worker_connections 1024;
}
# http服务器设置
http {
# 设定mime类型,类型有mime.type文件定义
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式:log_format 格式名字:main 日志的内容包含什么。。。
log_format main '$remote_addr - $remote_user [$time_local] "$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 记录客户端浏览器的相关信息,例如:浏览器,手机客户端等;
# 全局访问日志的路径,采用的格式是上面定义的main日志格式
access_log /var/log/nginx/access.log main;
#sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on
#sendfile = off 时,应用程序读取磁盘中的文件以字节流的形式从磁盘中加载文件,然后再将文件以字节流的形式复制到内核中。内核在把文件推送到NC。
#sendfile = on 时,应用程序直接向内核发送指令,让内核去读文件。读完文件内核直接推送给NC。只有一次复制操作,实现异步网络IO形式。因此,性能会有很大的提升。
sendfile on;
# 此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
#tcp_nopush on;
# 长连接超时时间
keepalive_timeout 65;
# 开启压缩
#gzip on;
#这里指定的配置是server的配置,表示虚拟主机的配置
include /etc/nginx/conf.d/*.conf;
}
============
server {
# 虚拟主机使用的端口
listen 80;
# 虚拟主机域名
server_name localhost;
# 虚拟主机的访问日志路径
#access_log /var/log/nginx/host.access.log main;
# 虚拟主机支撑的字符集
charset koi8-r;
# 定义web根路径
location / {
# 根目录路径
root /usr/share/nginx/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 /usr/share/nginx/html;
}
# 定义反向代理服务器 数据服务器是lamp模型
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# 定义PHP为本机服务的模型
# 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
#
# 拒绝apache DR目录及子目录下的.htaccess文件访问
#location ~ /\.ht {
# deny all;
#}
}
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
# Nginx的默认网站设置
location / {
# root目录设置
root /usr/share/nginx/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 /usr/share/nginx/html;
}
}
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
#
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# 访问控制 只允许本机访问 a 目录 其他机器拒绝访问
location /a {
root /usr/share/nginx/html;
index index.html index.htm;
# allow deny 设置允许和拒绝访问的限制
# 这里设置为允许本机127.0.0.1访问,拒绝其他主机访问
allow 127.0.0.1;
deny all;
# return 可以控制返回给客户端的信息,可以返回错误码等;
# 还可以返回图片(链接形式)或指定链接
# return 404;
# return 502;
# return www.baidu.com
}
#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 /usr/share/nginx/html;
}
}
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
# Nginx的默认网站设置
location / {
# root目录设置
root /usr/share/nginx/html;
# 静态资源文件
index index.html index.htm;
}
# 目录验证:任何人都可以访问,但是需凭用户密码才能访问
location /b {
# root目录设置
root /usr/share/nginx/html;
# 静态资源文件
index index.html index.htm;
auth_basic "test登录验证 123456";
auth_basic_user_file /etc/nginx/htpasswd;
}
#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 /usr/share/nginx/html;
}
}
Nginx访问日志主要有两个参数控制
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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"';
log_format test_01 '$time_local - $remote_addr "$request" $status';
log_format main_json '{"@timestamp":"$time_local",'
'"client_ip":"$remote_addr",'
'"request":"$request",'
'"status":"$status",'
'"bytes":"$body_bytes_sent",'
'"x_forwarded":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'}';
access_log /var/log/nginx/access.log main_json;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
test_01格式:
13/Nov/2022:14:17:06 +0800 - 192.168.204.1 "GET /b/ HTTP/1.1" 304
13/Nov/2022:14:17:08 +0800 - 192.168.204.1 "GET /b/ HTTP/1.1" 304
13/Nov/2022:14:17:08 +0800 - 192.168.204.1 "GET /b/ HTTP/1.1" 304
13/Nov/2022:14:17:08 +0800 - 192.168.204.1 "GET /b/ HTTP/1.1" 304
13/Nov/2022:14:17:08 +0800 - 192.168.204.1 "GET /b/ HTTP/1.1" 304
main_json格式:
{"@timestamp":"13/Nov/2022:14:18:29 +0800","client_ip":"192.168.204.1","request":"GET /b/ HTTP/1.1","status":"304","bytes":"0","x_forwarded":"-","referer":"-",}
{"@timestamp":"13/Nov/2022:14:18:30 +0800","client_ip":"192.168.204.1","request":"GET /b/ HTTP/1.1","status":"304","bytes":"0","x_forwarded":"-","referer":"-",}
{"@timestamp":"13/Nov/2022:14:18:30 +0800","client_ip":"192.168.204.1","request":"GET /b/ HTTP/1.1","status":"304","bytes":"0","x_forwarded":"-","referer":"-",}
Nginx防盗链的具体实现:
参数说明:
none: 如果请求Header中的Referer为空,说明没有盗链,允许访问
blocked:在Header中的Referer不为空,但是该值被防火墙或代理进行伪装过,如不带"http://" 、"https://"等协议头的资源允许访问。
server_names:指定具体的域名或者IP
string: 可以支持正则表达式和*的字符串。如果是正则表达式,需要以~开头表示,例:
location ~*\.(png|jpg|gif){
valid_referers none blocked www.baidu.com 192.168.200.222 *.example.com example.* www.example.org ~\.google\.;
if ($invalid_referer){
return 403;
}
root /usr/local/nginx/html;
}
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
# Nginx的默认网站设置
location / {
# root目录设置
root /usr/share/nginx/html;
# 静态资源文件
index index.html index.htm;
}
location /c {
# root目录设置
root /usr/share/nginx/html;
# 静态资源文件
index index.html index.htm;
#
valid_referers none blocked *.ayitula.com;
if ($invalid_referer) {
return 403;
}
}
#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 /usr/share/nginx/html;
}
}
同时发布两个网站:
- DocumentRoot /usr/share/nginx/html/web1
- DocumentRoot /usr/share/nginx/html/web2
步骤1:创建虚拟主机
ifconfig ens33:1 192.168.204.4/24 up
步骤2:创建对应静态资源文件
/usr/share/nginx/html/web1
/usr/share/nginx/html/web2
echo web01 > /usr/share/nginx/html/web1/index.html
echo web02 > /usr/share/nginx/html/web2/index.html
步骤3:修改配置文件
server {
listen 192.168.204.3:80;
location / {
root /usr/share/nginx/html/web1/;
index index.html index.htm;
}
}
server {
listen 192.168.204.4:80;
location / {
root /usr/share/nginx/html/web2;
index index.html index.htm;
}
}
步骤4:重启Nginx,并查看启动成功
[root@xiongbinbin conf.d]# netstat -ntpl |grep 80
tcp 0 0 192.168.204.4:80 0.0.0.0:* LISTEN 5640/nginx: master
tcp 0 0 192.168.204.3:80 0.0.0.0:* LISTEN 5640/nginx: master
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 1805/sshd: root@pts
tcp6 0 0 ::1:6010 :::* LISTEN 1805/sshd: root@pts
步骤5: 验证
[root@xiongbinbin conf.d]# elinks http://192.168.204.3 --dump
web01
[root@xiongbinbin conf.d]# elinks http://192.168.204.4 --dump
web02
先停掉上面步骤启动的网卡ens33:1 ifconfig ens33:1 down
步骤1: 修改配置文件
server {
listen 80;
location / {
root /usr/share/nginx/html/web1/;
index index.html index.htm;
}
}
server {
listen 8080;
location / {
root /usr/share/nginx/html/web2;
index index.html index.htm;
}
}
步骤2: 重启Nginx,检查启动结果
lsof -i:80
lsof -i:8080
步骤3:访问验证
[root@xiongbinbin html]# elinks http://192.168.204.3 --dump
web01
[root@xiongbinbin html]#
[root@xiongbinbin html]#
[root@xiongbinbin html]# elinks http://192.168.204.3:8080 --dump
web02
[root@xiongbinbin html]#
配置文件中添加域名映射:server_name 域名;
可以解决1、2中的缺点,满足公网用户需求
前提是主机要配置域名解析
前提:要配置域名解析
vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.204.3 xiongbinbin
192.168.204.3 www.web1.com
192.168.204.3 www.web2.com
步骤1: 修改配置文件
server {
listen 80;
server_name www.web1.com;
charset utf-8;
location / {
root /usr/share/nginx/html/web1;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.web2.com;
charset utf-8;
location / {
root /usr/share/nginx/html/web2;
index index.html index.htm;
}
}
步骤2: 重启Nginx,检查启动结果
lsof -i:80
步骤3:访问验证
[root@xiongbinbin html]# elinks http://www.web1.com --dump
web01
[root@xiongbinbin html]#
[root@xiongbinbin html]#
[root@xiongbinbin html]# elinks http://www.web2.com --dump
web02
[root@xiongbinbin html]#
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OtPH02id-1675915308585)(Nginx-web服务器和反向代理学习.assets/image-20221113163256154.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oPnHB45t-1675915308585)(Nginx-web服务器和反向代理学习.assets/image-20221113163500687.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHVk24Ux-1675915308586)(Nginx-web服务器和反向代理学习.assets/image-20221113163843780.png)]
proxy_pass: nginx反向代理指令
反向代理实现
location / {
index index.html index.htm; #定义首页索引文件的名称
proxy_pass http://mysvr;#请求转向mysvr 定义的服务器列表
server {
listen 80;
server_name www.web1.com;
charset utf-8;
location / {
index index.html index.htm;
proxy_pass http://mysvr;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
proxy_set_header Host $host; #修改请求头,添加Host字段
proxy_set_header X-Real-IP $remote_addr;#修改请求头,添加X-Real-IP字段
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#修改请求头,添加X-Forwarded-For字段
client_max_body_size 10m;#允许客户端请求的最大单文件字节数
client_body_buffer_size 128k;#缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90;#后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90;#连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k;#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k;#proxy_buffers缓冲区,网页平均在32k以下的话,这样设置proxy_busy_buffers_size 64k;#高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;#设定缓存文件夹大小,大于这个值,将从upstream服务器传
限速该特性可以限制某个用户在一个给定时间段内能够产生的HTTP请求数。请求可以简单到就是一个对于主页的GET请求或者一个登录表格的POST请求。
限速也可以用于安全目的上,比如暴力密码破解攻击,通过限制进来的请求速率,并且(结合日志)标记除目标URLS来帮助防范DDOS攻击。一般地说,限流是用在保护上游应用服务器不被在同一时刻的大量用户请求湮没。
限速案例一:
基于IP对现在速率做限制 限制每秒处理一次请求,对突发超过5个以后的请求放入缓存区。
http {
limit_req_zone $binary_remort_addr zone=test123:10m rate=1r/s;
server {
location /search/ {
limit_req zone=test123 burst=5 nodelay;
}
}
}
limit_req_zone $binary_remort_addr zone=test123:10m rate=1r/s;
第一个参数: $binary_remort_addr 表示通过remote_addr这个标识来做限制,"binary_"的目的是缩写内存占用量,是限制同一客户端ip地址。
第二个参数: zone-test123:10m 表示生成一个大小为10M,名字为test123的内存区域,用来存储访问频次信息。
第三个参数: rate=1r/s 表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,即每秒只处理一个请求,还可以有比如30r/m的,即限制每2秒访问一次,即每2秒才处理一个请求。
limit_req zone=test123 burst=5 nodelay;
zone=test123 :设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。
burst=5 : 重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有5个,超过的请求会直接报503的错误然后返回。
nodelay:如果设置,会在瞬时提供处理(burst + rate)个请求的能力,请求超过(burst + rate)的时候就会直接返回503,永远不存在请求需要等待的情况。(这里的rate的单位是:r/s)如果没有设置,则所有请求会依次等待排队。
limit_req_zone $binary_remote_addr zone=test123:10m rate=1r/s;
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /search {
root /usr/share/nginx/html;
index index.html index.htm;
limit_req zone=test123 burst=5 nodelay;
}
[root@xiongbinbin conf.d]# elinks http://192.168.204.3/search --dump
限速测试
[root@xiongbinbin conf.d]#
[root@xiongbinbin conf.d]#
[root@xiongbinbin conf.d]# elinks http://192.168.204.3/search --dump
限速测试
[root@xiongbinbin conf.d]# elinks http://192.168.204.3/search --dump
限速测试
[root@xiongbinbin conf.d]#
[root@xiongbinbin conf.d]# elinks http://192.168.204.3/search --dump
限速测试
[root@xiongbinbin conf.d]#
[root@xiongbinbin conf.d]# elinks http://192.168.204.3/search --dump
An error occurred.
Sorry, the page you are looking for is currently unavailable.
Please try again later.
If you are the system administrator of this resource then you should check
the error log for details.
Faithfully yours, nginx.
[root@xiongbinbin conf.d]#
限速案例二:
基于IP做连接限制 限制同一IP并发为1 下载速度为100k
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /load {
root /usr/share/nginx/html;
index index.html index.htm;
limit_conn addr 1; # 限制同一个ip连接数
limit_rate 100k; # 限制下载速度
}
rewrite模块 (nginx_http_rewrite_module)
Rewrite功能是Nginx服务器提供的一个重要功能。几乎是所有的web产品必备技能,用于实现URL重写。URL重写是非常有用的功能,比如它可以在我们改变网站结构后,不需要客户端修改原来的书签,也不需要其他网站修改我们网站的友情链接,还可以在一定程度上提高网站的安全性,能够让我们的网站显得更专业。
Nginx服务器Rewrite功能的实现是依赖于PCRE(Perl Compatible Regular Expression. Perl兼容的正则表达式)的支持,所以在编译安装Nginx之前,需要安装PCRE库。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NUThPLHb-1675915308586)(Nginx-web服务器和反向代理学习.assets/image-20221114103203648.png)]
1)set 设置变量
2)if 负责语句中的判断
3)return 返回返回值或URL
4)break 终止后续的rewrite规则
5)rewrite 重定向URL
set指令 自定义变量
Syntax:
set $variable value;
Default:
_
Context(作用域): server,location,if
# 将http://www.ayitula.com 重写为 http://www.ayitula.com/baism
location / {
set $name test123;
rewrite ^(.*)$ http://www.baidu.com/$name;
}
1、set 指令重写
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
location / {
#root /usr/share/nginx/html;
#index index.html index.htm;
# set 指令重写
set $name test123;
rewrite ^(.*)$ http://www.baidu.com/$name;
}
}
[root@xiongbinbin ~]# elinks http://192.168.204.3 --dump
Not Found
The requested URL /test123 was not found on this server.
[root@xiongbinbin ~]#
if 指令 负责判断
模糊匹配 :
~ : 匹配
!~ : 不匹配
~* : 不区分大小写的匹配
精确匹配 :
= 、~=
Syntax:
if(condition){...}
Default:
_
Context: server,location
location / {
root html;
index index.html index.htm;
if ($http_user_agent ~* 'chrome') {
break;
# return 403;
# return http://www.baidu.com;
}
}
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
#set $name test123;
#rewrite ^(.*)$ http://www.baidu.com/$name;
if ($http_user_agent ~* 'chrome') {
return 403;
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8rj5PdOJ-1675915308586)(Nginx-web服务器和反向代理学习.assets/image-20221114111648828.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mup874Ws-1675915308586)(Nginx-web服务器和反向代理学习.assets/image-20221114111753807.png)]
return:code/text/url
作用域:server、location、if
Syntax: return code/text;
return code URL;
return URL;
Default: -
Context: server,location,if
location / {
root html;
index index.html index.htm;
if ($http_user_agent ~* 'chrome') {
# return 403;
return http://www.baidu.com
}
}
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
#set $name test123;
#rewrite ^(.*)$ http://www.baidu.com/$name;
if ($http_user_agent ~* 'chrome') {
#break;
#return 403;
return http://www.baidu.com;
}
}
}
Syntax: break;
Default: -
Context: server,location,if
location / {
root html;
index index.html index.htm;
if ($http_user_agent ~* 'chrome') {
break;
return http://www.baidu.com
}
}
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
#set $name test123;
#rewrite ^(.*)$ http://www.baidu.com/$name;
if ($http_user_agent ~* 'chrome') {
break;
return http://www.baidu.com;
}
}
}
rewrite [flag];
关键字 正则 替代内容 flag标记
flag:
redirect # 返回302临时重定向,浏览器地址会显示跳转后的URL地址;
permanent # 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址;
last # 本条规则匹配完成后,继续向下匹配新的location URL规则
break # 本条规则匹配完成即终止,不再匹配后面的任何规则,类似redirect,客户端状态码返回302;
域名跳转
www.baidu.com 重写为 www.jd.com
server {
listen 80;
server_name www.baidu.com;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
location / {
rewrite ^(.*)$ http://www.jd.com permanent;
}
}
注意:
重定向就是将网页自动转向重定向
301永久性重定向 : 新网址完全继承旧网址,旧网址的排名等完全清零
301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转让。
302临时性重定向 : 对旧网址没有影响,但新网址不会有排名
搜索引擎会抓取新的内容而保留旧的网址。
server {
listen 80;
server_name www.web1.com;
charset utf-8;
location / {
root /usr/share/nginx/html/web1;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.web2.com;
charset utf-8;
location / {
rewrite ^/$ http://www.web1.com permanent;
}
}
[root@xiongbinbin conf.d]# elinks http://www.web2.com --dump
web01
[root@xiongbinbin conf.d]#
server {
listen 80;
server_name www.web2.com;
charset utf-8;
location / {
#rewrite ^/$ http://www.baidu.com redirect;
#rewrite ^/$ http://www.baidu.com permanent;
#rewrite ^/$ http://www.baidu.com break;
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pv9zlIso-1675915308586)(Nginx-web服务器和反向代理学习.assets/image-20221114122419561.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7SeNFeuF-1675915308587)(Nginx-web服务器和反向代理学习.assets/image-20221114124132330.png)]
根据用户浏览器重写访问目录
location / {
....
if ($http_user_agent ~* 'chrome') {
rewrite ^(.*)$ /chrome/$1 last;
}
location /chrome {
root html;
index index.html;
}
}
当使用谷歌浏览器访问URL : /rewrite 时,重写到/chrome/rewrite
准备静态资源
[root@xiongbinbin conf.d]# cat /usr/share/nginx/html/chrome/rewrite/index.html
rewrite test
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
#rewrite ^/$ http://www.baidu.com redirect;
#rewrite ^/$ http://www.baidu.com break;
if ($http_user_agent ~* 'chrome') {
rewrite ^(.*)$ /chrome/$1 last;
}
location /chrome {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
==============
谷歌浏览器访问http://192.168.204.3/rewrite/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bkzDu7Ab-1675915308587)(Nginx-web服务器和反向代理学习.assets/image-20221114142750103.png)]
worker_processes 1; 工作进程数量 按CPU的总核数调整
worker_cpu_affinity 0001 0010 0100 1000; CPU的亲和力
worker_connections 1024; 一个工作进程的并发数
1.查询主机的cpu核数,根据主机cpu情况进行设置工作进程数量
2.根据1调整CPU的亲和力,使每个核上都有进程
3.设置一个工作进程的并发数
# 查看CPU核数:cat /proc/cpuinfo |grep 'flags'|wc -l
# 修改配置
user nginx;
worker_processes 4; #工作进程数量
worker_cpu_affinity 0001 0010 0100 1000; # CPU的亲和力
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 10240; # 一个工作进程的并发数
}
# 重启后检查每个核上是否都能挂上进程
ps -eo psr,pid,args |grep 'nginx'
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q1Hpeubw-1675915308587)(Nginx-web服务器和反向代理学习.assets/image-20221114152000584.png)]
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 65;
keepalive_timeout 0; # 此例表示将长连接关闭,服务器返回数据后即关闭连接
#keepalive_requests 8192;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f2B920nU-1675915308587)(Nginx-web服务器和反向代理学习.assets/image-20221114154545179.png)]
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 65;
keepalive_timeout 5; # 此例表示将长连接保持5秒
keepalive_requests 8192; # 同一个长连接最多接受请求数
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1bu8Sx2-1675915308587)(Nginx-web服务器和反向代理学习.assets/image-20221114154736296.png)]
相关配置参数:
gzip on;
gzip_proxied any;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 6;
gzip_types text/plain text/css application/x-javascript application/javascript application/xml;
配置参数说明:
gzip off; off/开启 on/关闭
gzip_proxied any; Nginx做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩
gzip_min_length 1k; 启用gzip压缩的最小文件,小于设置值的文件将不压缩
gzip_comp_level 6; gzip压缩级别 1-9, 数字越大压缩的越好,也越占用CPU时间
gzip_types text/plain text/css application/x-javascript application/javascript application/xml; 进行压缩的文件类型。类型可以在mime.types文件中找到
gzip_vary on; 是否在http header中添加Vary:Accept-Encoding,建议开启
gzip_disable "MSIE[1-6]\"; 禁用IE 1-6 gzip
gzip_buffers 32 4k; 设置压缩所需要的缓冲区大小
gzip_http_verdion 1.0; 设置gzip压缩针对的HTTP协议的版本
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 65;
keepalive_timeout 5;
keepalive_requests 8192;
gzip on;
gzip_proxied any;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 6;
gzip_types text/plain text/css application/x-javascript application/javascript application/xml;
include /etc/nginx/conf.d/*.conf;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1xQ02QN-1675915308587)(Nginx-web服务器和反向代理学习.assets/image-20221114161747270.png)]
server {
listen 80;
server_name localhost;
charset utf-8;
location ~* \.(png|gif)$ {
root /usr/share/nginx/html;
index index.html index.htm;
expires 1h; # 这里设置缓存过期时间是1小时
}
}
# 从图中可以看出1.png图片具有缓存时间1h,第一次是从服务器获取数据(状态码200),第二次请求是从缓存获取数据(状态码304)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WhX1Jwfm-1675915308588)(Nginx-web服务器和反向代理学习.assets/image-20221114163646287.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kkYmQVhO-1675915308588)(Nginx-web服务器和反向代理学习.assets/image-20221114163546424.png)]
第一种解释:将多个物理机器组成一个逻辑计算机,实现负载均衡和容错
第二种解释:计算机集群简称集群,是一种计算机系统,它通过一组松散集成的计算机软件或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看做是一台计算机。
在Nginx集群中Nginx扮演的角色是:分发器
任务:接受请求、分发请求、响应请求
功能模块:
Nginx集群其实是:虚拟机+反向代理+upstream分发模块组成的
数据走向:
Syntax: upstream name {...}
Default: -
Context: http
# upstream 模块
upstream web {
server 192.168.204.3;
server 192.168.204.4;
}
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
proxy_pass http://web;
}
}
# 后端服务器server后不用状态标注的话,就是默认1:1轮询
http {
upstream web {
server 192.168.204.3;
server 192.168.204.4;
}
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
proxy_pass http://web;
}
}
}
http {
upstream web {
server 192.168.204.3 weight=1;
server 192.168.204.4 weight=2;
}
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
proxy_pass http://web;
}
}
}
http {
upstream web {
ip_hash;
server 192.168.204.3;
server 192.168.204.4;
}
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
proxy_pass http://web;
}
}
}
# down状态示例
http {
upstream web {
server 192.168.204.3 down; # 此时Nginx分发器不会分发请求到这台服务器
server 192.168.204.4;
}
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
proxy_pass http://web;
}
}
}
# backup状态示例
http {
upstream web {
server 192.168.204.3;
server 192.168.204.4 backup; # 当server1业务服务器忙不过来或者down掉时,才会分发请求到此台服务器
}
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
proxy_pass http://web;
}
}
}
http {
upstream web1 {
server 192.168.204.3;
}
upstream web2 {
server 192.168.204.4;
}
server {
listen 80;
server_name www.web1.com;
charset utf-8;
location / {
proxy_pass http://web1;
}
}
server {
listen 80;
server_name www.web2.com;
charset utf-8;
location / {
proxy_pass http://web2;
}
}
}
http {
upstream php {
server 192.168.204.3;
}
upstream html {
server 192.168.204.4;
}
server {
listen 80;
server_name www.web1.com;
charset utf-8;
location ~* \.php$ {
proxy_pass http://php;
}
location ~* \.html$ {
proxy_pass http://html;
}
}
}
http {
upstream elinks {
server 192.168.204.3;
}
upstream chrome {
server 192.168.204.4;
}
upstream any {
server 192.168.204.4:81;
}
server {
listen 80;
server_name www.web1.com;
charset utf-8;
location / {
proxy_pass http://any;
if ($http_user_agent ~* 'elinks') {
proxy_pass http://elinks;
}
if ($http_user_agent ~* 'chrome') {
proxy_pass http://chrome;
}
}
}
}
http {
upstream bj.server {
server 192.168.204.3;
}
upstream sh.server {
server 192.168.204.4;
}
upstream default.server {
server 192.168.204.4:81;
}
#geo是nginx自带的IP库模块,用来存放ip的
geo $geo {
# 后缀default、bj、sh字段要和上面upstream集群名保持一致
# 当接收到ip请求后,匹配ip库,返回后缀名给geo变量,因此$geo的值 # 为[bj/sh]
default default;
192.168.204.3/32 bj;
192.168.204.4/32 sh;
}
server {
listen 80;
server_name www.web1.com;
charset utf-8;
location / {
proxy_pass http://$geo.server$request_uri;
}
}
}
#cat keepalived_install.sh
#!/bin/bash
pkg=keepalived-2.0.8.tar.gz
tar xf $pkg
yum -y install kernel-devel
In -s /usr/src/kernels/3.10.0-862.14.4.el7.x86_64/ /usr/src/linux
cd keepalived-2.0.8/
yum install openssl-* -y
/configure --prefix=/usr/local/keepalived
make
make install
mkdir -pv /etc/keepalived
cp/usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
In-s /usr/local/keepalived/sbin/keepalived /sbin/
global_defs {
notification_email { # 故障发生时,给谁发送邮件消息
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc # 通知邮件从哪个地址发出
smtp_server 192.168.200.1 # 通知邮件的smtp地址
smtp_connect_timeout 30 # 连接smtp服务器的超时时间
router_id LVS_DEVEL # 标识本节点的字符串,故障发生时,邮件通知会用到
vrrp_skip_check_adv_addr # 检查收到vrrp通告中的所有地址会比较耗时,设置此属性,当通告与接收的上一个通告来自同一个master路由器,则跳过检查,默认不跳过检查
vrrp_strict # 严格遵守vrrp协议
vrrp_garp_interval 0.1 # 一个接口发送的两个arp之间的延迟
vrrp_gna_interval 0.1
script_user root # 设置运行脚本默认用户和组,如果不指定,则默认为keepalived_script(需要该用户存在)
}
static_ipaddress {
x.x.x.x
}
static_routes {
x.x.x.x
}
vrrp_instance VI_1 {
state MASTER # 指定keepalived节点的初始状态,MASTER/BACKUP
interface ens33 # vrrp实例绑定的接口,用于发送vrrp包
virtual_router_id 51 # 指定vrrp实例id
priority 100 # 指定优先级,优先级高的伪MASTER
advert_int 1 # 发送vrrp包的间隔,即多久进行一次master选举
nopreempt # 指定非抢占模式,默认为抢占模式
preempt_delay 300 # master启动多久之后接管资源,前提是抢占模式下
authentication { # 认证区域,认证方式有PASS和HA,推荐使用PASS(密码只识别前8位)
auth_type PASS # 认证方式
auth_pass 1111 # 认证密码
}
virtual_ipaddress { # 设置虚拟ip
192.168.132.16
}
track_script { # 设置执行脚本函数
nginx_check
}
garp_master_delay 15 # 当切换为master后多久更新ARP缓存,默认为5秒
track_interface { # 监控以下网卡,如果任意一个不通,则会切换为FAIL状态
ens0
ens33
}
}
vrrp_sync_group VG_1 {
group { # 设置vrrp_instance组
VI_1
VI_2
}
notify_master /usr/local/keepalived/sbin/to_master.sh # 切换为master时执行的脚本
notify_backup /usr/local/keepalived/sbin/to_backup.sh # 切换为backup时执行的脚本
notify_fault /usr/local/keepalived/sbin/fault.sh # 出错时执行的脚本
notify /usr/local/keepalived/sbin/notify.sh # 任何状态切换时都会执行该脚本,且在以上三个脚本执行完成之后执行
smtp_alert # 是否开启邮件通知
}
virtual_server 192.168.200.100 443 {
delay_loop 6 # 延迟轮询时间(单位秒)
lb_algo rr|wrr|lc|wlc|lblc|sh|dh # 后端调试算法
lb_kind NAT|DR|TUN # LVS调度类型
persistence_timeout 50 # 会话保持时间
persistence_granularity # lvs会话保持粒度
protocol TCP # 使用的协议
sorry_server # 指定备用机,所有的realserver失败后启用
real_server 192.168.201.100 443 { # 真正提供服务的服务器
weight 1 #默认为1,0为失败
inhibit_on_failure # 在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
notify_up /usr/local/keepalived/sbin/notify_up.sh # 当服务器健康检查成功时执行的脚本
notify_down /usr/local/keepalived/sbin/notify_down.sh # 当服务器健康检查失败时执行的脚本
SSL_GET|HTTP_GET {
url { # 检查url,可指定多个
path / # 请求realserver上的路径
digest ff20ad2481f97b1754ef3e12ecd3a9cc # 使用genhash计算出的摘要信息
status_code # 检查的http状态码
}
connect_port 80 # 健康检查,如果端口通,则认为服务器正常
connect_timeout 3 # 超时时长
retry 3 # 重试次数
delay_before_retry 3 # 下次重试的时间延迟
}
TCP_CHECK {
connect_timeout 3 # 超时时间
retry 3 # 重试次数
connect_port 80 # 健康检查端口
delay_before_retry 3 # 下次重试的时间延迟
}
SMTP_CHECK {
host {
connect_ip # 连接ip
connect_port #连接端口
}
connect_timeout 3 # 超时时间
retry 3 # 重试次数
delay_before_retry 3 # 下次重试的时间延迟
}
MISC_CHECK {
misc_path # 外部脚本路径
misc_timeout # 脚本执行超时时间
misc_dynamic # 如果设置该项,则退出状态码会用来动态调整服务器的权重,返回0,则正常不修改,返回1,则权重改为0
}
}
}
注:当环境复杂时,会导致keepalived配置文件中内容繁多,不易进行管理,可以将不同集群的配置放在独立的子配置文件中,利用include指令在主配置文件中引入子配置文件
案例展示
! Configuration File for keepalived
global_defs {
route_id NGINX_DEVEL
}
vrrp_script check_nginx {
script "/etc/keepalived/nginx_pid.sh"
interval 2
fail 1
}
vrrp_instance nginx {
state MASTER
interface ens33
mcast_src_ip 192.168.137.10
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx
}
virtual_ipaddress {
192.168.137.213/24
}
}
# script "/etc/keepalived/nginx_pid.sh"
#!/bin/bash
function nginx_kp_check {
nginx_pid=`ps -C nginx --no-header |wc -l`
if [ $nginx_pid -eq 0 ] ; then
/opt/program/nginx/sbin/nginx
sleep 1
nginx_pid=`ps -C nginx --no-header |wc -l`
if [ $nginx_pid -eq 0 ];then
systemctl stop keepalived
fi
fi
}
nginx_kp_check