在Nginx简介及其安装安装完成后,我们可以看到在安装目录下有几个文件夹,如下:
这里我们可以查看下其配置文件目录
进入其中查看,首先是一个 #user nobody,指定Nginx的worker进程运行用户以及用户组,默认由nobody账号运行,这里指定的用户是需要拥有一定的权限的,不能过低,否则一些读取一些文件就没有权限去读取。
至于上面是worker进程,这个需要了解一些Nginx的基础模型,如下:
Nginx会按需同时运行多个进程:
- 一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。
- 所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。
- 主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份(user 配置项)运行。
主进程主要完成如下工作:
- 读取并验正配置信息
- 创建、绑定及关闭套接字
- 接收来自外界的信号,
- 向各worker进程发送信号(通过 kill 向进程发送信号的命令,如kill -TERM立即停止;kill -QUIT安全关闭;kill -HUP平滑重启,重新加载配置文件;kill -USR1 重新打开日志文件;kill -USR2 平滑升级可执行程序)
- 启动、终止及维护worker进程的个数,当worker进程退出后(异常情况下),会自动重新启动新的worker进程
- 无须中止服务而重新配置工作特性
- 重新打开日志文件
worker进程主要完成的任务包括:
- 接收、传入并处理来自客户端的连接
- 提供反向代理及过滤功能
- nginx任何能完成的其它任务
接下来的 worker_processes 指定Nginx要开启的进程数,这里一般配置与电脑CPU核心数相等。
这里其实还有一个 worker_rlimit_nofile 100000; 指worker进程的最大打开文件数限制,这里指最大为10万
下面紧接着的 error log 是我们的日志级别,用来定义全局错设日志文件的路径和日志名称。
日志输出级别有debug,info,notice,warn,error,crit 可供选择,其中debug输出日志最为详细,而crit(严重)输出日志最少。默认是error
而 pid 就是指Nginx启动后的进程号
event 设定Nginx的工作模式及连接数上限
- 其中参数use用来指定Nginx的工作模式(这里是epoll,epoll是多路复用IO(I/O Multiplexing)中的一种方式),nginx支持的工作模式有select,poll,kqueue,epoll,rtsig,/dev/poll,其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,对于linux系统,epoll是首选。
- worker_connection是设置nginx每个进程最大的连接数,默认是1024,所以nginx最大的连接数max_client=worker_processes * worker_connections。进程最大连接数受到系统最大打开文件数的限制,需要设置ulimit。
以上其实介绍的是对nginx全局属性的配置。nginx.conf文件下面的配置是Nginx对http服务器相关属性的设置,如下图:
其中:main为Nginx全局设置,events设定Nginx的工作模式及连接数上限 ,http服务器相关属性中可以有多个server,server中 upstream(上游服务器设置,主要为反向代理、负载均衡相关配置) ,而 location(URL匹配特定位置后的设置)。
http中的 include 对配置文件所包含文件的设定,减少主配置文件的复杂度,相当于把部分设置放在别的地方,然后在包含进来,保持主配置文件的简洁,其中mime.types其实就是在Nginx目录下的conf文件夹之中。
default_type application/octet-stream; 默认文件类型,当文件类型未定义时候就使用这类设置的。
下面的 log_format 及 access_log ,其中log_format指定Nginx日志的格式,我们可以进行自主的设置,比如我们的access_log就可以使用自定义的日志格式,access_log是用于记录访问的日志,其存在Nginx目录的logs目录之下
那么我们的日志格式可以如何设置呢,如下:
| 参数 | 含义 |
|---|---|
| $remote_addr | 客户端的ip地址(代理服务器,显示代理服务ip) |
| $remote_user | 用于记录远程客户端的用户名称(一般为“-”) |
| $time_local | 用于记录访问时间和时区 |
| $request | 用于记录请求的url以及请求方法 |
| $status | 响应状态码,例如:200成功、404页面找不到等。 |
| $body_bytes_sent | 给客户端发送的文件主体内容字节数 |
| $http_user_agent | 用户所使用的代理(一般为浏览器) |
| $http_x_forwarded_for | 可以记录客户端IP,通过代理服务器来记录客户端的ip地址 |
| $http_referer | 可以记录用户是从哪个链接访问过来的 |
sendfile on; 开启高效文件传输模式(zero copy 方式),避免内核缓冲区数据和用户缓冲区数据之间的拷贝。#tcp_nopush on; 开启TCP_NOPUSH套接字(sendfile开启时有用)
keepalive_timeout 指客户端连接超时时间
gzip on; 设置是否开启gzip模块,在Nginx一般都是针对文本类的文件进行压缩,压缩得到的压缩率较高,图片之类的压缩意义不大
另外我们Nginx压缩后,我们浏览器肯定需要对其进行压缩,所以它们之间肯定是需要同一种压缩解压的格式的,所以我们浏览器在发送请求时,请求头中是有一个参数设置的,它表示浏览器支持哪几种压缩方式
并且在返回头中,也会携带参数,表明其使用了什么样的压缩格式,浏览器就可以根据其压缩的格式进行解压
接下来的是我们的server虚拟主机,首先是我们虚拟主机server的监听端口以及域名,listen 80;虚拟主机的服务端口,server_name localhost; 用来指定ip或者域名,多个域名用逗号分开
然后又是我们的访问日志,这个和我们上述的一致,紧接着的是location,location主要是用于地址匹配设置,支持正则匹配,也支持条件匹配,这里是默认请求地址,可以用location命令对Nginx进行动态和静态网页过滤处理,有关location的配置后面会进行详细的介绍