nginx服务器安装完成后,默认安装时自带的配置文件全部存储在conf目录下,并且每个配置文件都还提供了一个以.default结尾的备份文件。其中nginx.conf是nginx默认的主配置文件,所有功能的实现都与此文件的配置相关。
配置文件结构
打开nginx.conf配置文件,从整体结构可以看出,配置文件主要分5个部分,main、events、http、server、location。
main;
events {...}
http {
server {
location {...}
}
}
各块文件结构说明如下:
- main 主要控制nginx子进程所属的用户和用户组、派生子进程数、错误日志位置与级别、pid位置、子进程优先级、进程对应CPU、进程能够打开的文件描述符数目等
- events 控制nginx处理连接的方式
- http nginx处理http请求的主要配置块,大多数配置都在这里面进行
- server nginx中主机的配置块,可用于配置多个虚拟主机
- location server中对应目录级别的控制块,可以有多个
对于嵌套块(如http、server、location)中的指令,执行的顺序为从外到内依次执行,内层块中的大部分指令会自动获取外层块指令的值作为默认值,特殊指令除外。
默认的nginx配置文件中,有很多以#开始的注释行,nginx并不会对其进行解析,这些注释行的作用主要用于解释和说明,去掉注释行,默认的配置文件整体如下
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 2021;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
从配置文件可以看出,nginx的指令由指令名称和参数组成。如 worker_processes 1,worker_processes为指令名称,1为参数。当一个指令中含有多个子指令作为参数时,需要用大括号{ }进行包裹,如events块,且大括号中的每条指令都已分号“;”结尾。
配置文件中,有一个特殊的参数mime.types,表示村塾文件扩展名与文件类型的映射表。
默认配置指令说明
指令 | 说明 |
---|---|
worker_processes | 配置nginx的工作进程数,一般设为CPU总核数或者总核数的两倍 |
worker_connections | 配置nginx允许单个进程并发连接的最大请求数 |
include | 用于引入配置文件 |
default_type | 设置默认文件类型 |
sendfile | 默认值为on,表示开启高效文件传输模式 |
keepalive_timeout | 设置默认长连接超时时间(单位:秒) |
listen | 监听端口,默认监控80端口 |
server_name | 设置主机域名 |
root | 设置主机站点根目录地址 |
index | 指定默认索引文件 |
error_page | 自定义错误页面 |
设置用户和组
nginx服务是由一个主进程(master process)和多个工作进程(work processes)组成的。其中,主进程以root权限运行,而工作进程在默认情况下以nobody用户运行。原因在于nobody用户是一个不能登录的账号,有一个专用的id,可将每个运行的工作进程隔离出来,这样即使黑客攻击破坏了服务器程序,因其不是root用户,不会影响到其它数据。
因此,为工作进程设置的执行用户权限越低,则服务器安全系数越高。
如何查看当前用户主进程和工作进程的用户权限,使用ps 命令,ps -ef|grep nginx
图中可以看到,nginx默认有一个主进程master process 和一个工作进程worker process,主进程用户为root,工作进程用户为nobody。
nginx提供配置用户和组的功能,针对的就是工作进程worker process,主要用于对某些操作提供权限。例如,配置日志文件时,主进程创建日志文件后,会议工作进程的用户作为文件所有者,从而使工作进程能够将日志写入指定文件中。
自定义错误页
在访问网站过程中,经常会遇见各种各样的错误,如找不到访问的页面则会提示404 not found错误,没有访问权限会提示403 forbidden等。在nginx的主配置文件中,给出了如下的处理方式。
error_page 500 502 503 504 /50x.html;
默认配置文件中,error_page指令用于定义错误页面,500/502/503/504指的都是http错误代码,/50x.html用于表示发生上述指定的任一错误时,都是用网站根目录下的50x.html文件处理。这个是nginx默认的错误页面错误,如果我们想手动设置自己的错误页面,怎么处理呢
为每种类型的错误设置单独的处理方式
# 指定403错误页面为 403.jpg
error_page 403 403.jpg;
# 指定404错误页面为 404.jpg
error_page 404 404.jpg;
将上述配置放到server块中,将对应的静态资源文件放置到nginx安装目录下的html目录下面(nginx/html)即可, 使用nginx -s reload 重启nginx使配置生效。
访问一个不存在的请求url localhost:2021/hhi,正常跳转到我们配置的404.jpg页面
利用在线资源进行处理错误
处理错误的页面除了可以使用本站的资源外,还可以在发生指定错误时跳转到指定的url,利用在线的资源进行处理。
# 处理单个指定错误
error_page 404 http://www.baidu.com;
#处理一系列指定错误
error_page 500 502 503 504 http://www.jd.com;
配置后,重启nginx服务,访问 localhost:2021/baidu ,baidu为一个不存在的服务url,会返回404状态码,并展示在线错误提示信息 http://www.baidu.com
更改响应状态码
用户通过浏览器发送http请求时,服务器处理完成后会返回响应信息,响应信息中的状态码(status)就是服务器在处理用户http请求后的响应状态。例如,用户访问一个不存在的页面,服务器返回的状态码就为404。
在一些nginx限流或其它场景中,须要隐藏服务器返回的真实状态码信息,则可以利用“=”进行自定义设置,具体配置如下。
error_page 404=200 /40x.html;
按照上述设置修改配置文件,再次进行访问。可以看到,发生404错误时候,响应信息中的状态码是自定义的码值200,成功隐藏了实际响应状态码。