nginx配置
配置项的格式:配置项名称 配置项值1 配置项值2 ···· ;
配置名称必须是nginx中的某一个模块能够处理的,否则nginx会出现非法配置名的错误
配置值中如果出现语法符号,例如空格、变量等,使用单引号或者双引号括起来
第一类:用于调试和定位问题的配置项
1.daemon on|off 默认是on
是否以守护进程方式允许
2.master_process on|off 默认on
是否以一个master进程和多个worker进程的方式允许,如果off则不会fork出多个worker,而是一个master执行所有的请求
3.error日志设置
error /var/log/nginx.error.log debug
第一个值是日志文件的路径,第二个值是日志等级,如果是debug模式,需要在在编译nginx时候使用了--with-debug选项才能使用,如果想要不输出任何日志,日志路径写成:/dev/null 即可
4.仅对指定的客户端输出debug级别的日志,该配置属于事件类配置,需要在events{}块配置中
debug_connection IP|CIDR
例如:
events{
debug_connection 10.244..66.14;
debug_connection 10.244..66.16;
}
上面的ip才会输出debug级别的日志,其他的ip请求都是沿用error_log配置的日志级别
第二类:正常运行配置项
1.全局配置:可能是配置指令,或者是花括号的块配置(例如所有的事件类配置必须在events{.....}中配置),主要的全局配置如下:
user 用户 用户组: 配置由master进程fork出来的worker进程的所属用户和用户组,如果省略了group则表示用户组使用与user同名的用户组
pid: 记录主进程Id的文件,必须确保nginx能够有权限在目标目录中创建修改该文件,该配置会覆盖编译nginx时候的设置(默认是在logs目录下)
worker_rlimit_nofile:设置一个worker进程可以打开的最大文件句柄数
worker_processes: worker进程启动的数量,这些进程用于处理用户的请求连接,该选项是一个优化关键项之一,每个worker进程都是单线程的进程,它会调用各个模块实现各种功能,如果这些模块不会出现阻塞式调用,该值设置成cpu内核数即可,否则设置的值应该稍大于cpu内核数,这样会出现过多的进程间的切换带来的消耗
worker_cpu_affinity: 绑定worker到每个指定cup内核中,该参数与worker_processes结合使用,为什么进行worker绑定内核?假设如果多个worker进程抢同一个cpu就会出现同步问题,如果绑定了,那么一个worker进程独享一个cpu,这就在内核的调度策略上实现了完全的并发
例如:
worker_processes:4;
worker_cpu_affinity:1000 0100 0010 0001;
2.事件类配置项,需要在events{}块中设置
accept_mutex on|off:nginx的负载均衡锁,该锁能够让每个worker轮流地序列化地与新的客户端建立tcp连接处理请求,原理是当某个worker进程处理请求数达到了worker_connections的7/8左右时候,锁会大大减少该进程处理请求的的机会,这样实现了所有worker在处理请求数的尽量接近均衡,默认是开启的
use: 选择事件模式,linux中可选择的事件类型:poll、select、epoll,其中epoll可处理高并发,性能最好
worker_connections: 配置一个进程能够处理的的最大并发连接数(也就是一个进程最多能同时处理多少个请求的意思,受限于内存,也受限于worker_rlimit_nofile,其值不能大于worker_rlimit_nofile的值,而worker_rlimit_nofile的值则受限于系统本身的最大打开文件句柄数,可使用ulimit -n查看),这是一个优化的关键项之一
2. 使用include文件
include可以用在配置文件中的任何地方,只要被include的文件复合nginx配置文件的格式,这样可以使得某些配置文件能够重复使用
3. http中的server部分的配置,该配置需要使用http{}来包含,一般都是在全局配置后设置
这部分的命令用于配置http的连接,该指令比较多,大体可分一下几类:
3.1 客户端指令,例如:keepalive_timeout
3.2 文件I/O指令 例如:open_file_cache
3.3 Hash指令
3.4 Socket指令
4. 虚拟server指令,任何有server开始的部分都视为“虚拟服务器”部分,其包含在server{}中,它描述是一组根据server_name指令逻辑分割的资源,这些虚拟服务器资源用于响应http的请求,
因此它包含在http中的server部分的配置中,也就是包含在http{}中(http{ server{...} }),
用http核心模块配置一个静态web服务器
1.主要的模块是ngx_http_core_module,配置需要在server块中,而server块需要在http块中
2.配置可大体分为8种:
2.1 虚拟机主机的请求与分发
监听端口:
listen ip:port | ip | port 各种参数
例如:
listen 8099 default_server deferred
参数:
default_server表示作为默认的server块(虚拟主机),如果一个请求无法匹配配置文件中的所有主机域名,就会选择默认的server块
deferred:设置该参数后,即使用户发起了连接请求,并且tcp已经三次握手了,nginx也不会发起worker进程来处理,只有当用户真正的发送请求数据时候(内核在网卡收到请求数据包),worker才会被唤起处理请求,有利于大并发的情况下
主机名:
server_name value1 value2 ....;
在处理http请求的时候,nginx会跟中请求中的host的值去匹配配置中的server块中的server_name,如果同时符合,则按照匹配度来决定
如果都没有匹配则会:选择listen中定义了default_server的,如果没有则直接选择第一个server块
server ""{...}表示匹配http请求中没有host值的这个请求
重定向location
配置块:server
location会根据请求中的url来匹配,匹配上就执行location中的配置,如果多个匹配,只会选择最后一个个匹配到的location
匹配原则:
1. = 表示完全匹配
location = / {
#当用户请求是/时候,才使用这里的配置
}
2. ~ 表示匹配url时候是大小写敏感的
3. ~* 表示匹配url时候大小写不敏感
location ~* \.(gif|jpg|png)$ {
#匹配以.gif 或者 .jpg 或者 .png结尾的请求(不区分大小写),这里使用了正则,
}
4. ^~
loacation ^~ /images/{
#匹配请求以/images/开头的
}
一个匹配所有请求的location:
location / {
#匹配所有的请求
}
2.2 文件路径的定义
root定义资源路径
配置块:http、server、location、if
例如:
location /download/ {
root /data/web/html/;
#表示当有请求,例如是/download/index/index.html,那么web服务器会返回/data/web/html/download/index/index.html的内容
}
访问首页
index file1 file2....;
配置块:http、server、location
当访问是/时候,表示访问首页,这index配置属于ngx_http_index_module模块,配置多个文件,会按照从左往右顺序访问
http错误码重定向:error_page
2.3内存及磁盘资源的分配
http包体只存到磁盘文件中:client_body_in_file_only on|off (默认off),都会存入磁盘文件中,只是如果设置成off,在请求结束后该文件会被删除
配置模块:http、server、location
http包体尽量写到一个内存buffer中
client_body_in_single_buffer on|off(默认off),如果请求的http包体大小超过 client_body_buffer_size的大小,则还是会写入磁盘文件中
配置块:http、server、location
存储http头部的内存buffer大小:client_header_buffer_size(默认1k,正常的http请求的,如果有过大的http请求,其大小的限制由large_client_header_buffers来决定)
配置块:http、server
存储超大http头部的内存buffer大小:large_client_header_buffers number size(默认是 4 8k)
配置块:http、server
2.4网络连接配置
对某些浏览器禁用keepalive功能:keepalive_disable msie safari (默认对ie6和safari浏览器禁用)
配置块:http、server、location
keepalive超时时间:keepalive 75 (默认75秒),一个keepalive连接在闲置超过了75秒后,服务器和浏览器都会去关闭该连接,这个时间只约束了nginx,而nginx会把该时间传递给浏览器
配置块:http、server、location
一个keepalive长连接上允许承载的最大请求数:keepalive_request 100(默认是100个),一个keepalive连接最多只能发送100个请求
配置块:http、server、location
2.5 MIME类型的设置
定义MIME type到文件扩展名的映射,同一个MIME type可使用不同的文件扩展名,用http请求中的Content-Type的值从该类型设置中找到对应的文件扩展名,如果找不到,默认是text/plain
type{
text/html html;
text/html conf;
image/jpeg jpg;
image/gif gif;
.....
}
配置块:http、server、location
2.6 对客户端请求的限制
http包体的最大值:client_max_body_size 1m(默认1m),该值用来限制http请求中Content-Length字段的值,如果一个请求的Content-Length为10GB,那么nginx在接收完包头,发现10GB已经超过client_max_body_size的值了,nginx直接返回413(Reqest Entity Too Large)状态给客户端
配置块:http、server、location
location ~ .+\.php($|/) {
#以下是fastcgi模块最基本的配置项
fastcgi_pass fzjh;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params; #fastcgi_params与文件fastcgi.conf的区别只在于fastcgi_param SCRIPT_FILENAME参数的定义而已
#或者是
#fastcgi_pass fzjh;
#fastcgi_index index.php;
#include fastcgi.conf;
}