运维面试篇-----3.nginx基础面试

1.什么是nginx?
Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器
Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
FastCGI,简单的负载均衡和容错
2.常见的模块化结构
模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。

3.五种负载均衡模式:
1.roudrobin 轮询
2.weight 权重
3.ip——hash 解决session问题 i固定服务器
4.url——hash请求分配不同机器
5.fair 根据后因爱响应时间来分发请求,响应时间短的分发请求多

4.中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等

5.模块依赖性
gzip模块需要 zlib 库
rewrite模块需要 pcre 库
ssl 功能需要openssl库

5.nginx特点:
    Ø 跨平台:可以在大多数Unix like 系统编译运行。而且也有Windows的移植版本。 
  Ø 配置异常简单:非常的简单,易上手。 
  Ø 非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能支持5万并发连接,实际生产中能跑2~3万并发连接数(得益于Nginx采用了最新的epoll事件处理模型(消息队列)。 
  Ø Nginx代理和后端Web服务器间无需长连接; 
  Ø Nginx接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送到后端Web服务器,极大减轻后端Web服务器的压力。 
  Ø 发送响应报文时,是边接收来自后端Web服务器的数据,边发送给客户端。 
  Ø 网络依赖性低,理论上只要能够ping通就可以实施负载均衡,而且可以有效区分内网、外网流量。 
  Ø 支持内置服务器检测。Nginx能够根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障,并及时返回错误的请求重新提交到其它节点上。 
  Ø 采用Master/worker多进程工作模式 
  Ø 此外还有内存消耗小、成本低廉(比F5硬件负载均衡器廉价太多)、节省带宽、稳定性高等特点

6.nginx优化:
1.nginx配置的优化:
唯一可调的时nginx.conf ,因为fastcgi是为nginx管理进程的工具,当客户端请求到达nginx时,fastcgi选择并连接一个进程,并将web server的返回信息推送
从进程数优化 
》设置为web server打开的最大worker进程数,设为auto
》设置每个worker进程的最大连接数,设置大点
从链接设置
》设置客户端链接超时时间,服务器在这个时间之后关闭链接,设置小点
》设置客户端响应超时时间,俩次客户端读取操作的时间,设置小点
gzip压缩形式的数据传输
》对于比较大的数据可以开启gzip压缩传输的形式传输
从缓存设置
》指定缓存的最大数目,缓存的时间
2.从集群架构优化
做nginx的lvs集群,实现负载
**************************************88
1.  隐藏nginx header里面的版本信息


执行:curl –I 127.0.0.1会显示nginx的版本信息


隐藏操作:在http标签内加入“server_tokenoff”参数


2.  更改源码隐藏软件名称及版本号


在nginx编译安装之前,先更改,之后再编译安装


cd /nginx-1.6.3/src/core


sed –n ’13,17p’ nginx.h里面修改NGINX_VERSION


修改ngx_http_header_filter_module.c


sed –I ‘s#Server:nginx#Server:Apache#g’ ngx_http_header_filter_module.c


修改ngx_http_special_response.c


3 更改nginx默认用户及用户组(worker进程优化)


建立nginx用户 useradd nginx–s/sbin/nologin –M


id nginx确认


在nginx.conf最外层上面配置usernginx;即可


也可以编译的时候指定用户


3.  让worker进程使用普通用户运行


为master服务降权:使用非root跑nginx master


注意不能用80特权端口,前端nginx反向代理转端口在启动的时候指定配置文件


4.  配置nginx worker进程个数


nginx由master和worker进程组成,master进程相当于管理员,worker进程为用户提供服务一般设置为cpu核数×2,用top按1查看cpu数量


修改nginx.conf配置文件第一行


worker_processes 4;


5.  根据cpu核数进行nginx进程优化


work_processes 4;


worker_cpu_affinity 0001 0010 0100 1000;


6nginx事件处理模型优化


nginx的连接处理机制在不同的操作系统上采用不同的IO模型,在linux下,nginx使用epoll的IO多路复用模型,windows下使用icop模型


具体配置:


events{


use epoll;


worker_connections 1024;


}


6.  调整nginx worker单个进程允许的客户端最大连接数


这个值根据服务器性能和程序的内存来指定(一个进程启动使用的内存根据程序确定)


events{


use epoll;


worker_connections 201480;


}


这个参数是单个进程的最大连接数,实际最大连接数公式为:


Max_client=worker_processes*worker_connections


8配置nginx worker进程最大打开文件数


worker_rlimit_nofile 65535;


相当于系统ulimit –HSn,应该是总的


9开启高效的文件传输模式


参数在http标签设置为:sendfileon;tcp_nopush on;(只有在sendfile开启模式下有效


10设置连接超时时间


建立连接也是消耗资源的,我们一般断掉那些连上的链接,但是不做事的


php网站建议短链接,java网站建议长连接


http标签设置:


keepalive_timeout 60;


设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭该链接


tcp_nodelay on;


打开tcp_nodelay,在包含keepalive参数才有效


client_header_timeout 15;


请求头超时


client_body_timeout 15


请求主体超时


send_timeout 15;


指定响应客户端超时时间,这个超时时间仅仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx将会关闭连接


11.上传文件大小限制


http{


client_max_body_size 10m;


}


12.fastcgi调优(配合php引擎动态服务)


cache读取缓存区


buffer写入缓存区


fastcgi是静态服务和动态服务之间的一个接口


http {


#向fastcgi传送请求的超时时间,这个值是指已经完成两次握手后向fastcgi传送请求的超时时间


fastcgi_send_timeout 240;


#指定链接到后端fastcgi的超时时间


fastcgi_connect_timeout 240;


#指定收fastcgi答应的超时时间,这个值是指已经完成两次握手后接收fastcgi应答的超时时间、


fastcgi_read_timeout 240;


#指定读取fastcgi应答第一部分需要用多大的缓冲区,这个值表示将使用1个64kb的


fastcgi_buffer_size 64kb的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选定的的缓冲区大小


fastcgi_buffers 64k;


#指定本地需要用多少和多大的缓冲区来缓冲fastcgi,如果一个php脚本所产生的页面大小为256kb,那么会分配4个64kb的缓存区来缓存,如果页面大于256kb,那么大于256kb的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度大于硬盘,一般这个值应该为站点中php所产生的页面大小的中间值,如果站点大部分脚本产生的页面大小为256kb,那么可以把这个值设置为“816k ”464k“等


fastcgi_buffers 4 64k;


#建议设置为fastcgi_buffer的两倍,繁忙时段的buffer


fastcgi_busy_buffers_size 128k;


##在写入fastcgi_temp_path时将用多大的数据库,默认值是fastcgi_buffers的两倍,设置上述数值小时负载上来时可能报 502 badgateway


fastcgi_temp_file_write_size 128k;


##表示开启fastcgi缓存为其指定一个名称,开启缓存非常有用,可以有效降低cpu的负载,并防止502错误


fastcgi_cache oldboy_nginx;


#用来指定应答代码的缓存时间,实例中的值表示将2000和302应答缓存一个小时,要和fastcgi_cache配合使用


fastcgi_cache_valid 200 302 1h;


#将301应答缓存一天


fastcgi_cache_valic 301 1d;


#将其他应答缓存为1分钟


fastcgi_cache_valid any 1m;


##请求的数量


fastcgi_cache_min_uses 1;


#定义缓存的路径


fastcgi_cache_path


13.配置nginx gzip压缩功能(重要)


使用的模块ngx_http_gzip_module(nginx)


mod_deflate模块(apaceh)


常用的压缩对象:纯文本(js,css,html),对于图片,视频,FLASH什么的不压缩,gzip——types参数控制,因为压缩占用cpu


对应参数的含义如下:


gzip on;


#开启压缩功能


gzip_min_length 1k;


#设置允许压缩的页面最小字节数,页面字节数从header头顶content-length中获取,默认值0,不管页面多大都进行压缩,建议设置成大于1k,如果小于1k可能会越压越大。


gzip_buffers 4 32k;


#压缩缓冲区大小,表示申请4个单位为32k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。


gzip_http_version 1.1;


##压缩版本拥有设置http协议版本


gzip_comp_level 9;


###压缩比例,用来指定gzip压缩比 1最小9最大 建议设置为2.设置过大消耗cpu资源就多


gzip_types text/css test/xmlapplication/javascript;


##指定压缩的类型,test/html类型总是会被压缩


gzip_vary on;


##vary header支持,改选项可以让前端的缓存服务器经过gzip压缩的页面,例如用squid缓存经过nginx压缩的数据。


14.配置nginx expires缓存功能


对于图片,css,js等元素更改的机会较少,特别是图片,这时可以将图片设置在浏览器本地缓存365天或更长


location ~.*\.(gif|jpg|png|bmp|swf)$


{


expires 3650d;


location ~.*\.(js|css)$


{


expires 30d;


}


expire功能优点


1expires可以降低网站购买的带宽,节约成本


2同事提升用户访问体验


3减轻服务端压力


缺点:


被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验


解决办法:


第一个缩短缓存时间,例如1天,不彻底,除非更新频率大于1天


第二个对缓存的对象改名


a图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传来而已


b网升级对于js,css元素,一般可以改名,把css,js,推送到cdn


15.nginx日志相关优化与安全


1)配置日志切割脚本并写入计划任务


cd /app/logs


mv www_access.log www_acess_$(date +%F –d-1day).log


/application/nginx/sbin/nginx –s reload


cat >>/var/spool/cron/root<<eof


00 00 * * * /bin/sh cut_nginx_log.sh>/dev/null2>&1


eof


2)不记录不需要的访问日志


对于健康检查或某些(图片,js,css)日志,一般不记录日志,因为在统计pv时是按照页面计算,而且日志写入频繁会消耗磁盘IO降低服务器性能。


参数:access_log off;


1.  访问日志的权限设置


假设日志目录为/app/logs,则授权


chown –R root.root /app/logs


chmod –R 700 /app/logs


16 nginx站点目录及文件URL访问控制(重要:防止恶意解析)


1)根据扩展名限制程序和文件访问


作用:禁止目录下指定文件被访问,或者禁止指定目录下所有内容被访问


最佳应用场景:集群的共享存储,本来就应该只是资源文件,禁止指定扩展名程序被执行,php,sh,pl


nginx下禁止访问资源目录下的php程序文件,配置方法如下:


location ~^/images/.*\.(php|php5|.sh|.pl|.py)$


{


deny all;


if ($request_method !~^(GET|HEAD|POST)${


return 404;


2)nginx下配置禁止访问.txt文件


location ~*\.(txt|doc)${


if (-f $request_filename){
###rewrite^^^^^


break;


}


location ~*\.(txt|doc)${


root /data/www;


deny all;


}


3)使用ngx_http_access_module限制ip访问


17.配置nginx图片及目录防盗链


原理:是利用http referer日志信息


当浏览器向web服务器发送请求的时候,一般会带上referer,告诉服务器我从那个页面链接过来的,服务器可以借此获得一下信息用于处理


location~*\.(jpg|gif|png|swf|flv|wma|asf|mp3|mmf|zip|rar)${


valid_referers none blocked *.etiantian.orgetiantian.org;


if ($invalid_referer){


rewrite ^/ http://www.xiaofeng886.org/img/nolink.jpg;


}


}


18.nginx错误页面优雅显示


参数:error_page 403 /403.html;


19 nginx 方爬虫优化


20 使用tmpfs文件系统给/tmp


提高效率,部分程序切图片操作临时放到/tmp下,可以把tmp设置成内存文件系统,占用内存空间的,就是从内存里拿出一块来当磁盘用


mount –t tmpfs –o size=16m tmpfs /tmp


21放DDos攻击


1)控制单个ip的并发请求防止DOS攻击


使用limit_conn_zone进行控制,控制单个IP或域名的访问次数,限制连续访问


者http标签添加控制,可以添加多个


limit_conn_zone $binary_remote_addr zone=perip:10m;


limit_conn_zone $binary_name zone=perserver:10m;


server {


limit_conn perip 10;


limit_conn perserver 100;


2)限制单个的请求速率防止DOS的访问速率


使用limit_req_zone进行控制,控制单个ip访问速率


 


22为web服务增加用户身份验证(适合内部机密网址)


nginx配置


location /phpmyadmin/{


auth_basic “oldboy training”;


auth_basic_user_file/application/nginx/conf/htpasswd;


}


创建密码文件


htpasswd –cb /application/nginx/conf/htpasswdoldboy 123456


cat /application/nginx/conf/htpasswd


chmod 400 /application/nginx/conf/htpasswd


chown nginx /application/nginx/conf/htpasswd


23 让nginx运行于监牢模式


创建普通用户,将站点目录以及nginx.conf放到普通用户目录,之后用/application/nginx/sbin/nginx –c


配置文件来启服务


注意相关日志所在路径,指定pid,端口不能用80


useradd inca


cd /home/inca


mkdir conf www log


echo inca >www/index.html


error_log /home/inca/log/error.log


pid /home/inca/log/nginx.pid


指定站点目录


日志


端口不能用80


用普通用户启动


解决端口问题
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章