0


Nginx 使用细节

Nginx 使用细节

一、Nginx 的工作模式

1.单进程模式

单进程模式下,Nginx 启动后只有一个进程,Nginx 的所有工作都由这个进程负责。
在这里插入图片描述
优点:

  • 单进程模式由于只有一个进程,因此可以很方便的利用 gdb 等工具进行调试。

缺点:

  • 单进程模式不支持 Nginx 的平滑升级功能,任何的信号处理都可能造成服务中断;
  • 并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。

不过后面 Nginx 已经将 Master-Worker 配置成默认的工作模式,所以并不需要担心上面的问题。

[root@localhost ~]#psaux|grepnginx|grep-vgreproot383950.00.02647047192?SsDec150:00nginx:masterprocess/usr/local/nginx/sbin/nginxroot34216890.00.029404032680?SDec240:00nginx:workerprocess

2.Master-Worker 模式

Nginx 启动后,会有一个 Master 进程和至少一个的 Worker 进程;Master 进程主要负责处理系统信号,加载配置,管理 Worker 进程等操作;而 Worker 进程则是负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是 Worker 进程。
在这里插入图片描述
优点: 稳定性高,只要还有 Worker 进程存活,就能够提供服务,并且一个 Worker 进程挂掉后,Master 进程会立即启动一个新的 Worker 进程,来保证 Worker 进程数量不变,降低服务中断的概率;同时 可以配合 Nginx 的 CPU 亲和,来充分利用多核 CPU 的优势,提升性能。

3.问题处理

前两天博主在启动 Nginx 的时候,是没有问题的,但是在访问时就不行,当时通过查看端口号,发现端口是存在的,后面使用

ps

看进程,发现只有一个

master

进程(

master

进程不会对外提供服务),最后通过查看

error.log

日志发现:

  • 是因为使用的第三方模有问题,导致 Worker 进程并未启动。

处理方案的话有两种: 第一个就是将第三方模块在配置中进行移除,第二个就是对第三方模块进行修复。

二、Nginx 代理配置

这里博主 主要介绍:Nginx 配置文件中

/

的作用,别看这个一个小小的符号,他的作用可以说 关乎到系统是否可以正常提供服务。

Nginx 配置文件中

/

的作用,主要体现在

proxy_pass

的配置上。


准备工作:

[root@PengYuYan ~]#yum-yinstallnginx[root@PengYuYan ~]#cat<<END>/etc/nginx/conf.d/Server_80.confserver{listen80;server_name127.0.0.1;root/usr/share/nginx/html;indexindex.html;location/ZhangSan/{proxy_passhttp://127.0.0.1:8080;}location/PengYuYan/{proxy_passhttp://127.0.0.1:8080/;}}END[root@PengYuYan ~]#mkdir/usr/share/nginx/html/ZhangSan[root@PengYuYan ~]#echo"This is 127.0.0.1:80 ZhangSan">/usr/share/nginx/html/ZhangSan/index.html[root@PengYuYan ~]#mkdir/usr/share/nginx/html/PengYuYan[root@PengYuYan ~]#echo"This is 127.0.0.1:80 PengYuYan">/usr/share/nginx/html/PengYuYan/index.html
[root@PengYuYan ~]#cat<<END>/etc/nginx/conf.d/Server_8080.confserver{listen8080;server_name127.0.0.1;root/www/html;indexindex.html;location/{}location/ZhangSan/{}location/PengYuYan/{}}END[root@PengYuYan ~]#mkdir-p/www/html[root@PengYuYan ~]#echo"This is 127.0.0.1:8080 /">/www/html/index.html[root@PengYuYan ~]#mkdir/www/html/ZhangSan[root@PengYuYan ~]#echo"This is 127.0.0.1:8080 ZhangSan">/www/html/ZhangSan/index.html[root@PengYuYan ~]#mkdir/www/html/PengYuYan[root@PengYuYan ~]#echo"This is 127.0.0.1:8080 PengYuYan">/www/html/PengYuYan/index.html

下面的那些

location

,你们是不需要重新配置的,因为上面的配置和下面对应。

1.带 /

location/PengYuYan/{proxy_passhttp://127.0.0.1/8080/;}

验证:

curl 127.0.0.1/PengYuYan/

在这里插入图片描述
这里博主来分解一下:

  • 我们 curl 127.0.0.1/PengYuYan/ 中的 PengYuYan 其实就是我们 80 端口的 location 配置,并不是 8080 端口上的配置;
  • 而我们正好又在 proxy_pass 代理的后面增加了个 /,就导致我们实际上访问的是 curl 127.0.0.1:8080/
  • 也就是说,我们要是如上配置,想要访问到 8080 端口的 PengYuYan,则需要 curl 127.0.0.1/PengYuYan/PengYuYan/

2.不带 /

location/ZhangSan/{proxy_passhttp://127.0.0.1/8080;}

验证:
在这里插入图片描述
这个其实很好理解,因为我们没有在

proxy_pass

后面增加

/

,所以 Nginx 会自动将

location

的目录放到

proxy_pass

后面。

总结:

  • 当我们的 proxy_pass 代理后面有 / 时,它并不会将 location 配置的目录加进去;
  • 而当我们的代理后面没有加 / 时,Nginx 便会将 location 的目录放到 proxy_pass 后面。

1) 在带有目录的情况下加

/

(修改原来的

Server_80.conf

文件即可)

location/PengYuYan/{proxy_passhttp://127.0.0.1/8080/PengYuYan/;}

验证:
在这里插入图片描述
2) 在带有目录的情况下不加

/
location/ZhangSan/{proxy_passhttp://127.0.0.1/8080/ZhangSan;}

验证:

curl 127.0.0.1/ZhangSan/

,在我们的配置上,实际上是访问的

curl 127.0.0.1:8080/ZhangSan/ZhangSan/

在这里插入图片描述
其实啊,不管是有目录和没目录,都和博主上面总结的一样。主要还是 Nginx 中的

/

在作怪。

标签: nginx 运维 linux

本文转载自: https://blog.csdn.net/weixin_46902396/article/details/117462990
版权归原作者 愿许浪尽天涯 所有, 如有侵权,请联系我们删除。

“Nginx 使用细节”的评论:

还没有评论