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 |
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_ISGID
,set-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_mode
为S_ISUID
和S_ISGID
,普通用户执行passwd
命令,shell
的权限会变成root
,所以能够修改/etc/passwd
文件。
本文主要参考文件: 《深入理解Nginx模块开发与架构解析》