Nginx学习笔记一

nginx学习笔记(一)

下载源代码后,解压缩

./configure
make
make install //默认路径安装nginx

可以查看新产生的文件,在 /usr/local/nginx目录中,如下所示

-conf //配置文件,如果没有显示的指定目录,在configure文件中会通过 --conf-path=PATH指定配置文件目录
-html   //帮助文档
-logs   //存放日志文件
-sbin   //可执行的二进制文件,nginx启动的二进制文件nginx就存放在该目录

源代码 make 之后,会生成 objs 目录,在该目录中,autoconf.err里面记录了执行 configure 时所作的操作,验证 linux 系统中的某些环境时,在 autoconf.err 中,会看到是通过编译一段C代码来实现的。

root用户下启动nginx,否则会有权限问题,出现 Permission denied 的错误信息。首先配置 nginx的环境路径,在/etc/profile 或者~/.bashrc文件中添加环境变量PATH

export PATH=$PATH:/usr/local/nginx/sbin

命令方式操作nginx

(1) 默认方式启动nginx
nginx
因为配置好了环境变量,系统能够通过PATH中的路径找到nginx的二进制可执行文件,执行时,读取默认路径下的配置文件,即/usr/local/nginx/conf目录

(2) 另行指定配置文件的启动方式,使用 -c 选项
nginx -c /tmp/nginx.conf,nginx启动时,通过读取/tmp/nginx.conf配置文件来启动nginx

(3) 另行指定全局配置项的启动方式,使用 -g 选项
nginx -g “pid /var/nginx/test.pid;”,nginx启动后会将pid写入/var/nginx/test.pid 文件中
-g 选项的约束条件是指定的配置文件参数不能与默认路径下的nginx.conf配置文件参数相冲突,否则无法启动,比如:pid logs/nginx.conf 这样的配置,是不能存在于默认的配置文件nginx.conf中的
另一个约束条件是,以-g 选项启动的nginx服务,执行其他命令时,需要把 -g 参数也带上,否则可能出现配置项不匹配的情况,比如停止 nginx 服务
  nginx -g “pid /var/nginx/test.pid;” -s stop,如果不加上 -g “pid /var/nginx/test.pid” 参数,可能会出现找不到pid,服务无法停止的情况

(4) 测试配置信息是否有误,测试 /usr/local/nginx/conf/nginx.conf 配置文件
nginx -t
nginx -t -q // -q 选项可以不将 error 级别以下的信息输出到屏幕上

(5) 显示版本信息
nginx -v
nginx -V // 显示编译阶段的参数

(6) 快速停止服务
使用 -s stop 可以强制停止nginx服务,-s 参数其实是告诉nginx程序向正常运行的nginx服务发送信号,nginx 程序通过 nginx.pid 文件中得到的master进程的pid,向运行中的 master 进程发送 TERM 信号来快速的关闭nginx服务。如:
nginx -s stop
实际上,通过 kill 命令直接向 nginx master 进程发送 SIGKILL 或者 SIGINT 信号,效果是一样的。

(7) “优雅”的停止nginx服务
nginx -s quit
强制停止服务 nginx -s stop ,worker 进程和 master 进程在收到信号之后,会立刻跳出循环,退出进程。“优雅”的停止服务 nginx -s quit,首先会关闭监听端口,停止接收新的连接,然后把正在处理的连接全部处理完之后再退出进程。
通过向master进程发送 SIGQUIT 信号停止服务,与 -s quit 参数停止服务达到的效果是相同的。
“优雅”的停止某个 worker 进程,通过向该 worker 进程发送 WINCH 信号来实现
kill -s -SIGWINCH [nginx worker pid]

(8) 使运行中的 nginx 重读配置项并生效
nginx -s reload //是运行中的 nginx 服务重新读取 nginx.conf 文件。nginx首先会检查 nginx.conf 配置是否正确,然后以“优雅”的方式关闭nginx服务,在重新加载 nginx.conf 启动nginx服务,-s 选项即发送信号,也可以使用一下方式直接发送SIGHUP 信号
kill -s SIGHUP [nginx master pid]

(9) 日志文件回滚
nginx -s reopen
kill -s -SIGUSER1 [nginx master pid]
这样可以先把当前日志重命名或者转移到其他目录中进行备份,重新打开时就会生成新的日志文件。这样单个日志文件就不会过大。

(10) nginx 平滑升级
当nginx服务升级时,通常需要替换原有的二进制文件nginx,一般是要重新启动服务的,但是nginx支持不重启服务就能够完成新版本的平滑升级。

升级时包括以下步骤:
1) 通知旧版本的 nginx 准备升级,可通过向旧版本的 master 进程发送 SIGUSER2 信号
kill -s SIGUSER2 [nginx master pid]
这是,运行中的 nginx 会将记录 master 进程pid的文件重命名,例如将 /usr/local/nginx/logs/nginx.pid 重命名成 /usr/local/nginx/logs/nginx.pid.oldbin,这样新版本的 nginx 才可能重启成功。
2) 启动新版本的 nginx,可以使用上面介绍的任何一种启动方法。这时可以通过ps查看nginx服务,会发现新版本和旧版本的nginx服务同时在运行。
3) 通过 kill 命令向旧版本的 master 进程发送 SIGQUIT 信号,以“优雅”的方式停止旧版本的nginx服务,此时,就只有新版本的 nginx 服务在运行。平滑升级任务完成。

(11) 显示命令行帮助
nginx -h
nginx -?


Questions

一、 当启动nginx时,通过ps命令查看


ps -ef | grep -v grep | grep nginx
查看结果如下: 
root      5275     1  0 23:29 ?        00:00:00 nginx: master process nginx 
nobody    5276  5275  0 23:29 ?        00:00:00 nginx: worker process 

发现master进程以 root 用户权限运行,但是启动的从属进程 worker 进程却是 nobody 用户,这是为什么?
答:这东西是系统用户,一个特殊用途的用户 ID 。一般来说 uid < 500 的都是系统 ID

grep nobody /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin

Linux 系统为了安全,很多操作和服务的运行都不是运行在 root 用户下面的,而是一个专用的 ID ,这个 ID 一般就是 nobody ,这样就可以把每个服务运行的情况隔离出来。保证不会因为服务器程序的问题而让服务器程序成了黑客的直接操作源(黑客拿下了服务器程序,也仅仅是 nobody 用户而不是 root 用户,还要进行提权才行)。同时也不会影响其他用户的数据。
服务器程序提权有专用的办法来防止恶意使用的。

除了 nobody ,常见的还有 ftp 、ssh 什么的。有的不是用来跑服务,而是用来占坑,主要是用用户组的权限管理进行权限设置,这个时候会有一个占坑用的同名 ID 加入到用户组。这种情况好像主要是为了兼容。

二、 passwd文件,问什么使用passwd命令能够修改该文件?
答:文件的详细属性都保存在struct stat中,

struct stat {
   dev_t st_dev; /* ID of device containing file */
   ino_t st_ino; /* inode number */
   mode_t st_mode;/* protection */
   nlink_t   st_nlink;   /* number of hard links */
   uid_t st_uid; /* user ID of owner */
   gid_t st_gid; /* group ID of owner */
   dev_t st_rdev;/* device ID (if special file) */
   off_t st_size;/* total size, in bytes */
   blksize_t st_blksize; /* blocksize for file system I/O */
   blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
   time_t st_atime;   /* time of last access */
   time_t st_mtime;   /* time of last modification */
   time_t st_ctime;   /* time of last status change */
   };

其中st_mode属性,file type or mode (permission)

S_ISUID 0004000 set UID bit
S_ISGID 0002000 set-group-ID bit

以上的值为8进制

在linux中,与每个进程关联的ID有6个或者更多,如下表所示

实际用户ID
实际组ID
我们实际是谁
有效用户ID(effective User ID)
有效组ID
附加组ID
用于文件权限检查
保存的设置用户ID
保存的设置用户组ID
由exec函数保存

有效用户ID以及附加组ID决定了文件的访问权限,一般情况下,有效用户ID=实际用户ID, 有效组ID=实际组ID

st_mode属性中,S_ISGIDset-group-ID bit,对于目录:在该目录中创建的文件继承的组ID为该目录的组ID,而不是创建该文件的的进程的组ID,而且该目录下创建的文件的st_mode属性也为S_IS_GID。 对于文件:当执行此文件时,将进程的有效用户组ID设置为文件的有效组ID,进程的有效用户ID设置为文件的有效用户ID。

所以,回答上面的问题,因为/etc/passwd文件的有效用户ID和有效组ID是root权限,当/bin/passwd执行时,shell首先会调用/bin/passwd程序,该程序是一个设置用户ID的程序,即设置文件的属性st_modeS_ISUIDS_ISGID,普通用户执行passwd命令,shell的权限会变成root,所以能够修改/etc/passwd文件。

本文主要参考文件: 《深入理解Nginx模块开发与架构解析》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫步旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值