> 文章列表 > 【Web服务】攻坚克难nginx的一天(一)

【Web服务】攻坚克难nginx的一天(一)

【Web服务】攻坚克难nginx的一天(一)

端口号443是TCP/IP协议中预留的端口号,通常用于HTTPS(安全的HTTP)通信。HTTPS是在HTTP基础上加入了SSL/TLS协议进行加密的一种网络传输协议,它使用443端口来建立加密连接并保证数据传输的安全性。因此,许多网站的安全性都依赖于443端口的运行。

nohup

在后台运行,并忽略所有的挂起信号,包括SIGHUP

nohup command-to-run &> output-file &

在需要对标准输出和错误输出进行不同的处理时:

./myscript.sh > output-file 2>&1 | mail -s "Error in myscript" admin@example.com

捕捉trap:
for.sh

trap  "echo i am busy"  1  2 9 15
for i in {1..100}
doecho $isleep 1
done

trap 诱捕信号的
9号信号不能屏蔽,内核直接杀死进程,SIGKILL信号

完整的动态添加第三方模块的步骤

1.下载第三方模块源代码并将其解压缩:

$ wget https://github.com/third-party-module/archive/master.zip
$ unzip master.zip

2.在 Nginx 源代码根目录下运行 ./configure 命令,并添加 --with-compat 和 --add-dynamic-module 选项来启用支持动态模块加载以及指定要加载的模块:

$ cd path/to/nginx/source/
$ ./configure --with-compat --add-dynamic-module=/path/to/third-party-module

3.使用 make 命令编译 Nginx:

$ make

4.在 Nginx 配置文件中添加 load_module 指令,该指令用于动态加载第三方模块。例如,如果要加载名为 ngx_http_hello_module 的模块,则可以在配置文件中添加如下行:

load_module modules/ngx_http_hello_module.so;

5.重新加载 Nginx 的配置:

$ nginx -s reload

现在您已经成功地动态添加了第三方模块,并且不需要停机即可使用新功能。请注意,在重新加载 Nginx 配置后,Nginx 将会开始使用新添加的模块。

关于编译nginx时对–user的理解

在编译Nginx时指定–user参数是为了安全起见。如果您不指定该参数,那么Nginx将以root用户身份运行。这会导致任何可能的漏洞或攻击都具有root权限,并且可以对系统进行非常危险和破坏性的更改。

因此,建议为Nginx创建一个专门的用户并使用该用户来运行Nginx进程。这将限制Nginx进程在系统上执行的操作,并确保不会对系统造成任何潜在的风险。

当您在创建新的用户时,一定要确保不要将其与已存在的用户重复。否则,可能会发生冲突,并使系统变得不稳定。同时,建议将该用户设置无法登录系统,以增强安全性

什么冲突?

如果您创建的新用户与现有用户具有相同的用户名或UID,则会发生冲突。这可能会导致以下情况之一:

用户名冲突:如果新创建的用户与现有用户具有相同的用户名,则可能会导致系统无法区分它们,并产生错误。例如,当您尝试使用用户名登录时,系统将无法确定要使用哪个用户账户。

UID
冲突:如果新创建的用户具有现有用户的UID,则可能会导致两个用户互相干扰,因为他们之间无法区分。这样可能会导致文件和目录权限混淆,并且对系统安全性产生影响。

因此,一定要确保在创建新用户时,用户名和UID不要与现有用户重复。这可以通过查看现有用户列表并选择未被使用的用户名和UID来解决。

nginx日志

分为以下几种级别:

debug: 最详细的日志级别,记录所有的调试信息,通常用于排查问题。

info: 默认的日志级别,记录服务器请求的基本信息,如访问时间、客户端IP地址、请求方法、请求路径等。

notice: 记录一些需要关注的事件,如出现了非常慢的请求或者请求出现了错误。

warn: 记录一些警告信息,如请求的HTTP方法不被允许或者某些配置项存在问题。

error: 记录错误信息,如请求出现了404或500等HTTP错误码。

crit: 记录严重的错误信息,如nginx无法启动或者配置文件存在语法错误。

alert: 记录需要立即处理的错误信息,如硬盘空间不足或者系统资源耗尽。

emerg: 记录系统发生了灾难性的错误,如内存耗尽或者进程崩溃。

Linux中的进程状态

Running(运行状态):进程正在CPU上运行。

Waiting(等待状态):进程在等待某些事件的发生,例如等待I/O操作完成、等待信号等。

Sleeping(睡眠状态):进程暂时不需要被调度,例如因为I/O操作而阻塞等待数据、等待进程资源等。

Stopped(停止状态):进程已经停止运行,例如通过发送SIGSTOP信号使进程停止运行。

Zombie(僵尸状态):进程已经终止但是其父进程还没有调用wait()函数来获取它的退出状态信息,导致进程在进程表中处于僵尸状态。

Dead(死亡状态):进程已经完全退出并从进程表中删除。

这些状态可以通过ps命令或者top命令查看。

nginx.conf中的http块

access.log格式

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';

如:

192.168.1.45 - - [16/Apr/2023:21:42:00 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.1.130/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.39"

这是一个Nginx配置文件中的日志格式定义,它定义了在HTTP请求被处理时生成的访问日志格式。下面是每个变量含义的解释:

$remote_addr: 客户端IP地址
$remote_user: 客户端身份验证的用户名,如果没有身份验证则为"-"
$time_local: 记录访问时间和日期的本地时间
$request: 客户端发出的请求行,包括HTTP方法、URI和协议版本
$status: HTTP响应状态码
$body_bytes_sent: 发送给客户端的字节数,不包括响应头,但包括响应正文
$http_referer: HTTP Referer头字段,即访问当前页面之前的URL
$http_user_agent: User-Agent头字段,即发送请求的浏览器或其他客户端应用程序的标识符
$http_x_forwarded_for: X-Forwarded-For头字段,如果请求经过代理服务器,则包含客户端原始IP地址
使用这种格式记录日志可以帮助开发人员跟踪和分析网站的访问情况,以及排查出现的问题

nginxWeb项目用户访问卡顿的故障排查思路

网络延迟:用户访问卡顿可能与网络延迟有关。可以使用网络诊断工具(例如ping、traceroute等)来检查网络是否存在延迟,并了解从客户端到服务器的网络延迟情况。

服务器性能:服务器性能不足也可能会导致用户访问卡顿。可以通过查看服务器的负载情况、CPU和内存使用率等性能参数,了解服务器是否存在性能瓶颈。

应用程序问题:应用程序中的代码或配置问题也可能导致用户访问卡顿。可以通过查看应用程序日志,查找错误信息来定位问题,并进一步调试和优化程序。

数据库问题:如果网站需要与数据库进行交互,那么数据库问题也可能导致用户访问卡顿。可以通过查看数据库的性能参数及运行日志,了解数据库是否存在性能瓶颈,以及是否有慢查询等问题。

网站流量过大:如果网站流量过大,服务器可能无法处理所有请求,导致用户访问卡顿。可以使用监控工具(例如Nginx自带的状态模块、Zabbix等)来查看服务器的连接数、并发请求数等情况,了解是否存在流量过大的问题。

对于网络延迟问题,可以考虑更换网络服务提供商或加入CDN;对于服务器性能问题,可以增加硬件配置或优化代码等。

文件描述符

文件描述符是一个非负整数,用于标识一个打开的文件或其他I/O资源(如网络连接、管道等)。在Unix和类Unix操作系统中,每个进程都有一张文件描述符表,其中存储了该进程打开的所有文件和资源的描述符。

文件描述符可以用于执行各种I/O操作,例如读取和写入文件、网络通信、管道通信等。通过文件描述符,程序可以与外部环境进行交互,并从外部环境获取所需的信息。

在Unix和类Unix操作系统中,几乎所有的I/O操作都使用文件描述符来完成,因此文件描述符是系统编程中非常重要的概念。