主配置文件
默认情况下分为三大块:全局块、events块、http块
http块中可以配置多个server块,每个server块又可以配置多个location
指令名 指令值; #全局块,主要设置Nginx服务器整体运行的配置指令
#events块,主要设置,Nginx服务器与用户的网络连接,这一部分对Nginx服务器的性能影响较大
events {
指令名 指令值;
}
#http块,是Nginx服务器配置中的重要部分,代理、缓存、日志记录、第三方模块配置...
http {
指令名 指令值;
server { #server块,是Nginx配置和虚拟主机相关的内容
指令名 指令值;
location / {
#location块,基于Nginx服务器接收请求字符串与location后面的值进行匹配,对特定请求进行处理
指令名 指令值;
}
}
...
}
路径:/etc/nginx/nginx.conf
user nginx; 启动Nginx的用户
worker_processes auto; nginx支持热部署,这里可以指的auto值,值为worker进程数
error_log /var/log/nginx/error.log notice; nginx错误日志路径
pid /var/run/nginx.pid; nginx的进程PID号文件
events { // 一个模块 后面会详细解析
worker_connections 1024; # 指定一个worker进程能处理多少个连接
}
http { // http模块 部署网站的功能
include /etc/nginx/mime.types; #相当于一个连接,包含这个路径下的文件的内容进入该配置文件
default_type application/octet-stream; #当Nginx无法识别页面内容时,访问该文件会触发下载
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; #访问日志的格式
access_log /var/log/nginx/access.log main; #nginx访问日志的存放位置
sendfile on; #传输文件参数
#tcp_nopush on;
keepalive_timeout 65; #nginx建立tcp连接之后多长时间没有动作自动断开
#gzip on; #传输过程中进行压缩处理
include /etc/nginx/conf.d/*.conf; #包含所有子配置文件路径下的以.conf结尾的文件
}
全局块
worker进程启动用户 — user
在nginx.conf 文件中,第一行存在user指令
用于配置运行Nginx服务器的worker进程的用户和用户组
语法 | user user [group] |
---|---|
默认值 | nobody |
位置 | 全局块 |
该属性也可以在编译的时候指定,语法如下./configure --user=user --group=group
,如果两个地方都进行了设置,最终生效的是配置文件中的配置。
在我的这一份配置文件中使用的用户为Nginx。如果我的web服务存放在/root/html 路径下的话,访问的时候就会因为权限不足出现403.
这里有一个问题,如果是编译安装使用的 —user指定了用户,又同时在nginx.conf中指定的不同的用户的话,nginx会以nginx.conf中的配置文件为主。
全局块 master_processes、worker_processes
master_process:用来指定是否开启工作进程。
语法 | master_process on|off; |
---|---|
默认值 | master_process on; |
位置 | 全局块 |
worker_processes:用于配置Nginx生成工作进程的数量,这个是Nginx服务器实现并发处理服务的关键所在。理论上来说workder process的值越大,可以支持的并发处理量也越多,但事实上这个值的设定是需要受到来自服务器自身的限制,建议将该值和服务器CPU的内核数保存一致。
语法 | worker_processes num/auto; |
---|---|
默认值 | 1 |
位置 | 全局块 |
如果将worker_processes设置成2,则会看到如下内容:
全局块 daemon
daemon:设定Nginx是否以守护进程的方式启动。
守护式进程是linux后台执行的一种服务进程,特点是独立于控制终端,不会随着终端关闭而停止。
语法 | daemon on|off; |
---|---|
默认值 | daemon on; |
位置 | 全局块 |
当我们将这个值设置为OFF的时候,我们CTRL + C 就会结束nginx的进程
全局块 PID
pid:用来配置Nginx当前master进程的进程号ID存储的文件路径。
语法 | pid file; |
---|---|
默认值 | 默认为:/usr/local/nginx/logs/nginx.pid |
位置 | 全局块 |
该属性可以通过./configure --pid-path=PATH
来指定
全局块 error_log
error_log:用来配置Nginx的错误日志存放路径
语法 | error_log file [日志级别]; |
---|---|
默认值 | error_log logs/error.log error; |
位置 | 全局块、http、server、location |
该属性可以通过./configure --error-log-path=PATH
来指定
其中日志级别的值有:debug|info|notice|warn|error|crit|alert|emerg,翻译过来为试|信息|通知|警告|错误|临界|警报|紧急,这块建议大家设置的时候不要设置成info以下的等级,因为会带来大量的磁盘I/O消耗,影响Nginx的性能。(从左往右日志级别越来越高,日志输出内容越少)
include
(5)include:用来引入其他配置文件,使Nginx的配置更加灵活
语法 | include file; |
---|---|
默认值 | 无 |
位置 | any |
events 块
accept_mutex
用来设置Nginx网络连接序列化
语法 | accept_mutex on|off; |
---|---|
默认值 | accept_mutex on; |
位置 | events |
这个配置主要可以用来解决常说的”惊群”问题。大致意思是在某一个时刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性能。如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。
一骨杀2狗(不是)
multi_accept
用来设置是否允许同时接收多个网络连接
语法 | multi_accept on|off; |
---|---|
默认值 | multi_accept off; |
位置 | events |
如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接
worker_connections
用来配置单个worker进程最大的连接数
语法 | worker_connections number; |
---|---|
默认值 | worker_commections 512; |
位置 | events |
这里的连接数不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数。另外,number值不能大于操作系统支持打开的最大文件句柄数量。
use
用来设置Nginx服务器选择哪种事件驱动来处理网络消息。
语法 | use method; |
---|---|
默认值 | 根据操作系统定 |
位置 | events |
注意:此处所选择事件处理模型是Nginx优化部分的一个重要内容,method的可选值有select/poll/epoll/kqueue等,之前在准备centos环境的时候,我们强调过要使用linux内核在2.6以上,就是为了能使用epoll函数来优化Nginx。
另外这些值的选择,我们也可以在编译的时候使用--with-select_module
、--without-select_module
、--with-poll_module
、--without-poll_module
来设置是否需要将对应的事件驱动模块编译到Nginx的内核。
http块
我们都知道浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIME Type。所以说MIME Type是网络资源的媒体类型。Nginx作为web服务器,也需要能够识别前端请求的资源类型。
在Nginx的配置文件中,默认有两行配置include mime.types;
default_type application/octet-stream;
(1)default_type:用来配置Nginx响应前端请求默认的MIME类型。
语法 | default_type mime-type; |
---|---|
默认值 | default_type text/plain; |
常用位置 | http、server、location |
在default_type之前还有一句include mime.types
,include之前我们已经介绍过,相当于把mime.types文件中MIMT类型与相关类型文件的文件后缀名的对应关系加入到当前的配置文件中。
举例来说明:
有些时候请求某些接口的时候需要返回指定的文本字符串或者json字符串,如果逻辑非常简单或者干脆是固定的字符串,那么可以使用nginx快速实现,这样就不用编写程序响应请求了,可以减少服务器资源占用并且响应性能非常快。
如何实现:
location /get_text {
#这里也可以设置成text/plain
default_type text/html;
return 200 "This is nginx's text";
}
location /get_json{
default_type application/json;
return 200 '{"name":"TOM","age":18}';
}
自定义服务日志
Nginx中日志的类型分access.log、error.log。
access.log:用来记录用户所有的访问请求。
error.log:记录nginx本身运行时的错误信息,不会记录用户的访问请求。
Nginx服务器支持对服务日志的格式、大小、输出等进行设置,需要使用到两个指令,分别是access_log和log_format指令。
(1)access_log:用来设置用户访问日志的相关属性。
语法 | access_log path[format[buffer=size]] |
---|---|
默认值 | access_log logs/access.log combined; |
位置 | http , server , location |
(2)log_format:用来指定日志的输出格式。
语法 | log_format name [escape=default|json|none] string….; |
---|---|
默认值 | log_format combined “…”; |
位置 | http |
其他配置指令
(1)sendfile:用来设置Nginx服务器是否使用sendfile()传输文件,该属性可以大大提高Nginx处理静态资源的性能
语法 | sendfile on|off; |
---|---|
默认值 | sendfile off; |
位置 | http、server、location |
(2)keepalive_timeout:用来设置长连接的超时时间。
为什么要使用keepalive?
我们都知道HTTP是一种无状态协议,客户端向服务端发送一个TCP请求,服务端响应完毕后断开连接。
如何客户端向服务端发送多个请求,每个请求都需要重新创建一次连接,效率相对来说比较多,使用keepalive模式,可以告诉服务器端在处理完一个请求后保持这个TCP连接的打开状态,若接收到来自这个客户端的其他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新连接,提升效率,但是这个连接也不能一直保持,这样的话,连接如果过多,也会是服务端的性能下降,这个时候就需要我们进行设置其的超时时间。
语法 | keepalive_timeout time; |
---|---|
默认值 | keepalive_timeout 75s; |
位置 | http、server、location |
(3)keepalive_requests:用来设置一个keep-alive连接使用的次数。
语法 | keepalive_requests number; |
---|---|
默认值 | keepalive_requests 100; |
位置 | http、server、location |
子配置文件
路径:/etc/nginx/conf.d/
手搓一个 vim Linux-test.conf
server {
listen 8080; #指定监听哪个端口
server_name www.test.com; #访问该服务通过哪个域名来访问
location / { #语法 location uri 所有访问上方定义的域名的用户 都到这个路径来
root /html/game; #存放源码的目录
index index.html; #定义首页文件
}
}
使用nginx -t 检查配置文件的语法是否有误
[root@localhost conf.d]# nginx -t
nginx: [emerg] directive "server_name" is not terminated by ";" in /etc/nginx/conf.d/Linux-test.conf:5
nginx: configuration file /etc/nginx/nginx.conf test failed
[root@localhost conf.d]# vim Linux-test.conf
[root@localhost conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
在指定路径下 创建一个index 页面
[root@localhost conf.d]# mkdir /html/game -p
[root@localhost conf.d]# cd /
[root@localhost /]# ls
bin boot dev etc home html lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@localhost /]# cd html
[root@localhost html]# ls
game
[root@localhost html]# cd game
[root@localhost game]# echo "<h1>test-nginx</h1>" > index.html
[root@localhost game]# cat index.html
<h1>test-nginx</h1>
http、server、location 彼此之间的关系 — 由上到下包含的关系
http:主要用于解决用户请求中的报文信息
server:主要用于配置具体的站点的响应操作
location:主要用于匹配URI
编写配置文件时候的注意事项
- 响应区域模块要一一对应
- 配置文件中所编写的每一条参数指令,一定要注意“;”
- 确保配置文件中所定义或引用的目录路径或文件,要与系统中相对应