组成
主配置文件:nginx.conf
子配置文件:include conf.d/*.conf
协议相关的配置文件:fastcgi uwsgi scgi等
mime.types:⽀持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联⽹网邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定用程序来打开。多用于指定⼀些客户端自定义的文件名,以及⼀些媒体文件打开方式。
MIME参考⽂文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types
默认配置文件
参考文档
全局配置端,对全局⽣生效,主要设置nginx的启动⽤用户/组,启动的⼯工作进程数量量,⼯工作模式,Nginx的PID路路径,⽇日志路路径等
user nginx nginx;
设置权限用户和组
worker_processes number/auto;
启动工作进程数数量
auto:特殊值 允许 将工作进程自动绑定到可用 CPU
将每个工作进程绑定到单独的 CPU:worker_cpu_affinity 0001 0010 0100 1000;(4核cpu)
特殊值 (1.9.10) 允许 将工作进程自动绑定到可用 CPU:worker_cpu_affinity auto;(建议使用)
可选的掩码参数可用于限制 CPU 可用于自动绑定:worker_cpu_affinity auto 01010101;
开启测试:
watch -n1 'ps -axo pid,cmd,psr,nice | grep nginx'
while true;do curl http://192.168.33.179/index.html;sleep 0.2;done
不开启
错误⽇日志记录配置,语法:
error_log file [debug | info | notice | warn | error |
crit | alert | emerg]
error_log logs/error.log;
error_log logs/error.log notice;
error_log /apps/nginx/logs/error.log error;
pid⽂文件保存路路径
pid /apps/nginx/logs/nginx.pid;
worker_priority 0; 工作进程nice值,-20~19(越低优先级越高)
worker_rlimit_nofile 65536; 这个数字包括Nginx的所有连接(例如与代理理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最⼤打开⽂件数的限制.
daemon off; 前台运行Nginx服务用于测试、docker等环境。
master_process off|on; 是否开启Nginx的master-woker工作模式,仅用于开发调试场景。
events
events设置块,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接,使用哪种事件驱动模型处理请求,每个工作进程可以同时支持的最⼤大连接数,是否开启对多工作进程下的网络连接进行序列化等。
worker_connections 1024;
设置单个nginx⼯工作进程可以接受的最⼤大并发,作为web服务器的时候最大并发数为worker_connections * worker_processes,作为反向代理的时候为(worker_connections * worker_processes)/2
use epoll; 使用epoll事件驱动,Nginx⽀支持众多的事件驱动,比如select、poll、epoll,只能设置在events模块中设置。
accept_mutex on; 优化同一时刻只有一个请求而避免多个睡眠进程被唤醒的设置,on为防止被同时唤醒,默认为off,全部唤醒的过程也成为"惊群",因此nginx刚安装完以后要进⾏适当的优化。
multi_accept on; Nginx服务器器的每个工作进程可以同时接受多个新的网络连接,但是需要在配置文件中配置,此指令默认为关闭,即默认为一个工作进程只能⼀次接受一个新的网络连接,打开后几个同时接受多个。
http
http块是Nginx服务器器配置中的重要部分,缓存、代理理和⽇日志格式定义等绝大多数功能和第三方模块都可以在这设置,http块可以包含多个server块,而一个server块中又可以包含多个location块,server块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时间和单个链接的请求上限等
include mime.types; 定义类型
default_type application/octet-stream;没有定义的文件下载
sendfile on; 作为web服务器器的时候打开sendfile加快静态⽂文件传输,指定是否使用sendfile系统调用来传输文件,sendfile通过DMA(直接内存访问)⽅方式直接访问文件数据,并通过传输协议发送,从而避免了了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很⾼高,被称之为零拷贝,硬盘>> kernel buffer (快速拷⻉贝到kernel socket buffer) >>协议栈。
keepalive_timeout timeout header_timeout; 长连接超时时间,单位是秒header_timeout告诉浏览器
DMA(Direct Memory Access)即直接内存访问,DMA是一种不经过CPU⽽直接从内存读取数据的数据交换模式,可以将DMA认为是一种能够通过一组专用总线将内部和外部存储器器与每个具有DMA能力的外设设备连接起来的控制器,在DMA模式下,CPU只须向DMA控制器器下达指令,让DMA控制器器来处理理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了了CPU资源占有率,可以大大节省系统资源,一个处理理器器可以包含多个DMA控制器器,每个控制器有多个DMA通道,以及多条直接与存储器站(memory bank)和外设连接的总线,在很多高性能处理器中集成了两种类型的DMA控制器,第一类通常称为“系统DMA控制器器”,可以实现对任何资源(外设和存储器)的访问,第二类称为内部存储器DMA控制器,专⻔用于内部存储器所处位置之间的相互存取操作,即数据交换不需要经过CPU即可在不同的内存空间进行拷贝可以节省资源copy带来的上线文切换,可以直接在内存和I/O设备之间进行,可以大幅提高CPU性能
日志配置部分
#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 logs/access.log main;
自定义优化参数
sendfile on; 实现文件零拷贝
tcp_nopush on; 在开启sendfile的情况下,合并请求后统⼀一发送给客户端。
tcp_nodelay off; 在开启了keepalived模式下的连接是否启用TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不延迟发送,立即发送用户相应报文
gzip on; 开启文件压缩
service
设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个location模块。比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可以使用一个端口,比如都使用80端口提供web服务
listen 80; 配置server监听的端口
server_name www.xxx.com ; 本server的名称,当访问此名称的时候nginx会调用当前serevr内部的配置进程匹配,设置server name,可以空格隔开写多个并⽀支持正则表达式,如*.magedu.com www.magedu.* www.(site\d+)\.magedu\.com$ default_serve
charset koi8-r; 设置编码格式,默认是俄语格式,可以改为utf-8
access_log logs/host.access.log main;
测试
mkdir /apps/nginx/conf/conf.d
vim /apps/nginx/conf/conf.d
server {
listen 80;
server_name www.fxq.com;
location / {
root /data/nginx/html/pc;
}
}
mkdir -p /data/nginx/html/pc
vim /data/nginx/html/pc/index.html
<h1>欢迎</h1>
vim /apps/nginx/conf/nginx.conf
在linux访问
vim /etc/hosts
192.168.33.180 www.fxq.com
在windows上访问
C:\Windows\System32\drivers\etc\hosts
location
location其实是server的一个指令,为nginx服务器提供比较多而且灵活的指令,都是在location中体现的,主要是基于nginx接受到的请求字符串,对用户请求的UIL进行匹配,并对特定的指令进行处理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三方模块的配置也是在location模块中配置
root html; 相当于默认页面的目录名称,默认是相对路径,可以使用绝对路径配置。
index index.html index.htm; 默认的页面文件名称
测试
[root@localhost ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.fxq.com;
location /xf { #必须要在html目录中创建一个xf目录才可以访问,否则报错#使用xf的时候uri后⾯面如果加了斜杠则下⾯的路径配置必须加斜杠,否则403
root /data/nginx/html/pc;
index index.html
}
}
[root@localhost ~]# cat /data/nginx/html/pc/xf/index.html
<html>
<body>
<meta charset="utf-8">
<h1>黑客攻略</h1>
</body>
</html>
alias:定义路路径别名,会把访问的路路径重新定义到其指定的路路径
测试
[root@localhost ~]# cat /apps/nginx/conf/conf.d/pc.conf
server {
listen 80;
server_name www.fxq.com;
location /xf { #使用alias的时候uri后面如果加了斜杠则下面的路径配置必须加斜杠,否则403
alias /data/nginx/html/pc;当访问xf的时候,会显示xf定义的/data/nginx/html/pc⾥面的内容。
index index.html;
}
}
[root@localhost ~]# cat /data/nginx/html/pc/index.html
<html>
<body>
<meta charset="utf-8">
<h1>欢迎使用</h1>
</body>
</html>
error_page
error_page 500 502 503 504 /50x.html; #错误页面的文件名称
location = /50x.html { location处理对应的不同错误码的页面定义到/50x.html,这个跟对应其server中定义的目录下。
root html; 定义默认页面所在的目录
}
location ~ /\.ht { 拒绝访问文件
allow 127.0.0.1;允许127.0.0.1访问
deny all; 拒绝所有人访问