nginx技术(2)nginx的配置详解
nginx的配置
1,启动nginx
1 2 3 4 5 6 7 | [root@centos6 nginx- 1.2 . 9 ]# /usr/sbin/nginx -c /etc/nginx/nginx.conf 启动nginx [root@centos6 nginx- 1.2 . 9 ]# ps -ef|grep nginx 查看进程 root 5479 1 0 04 : 15 ? 00 : 00 : 00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 5480 5479 0 04 : 15 ? 00 : 00 : 00 nginx: worker process root 5534 2377 0 04 : 22 pts/ 1 00 : 00 : 00 grep nginx [root@centos6 nginx- 1.2 . 9 ]# netstat -tulnp|grep nginx 查看nginx监听的端口 tcp 0 0 0.0 . 0.0 : 80 0.0 . 0.0 :* LISTEN 5479 /nginx.conf |
2,停止nginx
1 2 3 4 5 6 | 从容停止nginx [root@centos6 ~]# kill -QUIT $(cat / var /run/nginx/nginx.pid) 快速停止nginx [root@centos6 ~]# kill -TERM $(cat / var /run/nginx/nginx.pid) 强制停止所有的nginx [root@centos6 ~]# kill - 9 nginx |
3,重启nginx
1 2 3 4 5 | [root@centos6 ~]# kill -HUP $(cat / var /run/nginx/nginx.pid) 检测nginx的配置文件的正确性 [root@centos6 ~]# /usr/sbin/nginx -t -c /etc/nginx/nginx.conf nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful |
4,nginx的配置
[root@centos6 rc0.d]# vim /usr/local/nginx/conf/nginx.conf
(1)全局模式
1 2 3 4 5 6 7 8 9 10 | #启动进程数,通常设置成和cpu的数量相等 worker_processes 1 ; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] error_log logs/error.log info; #进程文件 pid logs/nginx.pid; worker_rlimit_nofile65535; 这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文 件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。 现在在linux2. 6 内核下开启文件打开数为 65535 ,worker_rlimit_nofile就相应应该填写 65535 。 |
(2)工作模式
1 2 3 4 5 6 7 8 9 | #工作模式与连接数上限 events { #参考事件模型, use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6 以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。 use epoll; #单个进程最大连接数(最大连接数=连接数*进程数) worker_connections 65535 ; } |
进程的最大连接数受系统最大打开文件数的限制,在执行操作系统命令 ulimit -n 65535之后
worker_connections才会生效
(3)设定http服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型 #charset utf- 8 ; #默认编码 server_names_hash_bucket_size 128 ; #服务器名字的hash表大小 client_header_buffer_size 32k; #上传文件大小限制 large_client_header_buffers 4 64k; #设定请求缓 client_max_body_size 8m; #设定请求缓 sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。 autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。 tcp_nopush on; #防止网络阻塞 tcp_nodelay on; #防止网络阻塞 keepalive_timeout 120 ; #长连接超时时间,单位是秒 #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。 fastcgi_connect_timeout 300 ; fastcgi_send_timeout 300 ; fastcgi_read_timeout 300 ; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #gzip模块设置 gzip on; #开启gzip压缩输出 gzip_min_length 1k; #最小压缩文件大小 gzip_buffers 4 16k; #压缩缓冲区 gzip_http_version 1.0 ; #压缩版本(默认 1.1 ,前端如果是squid2. 5 请使用 1.0 ) gzip_comp_level 2 ; #压缩等级 gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 gzip_ var y on; #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使 |
1 2 3 4 5 6 7 8 9 10 11 12 | 设置允许客户端请求的最大的单个文件的字节数 client_max_body_size 20m; 设置客户端的请求头的header buffer的大小。对于大多数请求,1kb的的大小就够了。如果自定义了消息头或者有更大的cookie,那么就可以增加其大小了 client_header_buffer_size 32k; 用来指定客户端请求中较大的消息头缓存的最大数量和大小,这里的意思是 4 为个数,32k为大小 large_client_header_buffers 4 32k; 设置客户端请求头的读取超时时间 超过这个时间就会返回 408 client_header_timeout 10 ; 设置客户端请求主体读取超时时间 超过这个时间就会返回 408 client_body_timeout 10 ; 指定响应客户端的超时时间。这个时间仅仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx就会关闭连接 send_timeout 10 ; |
(4)负载均衡配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | nginx 的upstream目前支持 4 种方式的分配 1 、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器 ,如果后端服务器down掉,能自动剔除。 2 、weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如: upstream bakend { server 192.168 . 0.14 weight= 10 ; server 192.168 . 0.15 weight= 10 ; } 2 、ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session 的问题。 例如: upstream bakend { ip_hash; server 192.168 . 0.14 : 88 ; server 192.168 . 0.15 : 80 ; } 3 、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 upstream backend { server server1; server server2; fair; } 4 、url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法 upstream backend { server squid1: 3128 ; server squid2: 3128 ; hash $request_uri; hash_method crc32; } tips: upstream bakend{#定义负载均衡 设备的Ip及设备状态 ip_hash; server 127.0 . 0.1 : 9090 down; server 127.0 . 0.1 : 8080 weight= 2 ; server 127.0 . 0.1 : 6060 ; server 127.0 . 0.1 : 7070 backup; } 在需要使用负载均衡的server中增加 proxy_pass http: //bakend/ ; 每个设备的状态设置为: 1 .down 表示单前的server暂时不参与负载 2 .weight 默认为 1 .weight越大,负载的权重就越大。 3 .max_fails :允许请求失败的次数默认为 1 .当超过最大次数时,返回proxy_next_upstream 模块定义的错误 4 .fail_timeout:max_fails次失败后,暂停的时间。 5 .backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。 nginx支持同时设置多组的负载均衡,用来给不用的server来使用。 client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug client_body_temp_path 设置记录文件的目录 可以设置最多 3 层目录 location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡 |
1 |
(5)虚拟主机的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | server { listen 80 default_server; server_name 192.168 . 87.133 ; root /usr/html/www1; index index.html; } http: //192.168.87.133 就可以访问/usr/html/www1 server { #监听端口 listen 80 ; #域名可以有多个,用空格隔开 server_name www.ha97.com ha97.com; index index.html index.htm index.php; root /usr/html/ha97; |
access_log /var/log/loginx/ha97access.log access;
(6) URL配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为/ static / 20 %/aa,可以被规则^~ / static //aa匹配到(注意是空格)。 ~ 开头表示区分大小写的正则匹配 ~* 开头表示不区分大小写的正则匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则 / 通用匹配,任何请求都会匹配到。 多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考): 首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。 例子,有如下匹配规则: location = / { #规则A } location = /login { #规则B } location ^~ / static / { #规则C } location ~ \.(gif|jpg|png|js|css)$ { #规则D } location ~* \.png$ { #规则E } location !~ \.xhtml$ { #规则F } location !~* \.xhtml$ { #规则G } location / { #规则H } 那么产生的效果如下: 访问根目录/, 比如http: //localhost/将匹配规则A 访问 http: //localhost/login将匹配规则B,http://localhost/register则匹配规则H 访问 http: //localhost/static/a.html将匹配规则C 访问 http: //localhost/a.gif, http://localhost/b.jpg将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png则优先匹配到规则C 访问 http: //localhost/a.PNG则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。 访问 http: //localhost/a.xhtml不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。 访问 http: //localhost/category/id/1111则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。 所以实际使用中,个人觉得至少有三个匹配规则定义,如下: #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。 #这里是直接转发给后端应用服务器了,也可以是一个静态首页 # 第一个必选规则 location = / { proxy_pass http: //tomcat:8080/index } # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项 # 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用 location ^~ / static / { root /webroot/ static /; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } #第三个规则就是通用规则,用来转发动态请求到后端应用服务器 #非静态文件请求就默认是动态请求,自己根据实际把握 #毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了 location / { proxy_pass http: //tomcat:8080/ } |
(7)自动索引及别名功能
1 2 3 4 5 6 7 8 9 10 11 12 | server { listen 80 default_server; server_name 192.168 . 87.133 ; root /usr/html; index index.html; location /www1 { autoindex on; (如果有index.html文件会优先访问) } location /i/ { alias /etc/; (当访问http: //192.168.87.133/i/的时候其实是访问/etc) } } |
(8)控制站点访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | server { listen 80 default_server; server_name 192.168 . 87.133 ; root /usr/html; index index.html; location /www1 { autoindex on; deny 192.168 . 87.1 ; allow 192.168 . 87.133 ; 当拒绝和允许冲突的话,按照次序生效,最前面的生效 } location /i/ { alias /etc/; } } |
(9)身份验证
nginx的身份验证和apache的一样
1 2 3 4 5 6 7 8 9 10 11 | location = / { index index.html index.htm; auth_basic "nginx_auth" ; auth_basic_user_file /usr/local/nginx/conf/htpassword; } [root@test4 nginx]# which htpasswd /usr/bin/htpasswd [root@test4 nginx]# htpasswd -c /usr/local/nginx/conf/htpassword webadmin New password: Re-type new password: Adding password for user webadmin |
(10)状态检查
模块stubstatus需要在编译的时候手动指定才可以使用
1 2 3 4 5 | location /nginx_status { stub_status on; access_log off; } http: //192.168.87.133/nginx_status |
(11)nginx的日志自动切割
nginx没有apache类似的cronolog的功能支持,但是可以通过nginx信号控制能的脚本来实现日志的自动切割
1 2 3 4 5 6 7 8 | #/bin/bash mkdir -p /home/nginx/logs savepath_log= '/home/nginx/logs' nginx_log= '/usr/local/nginx/logs' mkdir -p $savepath_log/$(date +%Y)/(date +%m) mv $nginx_log/access.log $savepath_log/$(date +%Y)/(date +%m)/access.$(date +%F).log mv $nginx_log/error.log $savepath_log/$(date +%Y)/(date +%m)/error.$(date +%F).log kill -USER1 `cat /usrlocal/nginx/logs/nginx.pid` |
USER1信号是使nginx自动切换日志
相关文章:

javascript 基础篇2 数据类型,语句,函数
文章里如果有错误的话,希望能帮忙指正~我也是边看视频边学习中,这个算是个笔记吧~自认为总结出来的东西比看视频要节省点时间~能帮到别人最好了~帮不到也起码恩能帮到我自己 嘿~ 写内容之前废话一句:因为旧版有些浏览器不支持javascript脚本&…

技术图文:如何在Python中定义二维数组?
背景 前几天,有位同学问我如下的问题: “temp[0][0]修改后,为什么temp[1][0]、temp[2][0]也发生了变化?” “在Python中二维数组是怎样定义和使用的?” 今天就来谈谈这个问题。 技术分析 在 C# 语言中有直接定义二…

javascript的垃圾回收机制指的是什么
定义:指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。 像 C 这样的编程语言,具有低级内存管理原语,如 malloc()和 free()。开发人员使用这些原语显式地对操作系统的内存进行分配和释放。 而 JavaScript…

技术图文:Matlab向量 VS. Python列表
背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结。这是第 1 篇,从创建结构、添加元素、删除元素、获取元素四个角度来对比 Matlab 的向量与 Python 的列表。 1. 向量/列表 的创建 1.1 直接法 Matla…

我的ExtJS学习之路 ——4
项目基本架子出来,然后就该考虑将封装好的gridpanel 和 tabpanel关联起来 既 点击树的叶子节点,将 gridpanel 展现在 tabpanel中 怎么关联呢? 【在之前的基础上的,重复的代码就不贴出来了】 我改变了 模拟数据的形式,注…

php CI框架输出空行问题排查
今天在使用 curl 命令行工具调试一个功能时,发现输出的内容总是会在最开始莫名其妙的多一行空行: 项目框架是 php 的 CodeIgniter,感觉这种问题在网上不好查找,因为可以确定这个是业务出现的问题,然后只能自己去定位查…

哪些人适合学习软件测试
软件测试相对于其他编程语言来说,它的入门门槛是相对比较低的,想要从事IT互联网行业可以选择学习软件测试,那么都有哪些人适合学习软件测试呢?来看看下面的详细介绍吧。 哪些人适合学习软件测试?就在软件测试培训行业观察来看,小…

c语言基本函数
一.内存操作函数: (1) 头文件:#include <string.h>memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, int value, size_t num );参数说明:…

技术图文:Python 匿名函数 VS. C# Lambda表达式
背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结。 这是第 2 篇,从定义和应用两个角度来对比 Python 的匿名函数 与 C# 的Lambda表达式。 匿名函数/Lambda表达式的定义 Python 匿名函数 在 Python…

php是否区分大小写
按常理来说,大多数语言都是区分大小写的,比如变量 ab 和 AB 是不同的,函数cd 和 CD 也是不同的,但是php有点特别。 首先,php中的变量和常量是区分大小写的。 <?php$a a; $A A; echo $a; echo $A;?>这里打印了…

如何创建和获取正则对象?
在JavaSript应用中,使用正则表达式之前,需要创建正则对象。创建正则表达式的方式有两种,一种是用字面量方式创建,另种是通过RegExp0构造函数的方式创建。这两种方式的语法格式如下。 //字面量方式 var变量名/表达式/; // RegExp构…

Numpy入门教程:01. 数组的创建与属性
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

深入浅出WPF——x:Class详解
小序:按照惯例,我会在年末的最后一篇文章里感谢所有帮助过我的人们。今年也不例外,只是形式简单一些。祝所有帮助过我的朋友、同事、学生和兄弟姐妹们——2009年身体健康、平安快乐、财源滚滚。愿2009年的中国,平安祥和、远离各种…

SQL Date 函数
MySQL Date 函数 函数描述NOW()返回当前的日期和时间CURDATE()返回当前的日期CURTIME()返回当前的时间DATE()提取日期或日期/时间表达式的日期部分EXTRACT()返回日期/时间按的单独部分DATE_ADD()给日期添加指定的时间间隔DATE_SUB()从日期减去指定的时间间隔DATEDIFF()返回两个…

什么是java常量
相信很多在学java技术的同学,对java常量这个并不陌生,什么是java常量呢?java常量就是在程序中固定不变的值,是不能改变的数据。例如数字1、字符“a”、浮点数3.2等。在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等…

Numpy入门教程:02. 索引、切片与迭代
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

php中OR与|| AND与的区别
本身没有区别,习惯问题 ,但是有时候牵涉到运算符优先级的问题,结果会不同,记录下。例如:$p 6 or 0;var_dump($p);//int(6)$p 6 || 0;var_dump($p);//bool(true)$p 6 and 0;var_dump($p); //int(6) $p 6 &&…

beego数据输出
概览直接输出字符串模板数据输出 静态模板数据输出动态模板数据输出json格式数据输出xml格式数据输出jsonp调用概览 直接输出字符串 通过beego.Controller.Ctx.WriteString()方法可以直接向http response body中输出字符串 beego中的函数定义如下: // WriteString W…

缓存和web缓存分别是什么?
什么是缓存? 缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。 什么是web缓存…

【Python】12、字典的实现
一、字典的实现 dic 可以使用list来实现 i(索引) hash(key) % solt(槽位数) 此时i重复了怎么办(hash冲突)? 1、拉链法 每个槽位上拉一个List,就是拉链法 1234567891011121314151617181920212223242526272…

Numpy入门教程:03.数组操作
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

13个JavaScript图表图形绘制插件
由于绘制矢量图的不同技术愈发成熟以及现代浏览器所具备的更强大的计算能力等原因,目前网上出现了越来越多免费 的JavaScript图表和图形绘制解决方案。在本文中就将分享13个优秀实用的JavaScript图表和图形绘制插件,它们少数是独立的框架,大多…

Java swing是什么?有什么作用?
在早期JDK1.0发布时,Sun公司就为GUI开发提供了一套基础类库,这套类库被称为AWT(Abstract Window Toolkit),即抽象窗口工具包。AWT的起初设想就是为了统一实现不同操作系统的图像界面,但问题是,不同操作系统图形库的功能…

python之网络爬虫
一、演绎自已的北爱 踏上北漂的航班,开始演奏了我自已的北京爱情故事 二、爬虫1 1、网络爬虫的思路 首先:指定一个url,然后打开这个url地址,读其中的内容。 其次:从读取的内容中过滤关键字;这一步是关键&a…

Numpy入门教程:04. 数学函数
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

SAXParserFactory之求解
SAX是Simple API for XML的简称,在Android里面提供对XML文件的解析接口方法,如果给我们一个XML文件,要求把里面我们关心的数据解析出来,我们就可以使用SAX技术,在具体使用中,会对XML文件的每一个字符逐一读取并出发相应…

学习Java知识应该注意哪些基础原则
想要做java程序猿,学习起来没有那么快的,尤其是零基础学员,java技术在学习的过程中是比较枯燥的,下面小编就为大家详细的介绍一下学习Java知识应该注意哪些基础原则,方便大家在学习的时候能够更加有效率! 学习Java知识…

Numpy入门教程:05. 逻辑函数
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

git获取指定release版本代码
首先手里必须有release的版本的备份出来的/.repo/manifests/default.xml文件,该文件记录了每个git库的在该版本下的具体的版本情况,整个代码的sync都是依据他来的; 1、repo sync 将本地代码更新至最新; 2、将手里的manifests.xml&…

【内网福音】如何离线部署Rancher
2019独角兽企业重金招聘Python工程师标准>>> 对于在公司内网环境中、无法访问互联网的用户而言,离线安装部署Rancher是解决问题的关键。本文是Rancher离线部署教程,专为内网用户排坑解难。 版本说明 OS:Centos7.3 Docker version:…