煮酒听雨
首页
PHP
MYSQL
WEB
Linux
关于本站
登陆
注册
Nginx配置 nginx.conf 文件中常用配置用法 (笔记整理)
编辑时间:2018-05-13
编辑:忘尘
阅读:873
##### nginx配置文件nginx.conf ```linux user www www; #nginx进程,一般设置为和cpu核数一样或者2倍 worker_processes auto; #错误日志存放目录 常见的错误日志级别有[debug | info | notice | warn | error | crit] 默认为crit,生产场景一般是 warn error crit 这三个级别之一, crit记录的日志最少(级别越高记录的信息越少),而debug记录的日志最多。如果你的nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富 error_log /home/wwwlogs/nginx_error.log crit; #进程pid存放位置 pid /usr/local/nginx/logs/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. #最大文件打开数(连接),可设置为系统优化后的ulimit -n的结果 (修改Linux系统的最大进程数和最大文件打开数 vim /etc/security/limits.conf) worker_rlimit_nofile 65535; #配置参考:http://zjty.safeandsound.vip/home/Article/articleDetail/id/324.html #cpu亲和力配置,让不同的进程使用不同的cpu(具体参数根据cpu核数配置 如:4核心可以直接用官方的配置worker_cpu_affinity 0001 0010 0100 1000;) 查看CPU是几核:cat /proc/cpuinfo |grep "cores"|uniq #worker_cpu_affinity xxx xxxx xxxx xxxx; #工作模式及连接数上限 events { #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能 linux建议epoll,FreeBSD建议采用kqueue,window下不指定 use epoll; #单个进程允许的客户端最大连接数 # 并发总数是 worker_processes 和 worker_connections 的乘积 # 即 max_clients = worker_processes * worker_connections # 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么 # 为什么上面反向代理要除以4,应该说是一个经验值 # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000 # worker_connections 值的设置跟物理内存大小有关 # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数 # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右 # 我们来看看1G内存的VPS可以打开的文件句柄数是多少: # $ cat /proc/sys/fs/file-max # 输出 65535 # 32000 < 65535,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内 # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置 # 使得并发总数小于操作系统可以打开的最大文件数目 # 其实质也就是根据主机的物理CPU和内存进行配置 # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。 worker_connections 65535; #当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态; #如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是「惊群问题」 #简单点说:Apache动辄就会启动成百上千的进程,如果发生惊群问题的话,影响相对较大;但是对Nginx而言,一般来说,worker_processes会设置成CPU个数,所以最多也就几十个,即便发生惊群问题的话,影响相对也较小。 #另:高版本的Linux中,accept不存在惊群问题,不过epoll_wait等操作还有。 # #假设你养了一百只小鸡,现在你有一粒粮食,那么有两种喂食方法: #你把这粒粮食直接扔到小鸡中间,一百只小鸡一起上来抢,最终只有一只小鸡能得手,其它九十九只小鸡只能铩羽而归。这就相当于关闭了accept_mutex。 #你主动抓一只小鸡过来,把这粒粮食塞到它嘴里,其它九十九只小鸡对此浑然不知,该睡觉睡觉。这就相当于激活了accept_mutex。 # #可以看到此场景下,激活accept_mutex相对更好一些,让我们修改一下问题的场景,我不再只有一粒粮食,而是一盆粮食,怎么办? #此时如果仍然采用主动抓小鸡过来塞粮食的做法就太低效了,一盆粮食不知何年何月才能喂完,大家可以设想一下几十只小鸡排队等着喂食时那种翘首以盼的情景。 #此时更好的方法是把这盆粮食直接撒到小鸡中间,让它们自己去抢,虽然这可能会造成一定程度的混乱,但是整体的效率无疑大大增强了。 # #Nginx缺省激活了accept_mutex,是一种保守的选择。如果关闭了它,可能会引起一定程度的惊群问题,表现为上下文切换增多(sar -w)或者负载上升,但是如果你的网站访问量比较大,为了系统的吞吐量,我还是建议大家关闭它。 multi_accept off; #keepalive超时时间 #keepalive_timeout 60; #客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数,分页大小可以用命令getconf PAGESIZE 取得 #client_header_buffer_size 4k; #这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存 #open_file_cache max=65535 inactive=60s; #这个是指多长时间检查一次缓存的有效信息。 #open_file_cache_valid 80s; #open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。 #open_file_cache_min_uses 1; } http { #文件扩展名与类型映射表 include mime.types; #默认文件类型 default_type application/octet-stream; ##### log_format配置参数(http标签内,在所有的server标签内可以调用) #- $remote_addr #记录访问网站的客户端地址 #- $remote_user #远程客户端用户名 #- $time_local #记录访问时间与时区 #- $request #用户的http请求起始行信息 #- $status #http状态码,记录请求返回的状态码,例如:200、301、404等 #- $body_bytes_sent #服务器发送给客户端的响应body字节数 #- $http_referer #记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置。 #- $http_user_agent #记录客户端访问信息,例如:浏览器、手机客户端等 #- $http_x_forwarded_for #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #设定请求缓存 server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; #开启高效传输模式 sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime sendfile on; #激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,积极的作用是减少网络报文段的数量 tcp_nopush on; #连接超时时间 keepalive_timeout 60; #激活tcp_nodelay,内核会等待将更多的字节组成一个数据包,从而提高I/O性能 tcp_nodelay on; #如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。 #如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。 #无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误 #可解决遇到超长的请求串post请求或者get请求时,nginx会返回413、400、414等状态码等情况,这是因为请求串长度超过了nginx默认的缓存大小或者请求串大小 client_body_buffer_size 1024k; #FastCGI相关参数:为了改善网站性能:减少资源占用,提高访问速度 #连接到后端fastcgi超时时间 fastcgi_connect_timeout 300; #向fastcgi请求超时时间(这个指定值已经完成两次握手后向fastcgi传送请求的超时时间) fastcgi_send_timeout 300; #接收fastcgi应答超时时间,同理也是2次握手后 fastcgi_read_timeout 300; #读取fastcgi应答第一部分需要多大缓冲区,该值表示使用1个64kb的缓冲区读取应答第一部分(应答头),可以设置为fastcgi_buffers选项缓冲区大小 fastcgi_buffer_size 64k; #指定本地需要多少和多大的缓冲区来缓冲fastcgi应答请求, #假设一个php或java脚本所产生页面大小为256kb,那么会为其分配4个64kb的缓冲来缓存; #若页面大于256kb,那么大于的256kb的部分会缓存到fastcgi_temp指定路径中,这并非是个好办法,内存数据处理快于硬盘,一般该值应该为站点中php/java脚本所产生页面大小中间值,如果站点大部分脚本所产生的页面大小为256kb,那么可把值设置为16 16k,4 64k等 fastcgi_buffers 4 64k; #默认值是fastcgi_buffer的2倍 fastcgi_busy_buffers_size 128k; #写入缓存文件使用多大的数据块,默认值是fastcgi_buffer的2倍 fastcgi_temp_file_write_size 256k; #开启gzip压缩 开启nginx gzip压缩后,网页、css、js等静态资源的大小会大大的减少,从而可以节约大量的带宽,提高传输效率,提供良好的用户体验 gzip on; #低于1kb的资源不压缩 gzip_min_length 1k; #设置用于处理请求压缩的缓冲区数量和大小。比如32 4K表示按照内存页(one memory page)大小以4K为单位(即一个系统中内存页为4K),申请32倍的内存空间。建议此项不设置,使用默认值。 gzip_buffers 4 16k; #用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,所以为了支持前期版本加了此选项。默认在http/1.0的协议下不开启gzip压缩。 gzip_http_version 1.1; #压缩级别【1-9】,越大压缩率越高,同时消耗cpu资源也越多,建议设置在4左右 gzip_comp_level 2; #需要压缩哪些响应类型的资源,多个空格隔开,不建议压缩图片、大文件等 gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; #是否添加“Vary: Accept-Encoding”响应头 gzip_vary on; #Nginx作为反向代理的时候启用,根据某些请求和应答来决定是否在对代理请求的应答启用gzip压缩,是否压缩取决于请求头中的“Via”字段,指令中可以同时指定多个不同的参数,意义如下 #off – 关闭所有的代理结果数据压缩 #expired – 如果header中包含”Expires”头信息,启用压缩 #no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩 #no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩 #private – 如果header中包含”Cache-Control:private”头信息,启用压缩 #no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩 #no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩 #auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩 #any – 无条件压缩所有结果数据 gzip_proxied expired no-cache no-store private auth; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持) gzip_disable "MSIE [1-6]\."; #Nginx限制访问速率和最大并发连接数模块–limit (防止DDOS攻击) #nginx 1.1.8 之后的版本的语法改为limit_conn_zone $binary_remote_addr zone=NAME:10m; #NAME 就是 zone 的名字详情请看这里 http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html #限制连接数: #要限制连接,必须先有一个容器对连接进行计数,在http段加入如下代码:limit_conn_zone $binary_remote_addr zone=addr:10m; #"zone=" 给它一个名字,可以随便叫,这个名字要跟下面的server模块中 limit_conn 一致,接下来需要对server不同的位置(location段)进行限速 (If enable limit_conn_zone,add "limit_conn addr 10;" to server section.) #$binary_remote_addr 用二进制来储存客户端的地址,1m 可以储存 32000 个并发会话 # ip limit(访问ip限制) #limit_conn_zone $binary_remote_addr zone=perip:10m; #隐藏响应header和错误通知中的版本号 server_tokens off; #访问日志 access_log off; #access_log /home/wwwlogs/access.log main; #设定虚拟主机配置 server { listen 80 default_server; #listen [::]:80 default_server ipv6only=on; server_name _; index index.html index.htm index.php; root /home/wwwroot/default; #错误页面 #error_page 500 502 404 /404.html; #是限制每个IP只能发起1个连接(表示最大并发连接数1,单个页面上引用的js,css,图片都算一个连接) ,其中perip要跟http块中的limit_conn_zone的变量NAME对应 #limit_conn perip 1; #指令limit_rate_after,从下载到你指定的文件大小之后开始限速,然后指令limit_rate,设置最高下载速度。 #limit_rate_after 10m; #限速为 1000KB/秒 这是对每个连接限速1000k。这里是对连接限速,而不是对IP限速!如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate * 2 #limit_rate 1000k; #如果想设置用户下载文件的前10m大小时不限速,大于10m后再以128kb/s限速可以增加以下配内容 #location /download { # limit_rate_after 10m; # limit_rate 128k; # } #ReWrite语法 #last – 基本上都用这个Flag。 #break – 中止Rewirte,不在继续匹配 #redirect – 返回临时重定向的HTTP状态302 #permanent – 返回永久重定向的HTTP状态301 #注:last和break最大的不同在于 #- break是终止当前location的rewrite检测,而且不再进行location匹配 - last是终止当前location的rewrite检测,但会继续重试location匹配并处理区块中的rewrite规则 #1、下面是可以用来判断的表达式: #-f和!-f用来判断是否存在文件 #-d和!-d用来判断是否存在目录 #-e和!-e用来判断是否存在文件或目录 #-x和!-x用来判断文件是否可执行 #location / { # if (!-e $request_filename) { # rewrite ^(.*)$ /index.php?s=/$1 last; # break; # } #} #location模块语法规则: location [=|~|~*|^~] /uri/ { … } #= 表示精确匹配 #^~ 表示uri以某个常规字符串开头,理解为匹配url路径即可 #~ 表示区分大小写的正则匹配 #~* 表示不区分大小写的正则匹配 #!~ 表示区分大小写不匹配的正则 #!~* 表示不区分大小写不匹配 的正则 #/ 通用匹配,任何请求都会匹配到。 # Deny access to PHP files in specific directory 拒绝访问特定目录中的PHP文件 #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; } #include enable-php.conf; #PHP 脚本请求全部转发到 FastCGI处理 location ~ [^/]\.php(/|$) { #此处不开启pathinfo模式 try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_index index.php; include fastcgi.conf; } #开启status页面检测服务状态 location /nginx_status { stub_status on; access_log off; } location /nginx_status { stub_status on; access_log off; } #将符合要求的图片文件等设定expries缓存参数,要求浏览器缓存 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } #将符合js,css文件的等设定expries缓存参数,要求浏览器缓存 location ~ .*\.(js|css)?$ { expires 12h; } #让 .well-known 目录下面的验证文件能正常访问 location ~ /.well-known { allow all; } #禁止 . 开头的隐藏文件及目录的访问 location ~ /\. { deny all; } access_log /home/wwwlogs/access.log main; } #导入其他站点配置 include vhost/*.conf; } ```
来说两句吧
提交评论
最新评论
我的标签
函数
面试
REDIS
LNMP
验证
时间
JS
LINUX
CPA
常量
MYSQL
备份
微信
文件
压缩
优化
SVN
PHP
集合
数组
HTML
收藏
NGINX
配置
日志
性能
加密
下载
FORM
WEB
样式
SQL
表单
配置,面试,REDIS
编码
ARRAY
替换
截取
密码
版本
进程
定时
测试
事务
数据
权限
安全
防火墙
索引
设计模式
安全,面试
缓存
热文排行
LNMP状态管理命令
navicat for mysql 导入xlsx,
(置顶)开发中常用功能知识点笔记
(置顶)收藏优秀分享文章集合
PHP加密解密算法(Discuz!经典代码)
PHP 获取数组第一个元素或最后一个值
Nginx配置 nginx.conf 文件中常用配
MySQL错误日志 [Warning] IP ad
Redis持久化:快照(RDB)和AOF简解
浅析SQLmap
随机文章
友情链接
官方手册
thinkphp
php扩展
Linux命令
lnmp
PHP中文网
鸟哥Linux私房
Nginx中文文档
json格式化
Redis手册
composer中文文档
CentOS下载
流程图
VPN代理
菜鸟网
奇淼教程
首页
PHP
MYSQL
WEB
Linux
关于本站
登陆
注册