首页 > 系统相关 >Nginx服务

Nginx服务

时间:2024-03-21 20:56:15浏览次数:30  
标签:匹配 nginx Nginx html location 服务 root

NGINX服务

目录

第一章 ·Nginx简介 4

·什么是nginx 4

·正向代理 4

·反向代理 5

·负载均衡 5

·动静分离 6

第二章 ·Nginx的安装 7

·yum方式安装 7

·源码包方式安装 7

·测试 8

第三章 ·Nginx常用命令 9

第四章 ·Nginx的配置文件 11

·全局块 11

·events块 11

·http块 11

·http全局块 12

·server块 12

第五章 ·配置示例 14

·Nginx配置实例1-反向代理 14

·准备工作 14

·访问过程分析 14

·具体配置 15

·Nginx配置实例2-反向代理 16

·准备工作 16

·具体配置 16

·测试 17

·location指令说明 18

·Nginx配置实例-负载均衡 19

·准备工作 19

·在nginx的配置文件中进行负载均衡的配置。 19

·Nginx配置实例-动静分离 22

·什么是动静分离 22

· 准备工作 24

·测试 25

第六章 ·Nginx_配置高可用的集群 26

·什么是nginx高可用 26

·准备工作 27

·完成高可用配置(主从配置) 27

·测试 30

第七章 ·Nginx的原理 31

·master和worker 31

·worker如何工作的 31

·一个master和多个woker有什么好处 32

·设置多少个worker合适 32

·连接数worker_connection 33

第八章 ·实验过程中遇到的问题及解决方法 34

问题1 34

问题2 34

第九章 ·Nginx的依赖包介绍 36

1、gcc 36

2、pcre 36

3、zlib 36

4、openssl 36

·Nginx简介

·什么是nginx

Nginx (engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。

在连接高并发的情况下,Nginx是Apache服务不错的替代品:能够支持高达 50,000 个并发连接数的响应

·正向代理

Nginx,不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。

正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

·反向代理

反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

·负载均衡

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

·动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

·Nginx的安装

·yum方式安装

设置yum存储库,创建具有以下内容的文件:/etc/yum.repos.d/nginx.repo

[nginx-stable]

name=nginx stable repo

baseurl=http://nginx.org/packages/centos/$releasever/$basearch/

gpgcheck=1

enabled=1

gpgkey=https://nginx.org/keys/nginx_signing.key

module_hotfixes=true

安装 nginx,请运行以下命令:sudo yum install nginx

·源码包方式安装

(1)安装依赖

[root@CentOS7 ~]# yum -y install openssl-devel.x86_64 zlib-devel.x86_64 pcre2-devel.x86_64(openssl、zlib、pcre)

(2)下载nginx源码包,并上传到服务器,解压,检查,编译和安装

[root@CentOS7 ~]# tar -xf nginx-1.24.0.tar.gz

[root@CentOS7 nginx-1.24.0]# ./configure

[root@CentOS7 nginx-1.24.0]# make && make install

·测试

·开启80端口

[root@CentOS7 ~]# firewall-cmd --permanent --add-port=80/tcp

[root@CentOS7 ~]# firewall-cmd --reload

·开启nginx(以下都是基于yum安装后的操作)

[root@CentOS7 ~]# systemctl start nginx

·Nginx常用命令

[root@CentOS7 ~]# nginx -help

nginx version: nginx/1.24.0

Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]

[-e filename] [-c filename] [-g directives]

//[-s信号][-p前缀][-e文件名][-c文件名][-g指令]

Options:

-?,-h : this help

-v : show version and exit

-V : show version and configure options then exit

-t : test configuration and exit

-T : test configuration, dump it and exit

-q : suppress non-error messages during configuration testing

-s signal : send signal to a master process: stop, quit, reopen, reload

-p prefix : set prefix path (default: /etc/nginx/)

-e filename : set error log file (default: /var/log/nginx/error.log)

-c filename : set configuration file (default: /etc/nginx/nginx.conf)

-g directives : set global directives out of configuration file

//-?、-h:这个帮助

-v:显示版本并退出

-t:测试配置和退出

-s信号:向主进程发送信号:停止、退出、重新打开、重新加载

[root@CentOS7 ~]# nginx -s stop

[root@CentOS7 ~]# nginx -s quit

[root@CentOS7 ~]# nginx -s reopen

[root@CentOS7 ~]# nginx -s reload

-c filename:设置配置文件(默认值:/etc/nginx/nginx.conf)

[root@CentOS7 ~]# nginx -c /etc/nginx/nginx.conf

·Nginx的配置文件

/etc/nginx

·全局块

全局配置:从配置文件开始到events块之间,主要是设置一些影响nginx服务器整体运行的配置指令,对全局生效;

user nginx;

//运行用户,默认即是nginx,可以不进行设置

worker_processes auto;

//Nginx 进程数,一般设置为和 CPU 核数一样

error_log /var/log/nginx/error.log warn;

// Nginx 的错误日志存放目录

pid /var/run/nginx.pid;

Nginx 服务启动时的 pid 存放位置

·events块

events:配置影响Nginx服务器与用户的网络连接;

events {# 每个进程允许最大并发数worker_connections 1024;

}

·http块

http:配置代理,缓存,日志定义、反向代理、负载均衡等绝大多数功能和第三方模块的配置;

配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置

·http全局块

http 全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等

·server块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

每个http 块可以包括多个server 块,而每个server 块就相当于一个虚拟主机。

而每个server 块也分为全局server 块,以及可以同时包含多个locaton块。

·全局server块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。

·location块

一个server块可以配置多个location块。

这块的主要作用是基于Nginx服务器接收到的请求字符串(例如server_name/uri-string ),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string )进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

·配置示例

·Nginx配置实例1-反向代理

·准备工作

准备一台虚拟机当作Apache

(1)准备Apache

[root@CentOS7 ~]# yum -y install httpd

(2)将服务侦听端口改为8080

#Listen 12.34.56.78:80

Listen 8080

(3)开启服务,防火墙放行8080端口并验证

[root@CentOS7 ~]# systemctl start httpd

[root@CentOS7 ~]# firewall-cmd --permanent --add-port=8080/tcp

[root@CentOS7 ~]# firewall-cmd --reload

·访问过程分析

·具体配置

(1)在 windows系统的host文件进行域名和ip对应关系的配置。

C:\Windows\System32\drivers\etc\hosts

192.168.33.100 www.123.com

(2)在nginx进行请求转发的配置(反向代理配置)

[root@CentOS7 ~]# vim /etc/nginx/conf.d/default.conf

[root@CentOS7 ~]# systemctl restart httpd

[root@CentOS7 ~]# systemctl restart nginx

·Nginx配置实例2-反向代理

·实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口的服务中

nginx监听端口为9001

访问http://192.168.33.100:9001/edu/直接跳转到127.0.0.1:8081

访问http://192.168.33.100:9001/vod/直接跳转到127.0.0.1:8082

·准备工作

准备两个tomcat服务器,一个8080端口,一个8081端口

创建文件夹和测试页面

·具体配置

[root@CentOS7 conf.d]# cd /etc/nginx/conf.d

[root@CentOS7 conf.d]# vim default.conf

//加上下面这些代码

server {

listen 9001;

server_name 192.168.33.100;

 

location ~ /edu/ {

proxy_pass http://127.0.0.1:8080;

}

location ~ /vod/ {

proxy_pass http://127.0.0.1:8081;

}

}

重新加载nginx

[root@CentOS7 ~]# nginx -s reload

这里记得要放行9001端口

[root@CentOS7 ~]# firewall-cmd --permanent --add-port=9001/tcp

[root@CentOS7 ~]# firewall-cmd --reload

·测试

·location指令说明

该指令用于匹配URL

语法如下:

1、= :用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

2、~:用于表示 uri包含正则表达式,并且区分大小写。

3、~*:用于表示 uri包含正则表达式,并且不区分大小写。

4、^~:用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的 location后,立即使用此 location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。

注意:如果uri包含正则表达式,则必须要有~或者~*标识。

·Nginx配置实例-负载均衡

·实现效果

浏览器地址栏输入地址http://192.168.33.100/edu/a.html,负载均衡效果,平均 8080和 8081端口中

·准备工作

(1)准备两台tomcat服务器,一台8080,一台8081

(2)在两台tomcat里面webapps目录中,创建名称是edu文件夹,在edu文件夹中创建页面a.html,用于测试

·在nginx的配置文件中进行负载均衡的配置。

[root@CentOS7 ~]# vim /etc/nginx/conf.d/default.conf

[root@CentOS7 ~]# vim /etc/nginx/nginx.conf

随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,

顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,

很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx就是其中的一个,在linux下有Nginx、LVS、Haproxy等等服务可以提供负载均衡服务,而且Nginx提供了几种分配方式(策略)

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight

weight代表权重,默认为1,权重越高被分配的客户端越多

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。例如:

Upstream server_pool {

server 192.168.33.100 weight=10;

server 192.168.33.100 weight=20;

}

3、ip_hash

每个请求按访问ip的 hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。例如:

upstream server_pool {

ip_hash

server 192.168.33.100:80;

server 192.168.33.200:80;

}

4、fair (第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream server_pool {

server 192.168.33.100:80;

server 192.168.33.200:80;

fair;

}

·Nginx配置实例-动静分离

·什么是动静分离

Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。

通过 location指定不同的后缀名实现不同的请求转发。通过 expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件不建议使用Expires来缓存),我这里设置3d,表示在这 3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。

· 准备工作

在 liunx系统中准备静态资源,用于进行访问

[root@CentOS7 ~]# mkdir /data/

[root@CentOS7 data]# mkdir www

[root@CentOS7 data]# mkdir image

(2)在nginx配置文件中进行配置

[root@CentOS7 ~]# vim /etc/nginx/conf.d/default.conf

autoindex on 可以列出文件目录

·测试

浏览器中输入地址

·Nginx_配置高可用的集群

·什么是nginx高可用

(1)需要两台nginx服务器

(2)需要keepalived

(3)需要虚拟ip

·准备工作

(1)需要两台服务器192.168.33.100和192.168.33.200

(2) 在两台服务器安装nginx

(3)在两台服务器安装keepalived

[root@CentOS7 ~]# yum -y install keepalived

安装之后,在etc里面生成目录 keepalived,有文件 keepalived.conf

·完成高可用配置(主从配置)

主服务器:

[root@CentOS7 ~]# vim /etc/keepalived/keepalived.conf

//添加

vrrp_script chk_nginx {

script "/etc/keepalived/chk_nginx.sh "

interval 1

weight -30

}

//修改

vrrp_instance VI_1 {

state MASTER

interface ens33

virtual_router_id 51

priority 110

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.33.50

}

track_script {

chk_nginx

}

}

//创建检测脚本

[root@CentOS7 ~]# vim /etc/keepalived/chk_nginx.sh

#!bin/bash

/usr/bin/killall -0 nginx

//赋予执行权限

[root@CentOS7 ~]# chmod a+x /etc/keepalived/chk_nginx.sh

备服务器:

vrrp_instance VI_1 {

state BACKUP

interface ens33

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.33.50

}

}

·测试

·Nginx的原理

·master和worker

·worker如何工作的

·一个master和多个woker有什么好处

可以使用nginx -s reload热部署

每个woker是独立的进程,如果有其中的一个woker 出现问题,其他woker独立的,继续进行争抢,实现请求过程,不会造成服务中断

master-workers的机制的好处

首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,

同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快后动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug 了,异常退出,会导致当前worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

·设置多少个worker合适

需要设置多少个workere

Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非随塞的方式来处理请求,即使是千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以 worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。

·连接数worker_connection

第一个问题:发送请求,占用了woker的几个连接数?

答案:2或者4个

连接数worker_connection

这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx.能建立的最大连接数,应该是worker_connections * worker_processes。当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections *worker_processes,如果是支持http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是:worker_connections * worker_processes/2,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections*worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

#设置worker数量

worker_processes 4

#work 绑定cpu(4 work绑定4cpu)

worker_cpu_affinity 0001 0010 0100 1000

#work绑定cpu (4 work绑定8cpu中的4个)。

worker_cpu_affinity 00000001 00000010 00000100 00001000

·实验过程中遇到的问题及解决方法

问题1

Tomcat不要下载最新的,会报错,下一个版本为8点几的就已经可以了,主要用来测试。

问题2

nginx服务器重启后报 nginx: [error] open() “/var/run/nginx.pid” failed (2: No such file or directory)错误的原因是:

把 nginx 进程杀死后,导致pid丢失。当我们再次使用命令nginx -s reload启动时就找不到nginx.pid了。

解决方法:

进入 nginx 的安装目录,执行配置文件nginx.conf。

cd /etc/nginx

nginx -c nginx.conf

// 或直接

nginx -c /etc/nginx/nginx.conf

·Nginx的依赖包介绍

1、gcc

    gcc是可以在多种硬件平台上编译出可执行程序的超级编译器,安装Nginx需要先从官网下载源码进行编译,编译的过程依赖gcc环境(CentOS系统自带gcc)。

2、pcre

    pcre是一个用C语言编写的正则表达式函数Nginx的http模块需要用到pcre来解析正则表达式,另外pcre-devel是使用pcre开发的二次开发库,所以Nginx都需要。

3、zlib

    zlib库提供了很多种压缩和解压缩的方式,zlib库里面有很多压缩和解压的方式,Nginx使用zlib对包的内容进行gzip

4、openssl

    openssl提供了这个强大的安全套接字密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用,Nginx除了支持http还支持https

补充

一、常见的Nginx正则表达式

^ :匹配输入字符串的起始位置

$ :匹配输入字符串的结束位置

* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”

+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”

? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”

. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式

\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”

\d :匹配纯数字

{n} :重复 n 次

{n,} :重复 n 次或更多次

{n,m} :重复 n 到 m 次

[] :定义匹配的字符范围

[c] :匹配单个字符 c

[a-z] :匹配 a-z 小写字母的任意一个

[a-zA-Z0-9] :匹配所有大小写字母或数字

() :表达式的开始和结束位置

| :或运算符

二、location

1、location大致可以分为三类

精准匹配:location = / {...}

一般匹配:location / {...}

正则匹配:location ~ / {...}

2、location常用的匹配规则

= :进行普通字符精确匹配,也就是完全匹配。

^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。

~ :区分大小写的匹配。

~* :不区分大小写的匹配。

!~ :区分大小写的匹配取非。

!~* :不区分大小写的匹配取非。

3、location 优先级

首先精确匹配 =

其次前缀匹配 ^~

其次是按文件中顺序的正则匹配 ~或~*

然后匹配不带任何修饰的前缀匹配

最后是交给 / 通用匹配

优先级总结

(location = 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

4、location 示例说明

location = / {}

=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配

再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。

location / {}

因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求比如访问 / 和 /data, 则 / 匹配, /data 也匹配,但若后面是正则表达式会和最长字符串优先匹配(最长匹配)

location /documents/ {}

匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location

只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

location /documents/abc {}

匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location

只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

location ^~ /images/ {}

匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

location ~ .(gif|jpg|jpeg)$ {}*

匹配所有以 gif、jpg或jpeg 结尾的请求.然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

location /images/abc {}

最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

location ~ /images/abc {}

匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

location /images/abc/1.html {}

匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

5、location 匹配顺序

首先看 优先级:精确>前缀>正则>一般>通用

优先级相同:正则看上下顺序,上面的优先;一般匹配看长度,最长匹配的优先

精确、前缀、正则、一般都没有匹配到,最后再看通用匹配

6、三个匹配规则定义

实际网站使用中,至少有三个匹配规则定义

6.1 直接匹配网站根

第一个必选规则直接匹配网站根

通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。

可以是一个静态首页,也可以直接转发给后端应用服务器

location = / {

root html;

index index.html index.htm;

}

6.2 处理静态文件请求

第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项

有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

目录匹配

location ^~ /static/ {

root /webroot/static/;

}

后缀匹配

location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {

root /webroot/res/;

}

6.3 通用规则

第三个规则就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器

非静态文件请求就默认是动态请求

location / {

proxy_pass http://tomcat_server;

}

三、rewrite

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。

比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用

例如 http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。

语法格式:

rewrite <regex> <replacement> [flag];

regex :表示正则匹配规则。

replacement :表示跳转后的内容。

flag :表示rewrite支持的flag标记。

1、rewrite跳转实现

Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else

跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误

PCRE支持:perl兼容正则表达式的语法规则匹配

重写模块 set 指令:创建新的变量并设其值

2、rewrite 执行顺序

执行 server 块里面的 rewrite 指令。

执行 location 匹配。

执行选定的 location 中的 rewrite 指令。

3、flag标记说明

last :本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在 server 和 if 中。

break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。

redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。

permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

4、rewrite和location区别

从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。

四、rewrite 示例

1、基于域名的跳转

现在公司旧域名www.xiaobai.com有业务需求变更,需要使用新域名www.xiaohong.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

vim /usr/local/nginx/conf/nginx.conf

 

server {

listen 80;

server_name www.xiaobai.com; #域名修改

charset utf-8;

access_log /var/log/nginx/www.xiaobai.com-access.log; #日志修改

location / {

#添加域名重定向

if ($host = 'www.xiaobai.com'){ #$host为rewrite全局变量,代表请求主机头字段或主机名

rewrite ^/(.*)$ http://www.xiaohong.com/$1 permanent; #$1为正则匹配的内容,即“域名/”之后的字符串

}

root html;

index index.html index.htm;

}

}

浏览器输入模拟访问 http://www.xiaobai.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.xiaohong.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

2、基于客户端 IP 访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.109.12访问正常。

vim /usr/local/nginx/conf/nginx.conf

 

server {

listen 80;

server_name www.kgc.com; #域名修改

charset utf-8;

access_log /var/log/nginx/www.kgc.com-access.log; #日志修改

 

#设置是否合法的IP标记

set $rewrite true; #设置变量$rewrite,变量值为boole值true

#判断是否为合法IP

#remode_addr表示客户端

if ($remote_addr = "192.168.10.19"){ #当客户端IP为192.168.10.19时,将变量值设为false,不进行重写

set $rewrite false;

}

#除了合法IP,其它都是非法IP,进行重写跳转维护页面

if ($rewrite = true){ #当变量值为true时,进行重写

rewrite (.+) /weihu.html; #将域名后边的路径重写成/weihu.html,例如www.kgc.com/weihu.html

}

location = /weihu.html {

root /var/www/html; #网页返回/var/www/html/weihu.html的内容

}

 

location / {

root html;

index index.html index.htm;

}

}

只有本机能跳转,其他机子直接跳转到weihu界面

3、基于旧域名跳转到新域名后面加目录

现在访问的是 http://bbs.xiaohong.com/post/,现在需要将这个域名下面的访问都跳转到http://www.xiaohong.com/bbs/post/

vim /usr/local/nginx/conf/nginx.conf

server {

listen 80;

server_name bbs.xiaohong.com; #域名修改

charset utf-8;

access_log /var/log/nginx/www.xiaohong.com-access.log;

#添加

location /post {

rewrite (.+) http://www.xiaohong.com/bbs$1 permanent; #这里的$1为位置变量,代表/post

}

 

location / {

root html;

index index.html index.htm;

}

}

使用浏览器访问 http://bbs.xiaohong.com/post/1.html 跳转到 http://www.xiaohongcom/bbs/post/1.html

4、基于参数匹配的跳转

现在访问http://www.kgc.com/100-(100|200)-100.html 跳转到http://www.kgc.com页面。

vim /usr/local/nginx/conf/nginx.conf

server {

listen 80;

server_name www.kgc.com; #域名修改

charset utf-8;

access_log /var/log/nginx/www.kgc.com-access.log;

 

if ($request_uri ~ ^/100-(100|200)-(\d+).html$) { #\d代表匹配数字,+代表匹配1个或多个

rewrite (.+) http://www.kgc.com permanent;

}

 

location / {

root html;

index index.html index.htm;

}

}

systemctl restart nginx

 

$request_uri:包含请求参数的原始URI,不包含主机名,如:http://www.kgc.com/abc/bbs/index.html?a=1&b=2 中的 /abc/bbs/index.php?a=1&b=2

$uri:这个变量指当前的请求URI,不包括任何参数,如:/abc/bbs/index.html

$document_uri:与$uri相同,这个变量指当前的请求URI,不包括任何传递参数,如:/abc/bbs/index.html

使用浏览器访问 http://www.kgc.com/100-200-100.html 或 http://www.kgc.com/100-100-100.html 跳转到http://www.kgc.com页面。#100-200只能输入100或200

5、基于目录下所有 php 结尾的文件跳转

要求访问 http://www.xiaohong.com/upload/123.php 跳转到首页。

vim /usr/local/nginx/conf/nginx.conf

server {

listen 80;

server_name www.xiaohong.com; #域名修改

charset utf-8;

access_log /var/log/nginx/www.xiaohong.com-access.log;

 

location ~* /upload/.*\.php$ {

rewrite (.+) http://www.xiaohong.com permanent;

}

 

location / {

root html;

index index.html index.htm;

}

}

 

 

systemctl restart nginx

浏览器访问 http://www.xiaohong.com/upload/123.php 跳转到http://www.xiaohong.com页面。

6、基于最普通一条 url 请求的跳转

要求访问一个具体的页面如 http://www.kgc.com/abc/123.html 跳转到首页

vim /usr/local/nginx/conf/nginx.conf

server {

listen 80;

server_name www.kgc.com; #域名修改

charset utf-8;

access_log /var/log/nginx/www.kgc.com-access.log;

 

location ~* ^/abc/123.html {

rewrite (.+) http://www.kgc.com permanent;

}

 

location / {

root html;

index index.html index.htm;

}

}

 

 

systemctl restart nginx

标签:匹配,nginx,Nginx,html,location,服务,root
From: https://www.cnblogs.com/xiaoying23/p/18088219

相关文章

  • 【SpringSecurity】十七、OAuth2授权服务器 + 资源服务器Demo
    文章目录0、库表准备:1、项目结构2、基于数据库的认证3、授权服务器配置4、授权服务器效果测试5、资源服务器配置相关......
  • AWS EC2 实例和本地服务器配置 Amazon CloudWatch 代理
    为什么需要Cloudwatch代理本地服务器?统一的监控视图,高级数据分析和可视化,自动化的响应,简化日志管理,提高可靠性和可用性,符合合会性要求这样子做有什么好处?集中监控:CloudWatch代理使能够将本地服务器的监控数据,(如CPU使用率、内存消耗、网络流量和应用程序日志)发送到CloudW......
  • nginx故障实例--附带排查思路
    nginx故障实例--附带排查思路一Nginx工作场景Nginx是最受欢迎的HTTP服务器之一,在我们公司扮演着举足轻重的作用,做为我们公司的核心组件之一,在整个访问链路上是不可或缺的一环,而且,Nginx组件、模块、版本众多,所以如何管理好Nginx将显得至关重要.Beforewegetstarted,......
  • nginx入门-31-学习笔记
    nginx入门-31-学习笔记环境环境:虚拟机ip:10.0.1.0网关:10.0.1.2子网掩码:255.255.255.0测试机器ip:10.0.1.101概念1.安装nginx软件安装:yum安装yuminstallepel-releaseyuminstallnginx-ysystemctlstartnginx编译安装(生产环境)yum-yinstallpcr......
  • Linux系统服务必学之NTP时间服务搭建
            NTP(NetworkTimeProtocol,网络时间协议)是一种用于同步计算机系统时间的网络协议。它允许计算机通过网络与时间服务器进行通信,以获取准确的时间信息并将其应用于本地系统。NTP的主要目标是确保计算机系统之间的时间同步,以便在分布式系统和网络中实现一致性和准......
  • ubuntu 搭建Samba服务
    1.sudoapt-getinstallsamba2.sudocp/etc/samba/smb.conf/etc/samba/smb.conf.bak3.sudovi/etc/samba/smb.conf在smb.conf的文件最后加入以下配置并保存,然后退出[work] #ubuntu下的共享目录名称comment=sambahomedirectorypath=/home/book/ #共享目......
  • 运维人少,如何批量管理上百个微服务、上千条流水线?
    作者:周静随着微服务和云原生技术的发展,一个业务系统往往由多个微服务应用组成,多个业务方向涉及几十上百应用。每个应用研发过程又划分为测试、预发、生产多条流水线,也即成百上千条流水线。而一个企业下通常只有1~2个运维或架构师负责这些应用的配置管理工作。该场景下你是否会遇......
  • 运维人少,如何批量管理上百个微服务、上千条流水线?
    作者:周静随着微服务和云原生技术的发展,一个业务系统往往由多个微服务应用组成,多个业务方向涉及几十上百应用。每个应用研发过程又划分为测试、预发、生产多条流水线,也即成百上千条流水线。而一个企业下通常只有1~2个运维或架构师负责这些应用的配置管理工作。该场景下你是否会遇......
  • Linux服务器上部署更新/重启nuxt项目
    启动/更新/重启nuxt项目步骤1、本地电脑打包生成nuxt文件夹2、压缩nuxt文件夹后上传到服务器3、替换掉服务器上旧的nuxt文件夹..3.1、建议备份服务器上的nuxt文件夹,不做删除操作,只重命名下mvnuxtnuxt20240310//重命名nuxt文件夹为nuxt20240310..3.2、......
  • 简单部署syslog日志服务
    服务yum-yinstallrsyslogvi/etc/rsyslog.conf$ModLoadimudp$UDPServerRun514####endoftheforwardingrule###$templateIpTemplate,"/var/log/syslog/%FROMHOST-IP%/%$year%-%$month%-%$day%.log.log"*.*?IpTemplatesystemctlrestartrsyslo......