当前位置: 首页 > news >正文

Nginx中的内置变量、指令、URL重写功能及其虚拟主机配置、负载均衡配置

零、前导知识

使用源码安装配置Linux上的Web服务器——Nginx文章浏览阅读96次。本文主要是关于Nginx的简介及其各个版本说明;同时还有保姆级的下载Nginx源码进行配置、编译、安装操作;最后还启动该Nginx服务并设置开机自启,实现生产环境下的Nginx部署上线。 https://blog.csdn.net/xiaochenXIHUA/article/details/150780215Nginx的主要配置文件nginx.conf详细解读——及其不间断重启nginx服务等操作文章浏览阅读424次。本文主要是关于对Nginx的主要配置文件nginx.conf内容的详细解析【全局配置、HTTP配置、压缩内容配置、server配置】的常用项目说明及其配置。最后对如何查看正在运行的Nginx版本及其配置参数查看;如何实现优雅的关闭nginx服务、不间断服务地重启nginx服务等操作。 https://blog.csdn.net/xiaochenXIHUA/article/details/150980344Nginx的反向代理与正向代理及其location的配置说明文章浏览阅读55次。本文主要是关于【Nginx中location的匹配优先级与location配置示例详解】及其重点讲解【Nginx的反向代理内容及其示例】与【正向代理】内容,帮助我们更好的配置使用Nginx。 https://blog.csdn.net/xiaochenXIHUA/article/details/151022106

一、Nginx中的内置变量

1.1、Nginx中的常见内置变量及其示例

Nginx中的常见内置变量
序号Nginx中的常见内置变量说明
1$args表示请求行中的参数
2$document_root等同于当前请求的root指令指定的值(可理解为虚拟主机的资源根目录)
3$uri表示不带请求参数的当前URL,$uri不包含主机名。
4$document_uri与$uri含义一样(表示不带请求参数的当前URL,$uri不包含主机名)。
5$host请求头部中“Host”行指定的值一致。
6$limit_rate用来设置限制连接的速率。
7$request_method等同于request的method,通常是“GET”或“POST”。
8$remote_addr表示客户端IP地址。
9$remote_port表示客户端端口。
10$remote_user表示用户名,由ngx_http_auth_basic_module认证。
11$request_filename表示当前请求的文件的路径名,由root或alias和URI request组合而成。
12$request_uri表示含有参数的完整的初始URI(不包含主机名,由客户端请求决定,不能修改)。
13$query_string与$args含义一致(表示请求行中的参数)。
14$server_addr表示请求的服务器地址。
15$server_name表示请求到达的服务器名。默认是localhost。
16$server_port表示请求到达的服务器的端口号。

内置变量的示例说明:

#示例一:以【http://188.19.236.18:8000/abc?test=123&test2=abc】为例解析
$args:test=123&test2=abc
$uri: /abc
$server_addr:188.19.236.18
$server_port:8000
$request_filename:abc
$request_uri:/abc?test=123&test2=abc
#示例二以【http://172.16.213.199:88/test1/test2/test.php】(假定虚拟主机根目录为/var/www/html)为例解析:
$host:172.16.213.199
$server_port:88
$request_uri: /test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php

 1.2、if 指令解析及其示例

if 指令

if 指令用于判断一个条件,如果条件成立,则后面的大括号内的语句将执行,相关配置从上级继承

#if 指令语法:
if (condition) { … } #使用if指令的字段
server, location

        默认情况下,if指令默认值(none)为空,可在nginx配置文件的server、location部分使用;而且if指令可以在判断语句中指定正则表达式或通过nginx内置变量匹配条件等,相关匹配条件如下表所示:

序号正则表达式匹配规则说明
1~区分大小写匹配
2!~区分大小写不匹配
3~*不区分大小写匹配
4!~*不区分大小写不匹配
序号文件及目录匹配说明
1-f

存在文件。

【!-f】(表示不存在文件)

2-d

存在目录。

【!-d】(表示不存在目录)

3-e

存在文件或目录。

【!-e】(表示不存在文件或目录)

4-x

文件可执行。

【!-x】(表示文件不可执行)

if指令的示例:

#如下表示【不区分大小写匹配】以【gif、jpg、jepg、bmp、swf、htm、html、css、js】结尾的内容
#首先从【/usr/local/nginx/www/img】路径查找,若查找不到在从【/var/www/html/imgs】路径下查找
#若还查找不到再从【/apps/images】路径下查找;还找不到就报404
location ~*\.(gif|jpg|jpeg|png|bmp|swf|htm|html|css|js)$ {root    /usr/local/nginx/www/img;if(!-fsrequest_filename){root	/var/www/html/imgs;}if(!-fsrequestfilename){root	/apps/images;}
}
#示例二:【不区分大小写匹配】以【.jsp】结尾的文件是否在【/webdata/webapp/www/ROOT】路径下存在
#若不存在则从【/usr/local/nginx/www/jsp】路径下查找,若还查找不到则报404
location ~*\.(jsp)$ {root    /webdata/webapp/www/ROOT;if(!-f $requestfilename){root    /usr/local/nginx/www/jsp;}proxy_passhttp://127.0.0.1:8888;
}

二、Nginx中的URL重写功能

 2.1、rewrite 指令解析

rewrite 指令

Nginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但要使用rewrite功能,需要PCRE支持,应在编译nginx时指定PCRE源码目录。

#rewrite的使用语法
rewrite regex flag#使用rewrite指令的字段
server, location, if 

rewrite指令的最后一项参数为flag标记,其支持的flag标记主要有以下四种:

序号rewrite的flag标记说明
1last相当于Apache里的[L]标记,表示完成rewrite之后搜索相应的URI或location。
2break表示终止匹配, 不再匹配后面的规则。
3redirect将返回302临时重定向,在浏览器地址栏会显示跳转后的URL地址。
4permanent将返回301永久重定向,在浏览器地址栏会显示跳转后的URL地址。
last和break用来实现URL重写,浏览器地址栏中的URL地址不变。

 2.2、rewrite 指令示例

#示例一:新域名访问旧网址且新域名及其uri不变
location ~ ^/new/ {rewrite ^/new/(.*)$  /article/$1  break;proxy_pass  https://coffeemilk.blog.csdn.net;
}

   假定访问的域名是【www.newck.com】那么当访问【www.newck.com/new/web.html】时,nginx可以通过rewrite将页面重定向到w【ww.ck.com/old/web.html】,由于是通过反向代理实现了重定向,因此页面重写后不会引起浏览器地址栏中URL的变化这个功能在新旧网站交替的时候非常有用

#示例二:当前域名的所有请求都会重定向到【https://coffeemilk.blog.csdn.net】地址且地址会改变location / {rewrite ^/(.*)$ https://coffeemilk.blog.csdn.net/$1 permanent;}

新旧网站交替的详细操作流程如下:

实现修改Windows系统的主机文件自定义指定ip与域名操作:

#修改windows本地主机文件指定域名为指定IP操作流程#1-进入Windows本地host主机文件路径
C:\Windows\System32\drivers\etc#2-将该路径(Windows本地host主机文件路径)下的hosts文件复制一份到桌面,且在本地复制一份原本的文件做备份(选中hosts文件同时按下ctrl+c复制后又按下ctrl+v粘贴一份即可作为备份)#3-修改复制到桌面上的hosts文件(使用文本编辑器打开)添加域名与ip的对应内容后保存#4-将桌面上修改后保存后的hosts文件复制到【C:\Windows\System32\drivers\etc】路径下替换原来的hosts文件

比如我们想在想要通过现有的【www.newck.com】域名访问原有的【coffeemilk.blog.csdn.net/article/details/151022106】文章,使用现有的域名访问完整地址是【www.newck.com/new/details/151022106】即可。

三、Nginx中的set 指令与break 指令

 3.1、set 指令解析及其示例

set 指令

set指令可以设置一个变量并为其赋值,其值可以是文本、变量或它们的组合。

也可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部变量的值。

序号说明
1
#set使用语法:
set variable value 
2
#使用set的字段
server, location, if 

 set 指令示例:

#示例一:
location / {if ($query_string ~ "id=(.*)") {set  $myid  $1; rewrite ^/app.php$ /m-$myid.html?;          }
} 

        这是配置一个伪静态的示例;假如访问的域名是www.abc.com,那么上面这个配置要实现的功能是将请求为www.abc.com/app.php?id=100重定向到www.abc.com/m-100.html。
        这里用到了if指令和set指令,并且还使用了$query_string变量,此变量用于获取请求行中的参数,if指令用来判断请求参数中的id值,然后通过set指令定义了一个变量$myid,并将$query_string变量中获取到的id值赋给$myid,最后通过rewrite指令进行了url重写。
        这里需要注意的是:rewrite只能针对请求的uri进行重写,而对请求参数无能为力,/app.php问号后面的“id=100”是请求参数,要获取到参数,需要使用nginx的一个内部变量$query_string,这样在重写的时候只需把$query_string变量追加到重写的uri后面即可,另外,为了防止uri中的参数追加到重写后的uri上,需要在rewrite最后面加个问号。

 3.2、break 指令解析及其示例

break 指令

break 指令表示完成当前设置的规则后,不再匹配后面的重写规则。

#break使用语法:
break;#使用break的字段
server, location, if

break示例:

#示例:
server {listen       80;server_name  www.ck.cn;if ($host != 'www.ck.cn') {rewrite ^/(.*)$ http://www.ck.cn/error.txtbreak;rewrite ^/(.*)$ http://www.ck.cn/$1 permanent;}
}

        在这个示例中,定义了一个域名【www.ck.cn】,当访问的域名不是www.ck.cn时,会将请求重定向到“http://www.ck.cn/error.txt” 页面, 由于设置了break指令,因此下面的rewrite规则不再被执行,直接退出。而当访问的域名是www.ck.cn时,将直接执行最后一个rewrite指令。
        这里需要重点掌握一下break的功能,它表示完成当前设置的规则后,不再匹配后面的重写规则,也就是当满足if指令后,直接退出,而不会去执行最后一个rewrite指令的规则。

四、Nginx中的虚拟主机(实现多网站配置)

        虚拟主机功能是Nginx经常用到的一个特性,每个虚拟主机就是一个独立的站点,对应一个域名,如果需要多个域名指向到一个IP上时,通过虚拟主机功能可以轻松实现。

#示例:在Nginx中创建三个虚拟主机(注意:这里仅仅列出了虚拟主机配置部分)
http {server {listen          80;server_name     www.ck1.com;access_log      logs/ck1.access.log main;location / {index index.html;root  /data/www/ck1;}}server {listen          80;server_name     www.ck2.com;access_log      logs/ck2.access.log main;location / {index index.html;root  /data/www/ck2;}}#通过包含文件的方式将第三个网站的虚拟主机配置包含到nginx中include    /usr/local/nginx/conf/www.ck3.conf;
}

《1》创建三个网站的资源目录

#创建ck1、ck2、ck3网站的资源目录
mkdir -p /data/www/ck1
mkdir -p /data/www/ck2
mkdir -p /data/www/ck3

《2》分别给这三个网站设置index.html内容

#设置ck1网站的index.html内容
vi /data/www/ck1/index.html
this is ck1 web#设置ck2网站的index.html内容
vi /data/www/ck2/index.html
this is ck2 web#设置ck3网站的index.html内容
vi /data/www/ck3/index.html
this is ck3 web

《3》在nginx的配置文件设置三个网站的虚拟主机内容

#1-进入nginx的配置文件设置三个网站的虚拟主机配置
cd /usr/local/nginx/conf#2-编辑nginx的主配置文件
vi nginx.confhttp {include       mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  logs/access.log  main;sendfile        on;tcp_nopush     on;tcp_nodelay    on;#keepalive_timeout  0;keepalive_timeout  65;server_names_hash_bucket_size 128;client_max_body_size 20m;client_header_buffer_size 32k;large_client_header_buffers 4 32k;gzip  on;gzip_min_length 1k;gzip_buffers    4    16k;gzip_http_version 1.1;gzip_comp_level 2;gzip_types text/plain application/x-javascript text/css application/xml;gzip_vary on;server {listen          80;server_name     www.ck1.com;access_log      logs/ck1.access.log main;location / {index index.html;root  /data/www/ck1;}}server {listen          80;server_name     www.ck2.com;access_log      logs/ck2.access.log main;location / {index index.html;root  /data/www/ck2;}}#通过包含文件的方式将第三个网站的虚拟主机配置包含到nginx中include    /usr/local/nginx/conf/www.ck3.conf;
}#3-单独创建ck3网站的虚拟主机配置
vi www.ck3.confserver {listen          80;server_name     www.ck3.com;access_log      logs/ck3.access.log main;location / {index index.html;root  /data/www/ck3;}
}#4-验证修改的配置文件是否正确(注意:若验证后提示不正确一定要根据提示修改后再验证直到正确为止)
/usr/local/nginx/sbin/nginx -t

《4》在不影响业务的情况下重启nginx

#1-查看到现有运行的nginx的父进程PID编号
ps -ef | grep nginx#2-在不影响业务运行的情况下重启nginx服务
kill -HUP 6781

《5》修改Windows本机的hosts文件

#1-进入Windows本地host主机文件路径
C:\Windows\System32\drivers\etc#2-将该路径(Windows本地host主机文件路径)下的hosts文件复制一份到桌面,且在本地复制一份原本的文件做备份(选中hosts文件同时按下ctrl+c复制后又按下ctrl+v粘贴一份即可作为备份)修改复制到桌面的hosts文件
192.168.1.11 www.ck1.com
192.168.1.11 www.ck2.com
192.168.1.11 www.ck3.com#3-将桌面修改好的hosts文件粘贴一份到【C:\Windows\System32\drivers\etc】路径下替换即可

《6》在浏览器上分别访问这三个网站会显示不同的内容如下图所示

Nginx上配置多个网站_nginx配置多个网站https://coffeemilk.blog.csdn.net/article/details/140356631

五、Nginx的负载均衡配置解析及其示例

Nginx的负载均衡配置
Nginx的负载均衡模块目前支持5种调度算法(后两项属于第三方的调度方法)
序号Nginx的负载均衡调度配置说明
1轮询

是Nginx的默认配置;

        每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器死机,故障系统被自动剔除,使用户访问不受影响。

2weight指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
3ip_hash每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
4fair

更加智能的负载均衡算法。

        此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配

        Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。

5url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。

Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。

在HTTP Upstream模块中,除了可以通过server指令指定后端服务器的IP地址和端口;

同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的四种状态如下:

序号Nginx负载均衡的状态说明
1down当前的server暂时不参与负载均衡。
2backup预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
3max_fails允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
4fail_timeout在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。

负载均衡的配置示例:

#负载均衡的配置示例一
http 
{upstream  reverseProxyServer {server   192.168.1.18:80   weight=3 max_fails=3 fail_timeout=20s;server   192.168.1.19:80   weight=1 max_fails=3 fail_timeout=20s;server   192.168.1.20:80   weight=4 max_fails=3 fail_timeout=20s;}server{listen       80;server_name  www.ck.com 192.168.1.11;index index.htm index.html;root  /data/www/ck;location / {proxy_pass http://reverseProxyServer;proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;include    /usr/local/nginx/conf/proxy.conf;}
}
#负载均衡的配置示例二
http 
{upstream  reverseProxyServer {server   192.168.1.18:80   max_fails=3 fail_timeout=20s;server   192.168.1.19:80   max_fails=3 fail_timeout=20s;server   192.168.1.20:80   max_fails=3 fail_timeout=20s;ip_hash;}server{listen       80;server_name  www.ck.com 192.168.1.11;index index.htm index.html;root  /data/www/ck;location / {proxy_pass http://reverseProxyServer;proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;include    /usr/local/nginx/conf/proxy.conf;}
}
http://www.xdnf.cn/news/1441999.html

相关文章:

  • 关于linux编程——网络编程2
  • 工业4.0时代的通信革命:OPC UA Pub/Sub机制全面解析
  • 百万级并发下的微服务架构设计之道:从阿里双11看分布式系统核心原则与落地实践
  • 云计算培训为什么这么贵?
  • EagleTrader观察|你的固定心态,可能正在悄悄让你交易破产
  • Element UI MessageBox 渲染虚拟节点的坑与解决方案
  • 【深度学习新浪潮】用3DGS做三维重建有哪些主要的技术路线可供选择?
  • 【随手记】vscode中C语言满足KR风格的方法
  • Leetcode—695. 岛屿的最大面积【中等】
  • Docker实战指南:从安装到架构解析
  • 【Linux】网络(中)
  • 数据结构:栈和队列(上)
  • 数据结构从青铜到王者第十九话---Map和Set(2)
  • 下载必要软件
  • Qt读写Excel--QXlsx基本使用
  • 基于-轻量级文档搜索系统的测试报告
  • 【GM3568JHF】FPGA+ARM异构开发板 使用指南:WIFI
  • SQLite3 操作指南:SQL 语句与 ORM 方法对比解析​
  • 存算一体:重构AI计算的革命性技术(1)
  • K8s Pod CrashLoopBackOff:从镜像构建到探针配置的排查过程
  • react-android-0.80.2-debug.aar下载很慢
  • GitHub 宕机自救指南技术文章大纲
  • Flutter Android真机器调式,虚拟机调试以及在Vscode中开发Flutter应用
  • 充电座结构设计点-经验总结
  • 10.2 工程学中的矩阵(2)
  • Android/Java 异常捕获
  • 电子病历空缺句的语言学特征描述与自动分类探析(以GPT-5为例)(中)
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘isort’问题
  • MCP模型库哪个好?2025年收录12万+服务的AI智能体工具集成平台推荐
  • AI创业公司:来牟科技-智能割草机器人