Nginx踩坑指南

这篇具有很好参考价值的文章主要介绍了Nginx踩坑指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 官方操作手册

参考链接:http://nginx.org/en/linux_packages.html

2.nginx常用命令


# 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务
nginx -s stop
# 平稳关闭Nginx,保存相关信息,有安排的结束web服务
nginx -s quit
# 因改变了Nginx相关配置,需要重新加载配置而重载
nginx -s reload
# 重新打开日志文件
nginx -s reopen
# 为 Nginx 指定一个配置文件,来代替缺省的
nginx -c filename
# 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件
nginx -t
#  显示 nginx 的版本
nginx -v
# 显示 nginx 的版本,编译器版本和配置参数
nginx -V
# 格式换显示 nginx 配置参数
2>&1 nginx -V | xargs -n1
2>&1 nginx -V | xargs -n1 | grep lua

3. 相关问题

3.1 问题1

nginx: [emerg] "server" directive is not allowed here in /etc/nginx/nginx.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed

答案:
这不是一个nginx配置文件,而是一个vhost配置文件,应该放在/etc/nginx/conf.d(或者/etc/nginx/sites-enabled,如果您喜欢这种类型的vhost配置文件组织;请查看sites-available与sites-enabled与conf.d目录thread在ServerFault中的差异,以找出差异)。您可以在nginx GitHub镜像中检查整个nginx配置文件示例。

这些vhost配置文件通常包含在http配置级别的主配置文件中:

http {
    ...
    include /etc/nginx/conf.d/*.conf;
}

Debian-based包(或使用这些sites-enabled/sites-available目录的任何其他包)在那里还有一行:

http {
    ...
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

要查找特定Ubuntu发行版的nginx.conf原始文件,请下载相应的nginx-common包并检查其内容。

3.2 问题2

在使用nginx反向代理POST请求的时候,错误配置情况

location /sms/sendSmsLocal/ {
  proxy_pass http://localhost:10086/sms/sendSmsLocal/;
}

这样配置会出现的问题

原本发出的请求是POST请求,经过nginx转发以后就会变成GET请求
原本POST请求携带的请求体经过转发以后会丢失,正确配置代理POST请求

location /sms/sendSmsLocal {
  proxy_pass http://localhost:10086/sms/sendSmsLocal;
  proxy_redirect off;
}

location 后边跟的路径不要以 / 结尾
由于nginx代理会将我们的请求拦截后在做一次重定向,在这个过程中我们的请求携带的请求体就会丢失,解决办法就是屏蔽掉转发 通过 proxy_redirect off; 可以解决

3.3 Nginx中proxy_pass末尾带斜杠/和不带的区别

1、proxy_pass末尾无斜杠
nginx配置proxy_pass时url末尾带/不带/的区别如下:

注意:当location为正则表达式匹配模式时,proxy_pass中的url末尾是不允许有/的,因此正则表达式匹配模式不在讨论范围内。

proxy_pass配置中url末尾带/时,nginx转发时,会将原uri去除location匹配表达式后的内容拼接在proxy_pass中url之后。

测试地址:http://192.168.171.129/test/tes.jsp

场景一:

location ^~ /test/ {
 proxy_pass http://192.168.171.129:8080/server/;
}

代理后实际访问地址:http://192.168.171.129:8080/server/tes.jsp

场景二:

location ^~ /test {
 proxy_pass http://192.168.171.129:8080/server/;
}

代理后实际访问地址:http://192.168.171.129:8080/server//tes.jsp

场景三:

location ^~ /test/ {
 proxy_pass http://192.168.171.129:8080/;
}

代理后实际访问地址:http://192.168.171.129:8080/tes.jsp

场景四:

location ^~ /test {
 proxy_pass http://192.168.171.129:8080/;
}

代理后实际访问地址:http://192.168.171.129:8080//tes.jsp

proxy_pass配置中url末尾不带/时,如url中不包含path,则直接将原uri拼接在proxy_pass中url之后;如url中包含path,则将原uri去除location匹配表达式后的内容拼接在proxy_pass中的url之后。

测试地址:http://192.168.171.129/test/tes.jsp

场景一:

 location ^~ /test/{
 proxy_pass http://192.168.171.129:8080/server;
 }

代理后实际访问地址:http://192.168.171.129:8080/servertes.jsp

场景二:

location ^~ /test {
 proxy_pass http://192.168.171.129:8080/server;
}

代理后实际访问地址:http://192.168.171.129:8080/server/tes.jsp

场景三:

location ^~ /test/ {
 proxy_pass http://192.168.171.129:8080;
}

代理后实际访问地址:http://192.168.171.129:8080/test/tes.jsp

场景四:

location ^~ /test {
 proxy_pass http://192.168.171.129:8080;
}

代理后实际访问地址:http://192.168.171.129:8080/test/tes.jsp

总体流程如下:

名词解释
url:proxy_pass中地址
uri: 原始请求地址

3.4 问题4

问题描述:

安装完nginx后,执行/usr/sbin/nginx -s reload 报错: nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)
原因:
由于没有nginx.pid 文件,当每一次安装或每次当我们停止nginx时(nginx -s stop) ,nginx 会把 /usr/local/var/run/ 路径下名为nginx.pid 的文件删掉,所以重启会报没有这个文件导致起不来。

解决方案

# 执行nginx -t确认nginx配置文件路径。
[root@node-03 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 指定conf文件重新生成。
[root@node-03 conf.d]# nginx -c /etc/nginx/nginx.conf
# 重新执行正常
[root@node-03 conf.d]# nginx -s reload

4.正则匹配

= :进行普通字符精确匹配,也就是完全匹配。
^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。
~ :区分大小写的匹配。
~* :不区分大小写的匹配。
!~ :区分大小写的匹配取非。
!~* :不区分大小写的匹配取非。

4.1 优先级

Nginx踩坑指南

4.2 示例

(1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location  /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。
 
(2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但若后面是正则表达式会和最长字符串优先匹配(最长匹配)
 
(3)location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条
 
(4)location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条
 
(5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
 
(6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
 
(7)location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在
 
(8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条
 
(9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高

4.3 常用正则表达式

^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“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] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符

参考资料
https://blog.csdn.net/qq_20147683/article/details/125501184
https://mp.weixin.qq.com/s/XoqGvYBabW8YBl9xEeNYZw
https://www.5axxw.com/questions/content/ndyexm
http://www.huazhaox.com/article/908
https://blog.csdn.net/lihefei_coder/article/details/121033283
https://www.yingsoo.com/news/servers/45036.html文章来源地址https://www.toymoban.com/news/detail-475664.html

到了这里,关于Nginx踩坑指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux操作手册

    开机关机 指令 shutdown -h now 立刻进行关机 shutdown -h num num分钟后执行关机 shutdown -r now 现在重启计算机 halt 关机 rebboot 重启计算机 sync 把内存的数据同步到磁盘 注意事项 无论是重启还是关闭系统,都必须先执行 sync ,将内存中的数据写到磁盘中 用户登录注销 指令 su - 用户名

    2024年02月03日
    浏览(39)
  • ArcGIS入门操作手册

    参考本人博客:保姆级Arcgis安装图文安装教程_追忆苔上雪的博客-CSDN博客 打开软件,右侧搜索栅格计算器打开,要是搜索栏不小心叉掉找不到了,可以通过ctrl+f调出搜索框  若是打不开栅格计算器,选择自定义,扩展模块 把这些模块都勾选上就好了  计算开始前还有一个设

    2024年02月12日
    浏览(40)
  • Gerrit 使用操作手册

    一、Gerrit简介 Gerrit 是一种免费、开源的代码审查工具,使用网页交互页面。这个软件的名称来自于荷兰设计师师赫里特·里特费尔德(Gerrit Rietveld),作者为Google公司的Shawn Pearce。它使用Git作为底层版本控制系统,相比于其他的代码管理工具,Gerrit明显的特色是代码审核。利

    2024年02月02日
    浏览(67)
  • Veeam 备份还原操作手册

      目录 一、安装BakupReplication 1.1 选择-Backup Replication 1.2 选择Install安装 二、添加VC主机 2.1 VMWARE VSPHERE 添加 2.2 VC主机名 2.3 用户认证 三、配置存储 3.1 新建存储 3.2 设置存储的路径 四、备份 4.1 虚拟机的整机备份 4.1.1 选择新建备份任务 4.1.2 选择备份的的主机 4.1.3 选择备份的位

    2024年02月04日
    浏览(94)
  • visual c++操作手册

    第一部分 结构化程序设计(可以将 C 语言程序设计引入此处,新建文件的类型如图 1-2 中所列,其他操作如同 visual c++2008 ) 1.用Visual C++开发第一个简单C程序 首先,在磁盘上新建一个文件夹,用于存放C程序,文件夹的名字可以是ex1-1,如 D:mycex1-1。 编程示例,在屏幕上显

    2024年02月10日
    浏览(39)
  • 【CICD】Jenkins 常用操作手册

    词汇 说明 Node 作为 Jenkins 环境的一部分并能够执行Pipeline或项目的机器,无论是 Master 还是Agent 都被认为是 Node。 Master 存储配置,加载插件以及为 Jenkins 呈现各种用户界面的主控节点 Agent 通常是一台主机或容器,连接到 Jenkins 主控节点,并执行主控节点下发的任务 Executor 节

    2024年03月19日
    浏览(40)
  • 百度飞桨 paddleX操作手册

    新建项目 步骤1 、点击新建项目,根据新建项目弹窗进行信息填写名称、描述、选择任务类型、选着工作路径后创建。 步骤2 、创建后选择数据集,这里的数据选项在 数据集管理/我的数据集 模块中创建,选择完成后即点击下一步,该处提供了对数据集的预览按钮,点击查看

    2024年02月05日
    浏览(62)
  • 大数据开源部署的操作手册

    大数据开源部署的操作手册 一、准备阶段 需求分析:明确业务需求,确定所需的大数据组件及其功能。 环境评估:评估服务器硬件资源,包括CPU、内存、存储和网络带宽。 版本选择:根据需求和兼容性要求,选择合适的开源大数据组件版本。 二、部署阶段 安装Java:确保系

    2024年01月25日
    浏览(37)
  • 【操作手册】如何注册申请文心一言

    一、引言 随着人工智能的快速发展,语言模型的应用越来越广泛。文心一言是一款基于深度学习技术的语言模型,能够为用户提供智能问答、文本生成、机器翻译等服务。本文将详细介绍如何注册申请文心一言账号,并使用该服务。 二、注册前的准备 在注册前,请确保您已

    2024年02月10日
    浏览(37)
  • Python Selenium/WebDriver 操作手册新版

    写在前面:本文为个人整理手册,有错误的地方欢迎指正,参考链接较多,重点参考,侵权删 通俗的解释: 引用:Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运

    2024年02月01日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包