Nginx平滑升级和location案例

本文详细介绍了Nginx的平滑升级步骤,包括获取编译参数、下载新模块、重新编译、备份与覆盖原程序。同时,讲解了location的配置案例,用于根据客户端请求URI进行匹配处理,实现访问控制等功能。通过设置不同修饰符,调整匹配优先级,确保高效路由。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平滑升级

平滑升级的步骤
1、获取之前的编译参数
2、下载新模块
3、重新编译软件,加上–add-module=新模块的解压路径
4、停止服务并备份原程序
5、把源程序用新程序覆盖
6、启动新程序

部署nginx

创建nginx服务用户

[root@nginx ~]# useradd -r -M -s /sbin/nologin nginx
[root@nginx ~]# id nginx 
uid=975(nginx) gid=974(nginx) 组=974(nginx)

安装依赖环境

[root@nginx ~]# dnf -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make
[root@nginx ~]# dnf -y groups mark install 'Development Tools'
上次元数据过期检查:0:13:17 前,执行于 2022年10月09日 星期日 23时39分57秒。
依赖关系解决。
=============================================================================================================
 软件包                   架构                    版本                        仓库                      大小
=============================================================================================================
安装组:
 Development Tools                                                                                          

事务概要
=============================================================================================================

完毕!

创建日志存放目录

[root@nginx ~]# cd /var/log/
[root@nginx log]# mkdir nginx
[root@nginx log]# chown -R nginx.nginx /var/log/nginx/
[root@nginx log]# ll /var/log/ | grep nginx
drwxr-xr-x  2 nginx  nginx        6 10月  9 23:54 nginx

安装nginx

[root@nginx ~]# cd /usr/local/
[root@nginx local]# wget http://nginx.org/download/nginx-1.22.0.tar.gz
--2022-10-09 23:59:20--  http://nginx.org/download/nginx-1.22.0.tar.gz
正在解析主机 nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5702::6, ...
正在连接 nginx.org (nginx.org)|3.125.197.172|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1073322 (1.0M) [application/octet-stream]
正在保存至: “nginx-1.22.0.tar.gz”

nginx-1.22.0.tar.gz         100%[========================================>]   1.02M   401KB/s  用时 2.6s    

2022-10-09 23:59:24 (401 KB/s) - 已保存 “nginx-1.22.0.tar.gz” [1073322/1073322])
[root@nginx local]# tar xf nginx-1.22.0.tar.gz -C /usr/local/src/
[root@nginx local]# cd /usr/local/src/
[root@nginx src]# ls
nginx-1.22.0
[root@nginx src]# cd nginx-1.22.0/
[root@nginx nginx-1.22.0]# ./configure \
 --prefix=/usr/local/nginx \
 --user=nginx \
 --group=nginx \
 --with-debug \
 --with-http_ssl_module \
 --with-http_realip_module \
 --with-http_image_filter_module \
 --with-http_gunzip_module \
 --with-http_gzip_static_module \
 --with-http_stub_status_module \
 --http-log-path=/var/log/nginx/access.log \
 --error-log-path=/var/log/nginx/error.log
[root@nginx nginx-1.22.0]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install

配置环境变量

[root@nginx ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile
[root@nginx ~]# . /etc/profile

服务控制方式,使用nginx命令
    -t  //检查配置文件语法
    -v  //输出nginx的版本
    -c  //指定配置文件的路径
    -s  //发送服务控制信号,可选值有{stop|quit|reopen|reload

启动服务

[root@nginx ~]# nginx 
[root@nginx ~]# ss -antlp
State         Recv-Q        Send-Q               Local Address:Port                 Peer Address:Port        Process                                                                                                      
LISTEN        0             128                        0.0.0.0:111                       0.0.0.0:*            users:(("rpcbind",pid=904,fd=4),("systemd",pid=1,fd=35))                                                    
LISTEN        0             128                        0.0.0.0:80                        0.0.0.0:*            users:(("nginx",pid=25434,fd=9),("nginx",pid=25433,fd=9))                                                   
LISTEN        0             32                   192.168.122.1:53                        0.0.0.0:*            users:(("dnsmasq",pid=1790,fd=6))                                                                           
LISTEN        0             128                        0.0.0.0:22                        0.0.0.0:*            users:(("sshd",pid=983,fd=4))                                                                               
LISTEN        0             5                        127.0.0.1:631                       0.0.0.0:*            users:(("cupsd",pid=1132,fd=10))                                                                            
LISTEN        0             128                           [::]:111                          [::]:*            users:(("rpcbind",pid=904,fd=6),("systemd",pid=1,fd=37))                                                    
LISTEN        0             128                           [::]:22                           [::]:*            users:(("sshd",pid=983,fd=6))                                                                               
LISTEN        0             5                            [::1]:631                          [::]:*            users:(("cupsd",pid=1132,fd=9))                                                                             

获取之前安装nginx的编译参数

[root@nginx ~]# nginx -V
nginx version: nginx/1.22.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-15) (GCC) 
built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

下载新模块
https://github.com/openresty/echo-nginx-module
下载到本地,然后上传到nginx服务器中

[root@nginx ~]# ls 
 anaconda-ks.cfg	        initial-setup-ks.cfg	      echo-nginx-module-master.zip 

重新编译软件
安装unzip工具

[root@nginx ~]# yum -y install unzip
解压新的模块包
[root@nginx ~]# unzip echo-nginx-module-master.zip
再次解压nginx源码包
tar -zxf nginx-1.22.0.tar.gz
[root@nginx ~]# ls
视频  anaconda-ks.cfg  echo-nginx-module-master  echo-nginx-module-master.zip  initial-setup-ks.cfg  nginx-1.22.0  nginx-1.22.0.tar.gz

添加新的模块进行编译安装

[root@nginx nginx-1.22.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--add-module=../echo-nginx-module-master

查看objs目录下没有nginx程序

[root@nginx nginx-1.22.0]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  Makefile  man  objs  README  src
[root@nginx nginx-1.22.0]# ls objs/
addon  autoconf.err  Makefile  ngx_auto_config.h  ngx_auto_headers.h  ngx_modules.c  src

使用make编译

[root@nginx nginx-1.20.0]# mak

编译完成之后再次进行查看objs目录下是否有nginx程序

[root@nginx nginx-1.22.0]# cd objs/
[root@nginx objs]# ls
addon  autoconf.err  Makefile  nginx  nginx.8  ngx_auto_config.h  ngx_auto_headers.h  ngx_modules.c  ngx_modules.o  src

备份源程序并停止、覆盖、启动服务
先查看升级前和升级后的版本区别,主要看编译参数
升级前

[root@nginx nginx-1.22.0]# nginx -V
nginx version: nginx/1.22.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-15) (GCC) 
built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

升级后

[root@nginx nginx-1.22.0]# objs/nginx -V
nginx version: nginx/1.22.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-15) (GCC) 
built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --add-module=../echo-nginx-module-master
[root@nginx nginx-1.22.0]# 

停止、备份、覆盖、启动程序

停止服务
[root@nginx nginx-1.22.0]# nginx -s stop
备份
[root@nginx nginx-1.22.0]# cp /usr/local/nginx/sbin/nginx /opt/
覆盖
[root@nginx nginx-1.22.0]# cp objs/nginx /usr/local/nginx/sbin/ 
cp:是否覆盖'/usr/local/nginx/sbin/nginx'? y
启动服务
[root@nginx nginx-1.22.0]# /usr/local/nginx/sbin/nginx
查看端口
[root@nginx nginx-1.22.0]# ss -antl
State                 Recv-Q                Send-Q                                Local Address:Port                                 Peer Address:Port                Process                
LISTEN                0                     128                                         0.0.0.0:111                                       0.0.0.0:*                                          
LISTEN                0                     128                                         0.0.0.0:80                                        0.0.0.0:*        

查看nginx信息

[root@nginx nginx-1.22.0]# nginx -V
nginx version: nginx/1.22.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-15) (GCC) 
built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --add-module=../echo-nginx-module-master

测试–引用echo模块

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
//修改location参数内容就行
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
                echo "niuma";
        }

使用nginx -t 检查配置文件内容

[root@nginx nginx-1.22.0]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

重载nginx

[root@nginx nginx-1.22.0]# nginx -s reload

使用浏览器访问,发现浏览器无法支持echo模块,会当成文件进行下载
使用命令进行访问 win+r
cmd
在这里插入图片描述

location案例

location区段,通过指定模式来与客户端请求的URI相匹配
功能:
允许根据用户请求的URI来匹配定义的各个location,匹配时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能
语法:
location [修饰符] pattern {…}

修饰符说明
=精确匹配
~正则表达式模式匹配,区分大小写
~*正则表达式模式匹配,不区分大小写
^~前缀匹配,类似于无修饰符的行为,也是以指定模块开始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正则表达式
@定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_files或者error_page等

比较带有“=”的和没有修饰符的精确匹配优先级

        location / {
               echo "niuma1";

        }
           location =  / {
               echo "niuma2";

        }
[root@nginx conf]# nginx -s reload     

在这里插入图片描述
比较带有“~”的和“=”优先级

        location  ~ / {
               echo "niuma3";

        }
           location =  / {
               echo "niuma2";

        }
[root@nginx conf]# nginx -s reload     

在这里插入图片描述
比较带有“~”的和没有修饰符的精确匹配优先级

        location / {
               echo "niuma1";

        }
           location ~ / {
               echo "niuma3";
        }
[root@nginx conf]# nginx -s reload    

在这里插入图片描述
比较带有“~”的和带有“^~”修饰符的匹配优先级

          location ~ / {
               echo "niuma3";
        }
         location  ^~ / {
               echo "niuma4";
        }
[root@nginx conf]# nginx -s reload    

在这里插入图片描述
比较带有“~”的和带有“~*”修饰符的匹配优先级

     location ~ / {
               echo "niuma3";

        }
        location  ~* / {
               echo "niuma5";
        }
[root@nginx conf]# nginx -s reload 

在这里插入图片描述
比较没有修饰符的精确匹配和带有“~*”`修饰符的匹配优先级

     location  / {
               echo "niuma1";

        }
        location  ~* / {
               echo "niuma5";
        }
[root@nginx conf]# nginx -s reload 

在这里插入图片描述
查找顺序和优先级:由高到低
1、带有“=”的精确匹配优先
2、正则表达式按照他们在配置文件中定义的顺序
3、带有“^~”修饰符的,开头匹配
4、带有~或者~*修饰符的,如果正则表达式与URI匹配
5、没有修饰符的精确匹配

修饰符优先级 高--->低
location = 路径
location ^~ 路径
location ~ 正则
location ~* 正则
location 路径

<think>好的,我现在需要解决用户的问题,他在配置Nginx时遇到了错误:“nginx: [emerg] duplicate location "/"”。用户可能是在配置Nginx的server块时,不小心在同一个server块里定义了两个或多个相同的location "/"块。我的任务是帮助他理解错误的原因,并提供解决方法。 首先,我得回顾一下Nginx的配置结构。Nginx的配置文件通常包含多个server块,每个server块对应一个虚拟主机。在server块内部,会有多个location块,用来匹配不同的请求URI。location的匹配规则可以是前缀匹配或正则匹配。每个server块中,同一个location路径只能出现一次,否则Nginx在解析配置文件时会报重复的错误。 用户的问题提示在同一个server块中存在重复的location "/"。接下来,我需要考虑用户可能的配置错误场景。例如,用户可能在配置中不小心复制粘贴了location "/"块,或者在多个配置文件中包含了相同的location定义。或者,用户可能使用了include指令导入了其他配置文件,导致重复。 接下来,我需要给出具体的解决步骤。首先,用户需要检查Nginx的配置文件,找到重复的location "/"块。这可能涉及查看主配置文件(如nginx.conf)以及包含的其他配置文件(如sites-enabled目录下的文件)。用户可以使用文本编辑器搜索“location / {”来定位重复的位置。 然后,用户需要删除或合并重复的location块。如果两个location块有不同的指令,可能需要将它们的配置合并到一个块中,避免重复。例如,一个location "/"可能配置了root,另一个配置了proxy_pass,需要将它们整合到一起。 另外,还需要注意Nginx的配置语法是否正确,比如每个location块是否有正确的结束大括号,避免因为语法错误导致解析混乱。用户可以使用nginx -t命令来测试配置文件的语法是否正确,这有助于快速定位问题。 此外,用户可能在多个server块中定义了相同的location "/",但如果在不同的server块中,只要端口或server_name不同,可能不会冲突。但如果在同一个server块中重复,就会报错。因此,需要确认重复的location是否在同一个server块内。 最后,用户需要重新加载Nginx配置,使更改生效。可以使用nginx -s reload命令来平滑重载配置,而不中断服务。 总结起来,解决步骤包括检查配置文件,定位重复的location块,合并或删除重复的配置,测试语法,并重新加载服务。同时,提醒用户注意配置的结构语法,避免未来再次出现类似问题。</think>当Nginx报错 `nginx: [emerg] duplicate location "/"` 时,表示配置文件中存在**重复的`location "/"`定义**。以下是问题分析解决方法: --- ### 一、问题原因 1. **直接重复**:同一个`server{}`块内定义了多个`location /` ```nginx server { listen 80; location / { ... } # 第1个 location / { ... } # 第2个(错误根源) } ``` 2. **间接重复**:通过`include`指令加载了多个含相同`location /`的子配置文件 ```nginx server { include /path/to/config/*.conf; # 多个子文件都含location / } ``` 3. **正则冲突**:混合使用普通匹配正则匹配导致覆盖 ```nginx location / { ... } # 普通匹配 location ~ ^/.*$ { ... } # 正则匹配覆盖了所有路径(可能引发冲突) ``` --- ### 二、解决方法 #### ▶ 步骤1:定位重复位置 使用命令快速查找重复项: ```bash grep -n "location / {" /etc/nginx/conf.d/*.conf /etc/nginx/nginx.conf ``` #### ▶ 步骤2:合并或删除重复配置 - **场景1:相同路径不同配置** ```nginx # ❌ 错误写法 location / { root /var/www/html; } location / { proxy_pass http://backend; } # ✅ 正确写法(合并功能) location / { root /var/www/html; proxy_pass http://backend; # 注意:rootproxy_pass通常不混用,此处仅为示例 } ``` - **场景2:误复制配置块** ```nginx # ❌ 错误写法(重复定义) location / { ... } location / { ... } # ✅ 正确写法(保留一个) location / { ... } ``` #### ▶ 步骤3:检查嵌套包含 若使用`include`指令,需确保子配置文件不重复: ```nginx # 主配置文件 server { include /etc/nginx/conf.d/locations/*.conf; # 检查子文件是否含重复location / } ``` #### ▶ 步骤4:验证并重载 ```bash nginx -t # 测试配置语法 nginx -s reload # 重载生效 ``` --- ### 三、高级案例 #### 案例1:正则匹配优先级冲突 ```nginx location /api/ { ... } # 前缀匹配 location ~ ^/api/.*$ { ... } # 正则匹配(覆盖前者) ``` **解决方案**:明确优先级或使用`^~`修饰符: ```nginx location ^~ /api/ { ... } # 强制前缀优先 ``` #### 案例2:反向代理与静态资源共存 ```nginx location / { try_files $uri $uri/ @proxy; # 先找静态文件,不存在则转发 } location @proxy { proxy_pass http://backend; } ``` --- ### 四、关键原则 1. **唯一性**:每个`server{}`块内,同一URI路径只能有一个`location`匹配 2. **优先级顺序**: ``` 精确匹配(=) → 前缀匹配(^~) → 正则匹配(~) → 普通前缀匹配 ``` 3. **模块化设计**:使用`include`拆分配置时,需保证逻辑不重叠 --- 通过以上步骤,可彻底解决`duplicate location "/"`错误,并优化Nginx配置结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值