设为首页 收藏本站
查看: 818|回复: 0

[经验分享] Nginx配置详解以及内核优化

[复制链接]

尚未签到

发表于 2018-11-14 07:52:47 | 显示全部楼层 |阅读模式
  安装nginx:
  yum -y install pcre*
  tar -zxvf nginx-1.6.0.tar.gz
  cd nginx-1.6.0/
  mkdir /usr/local/nginx/
  ./configure --prefix=/usr/local/nginx/  --with-http_stub_status_module #开启NginxStatus功能,监控nginx当前状态
  make &&  make install
  至此,安装完成
  配置nginx:
  jvm_route $cookie_JSESSIONID|sessionid reverse;
  nginx_upstream_jvm_route;
  user   nobody nobody;  #主模块指令,指定nginx worker进程运行的用户以及用户组,默认由nobody 帐号运行。
  worker_processes4;# 主模块指令,指定nginx要开启的进程数。每个nginx进程平均消耗 10~20M内存,不建议设置超过8个。
  error_log  logs/error_lognotice;#主模块指令, 用来定义全局错误日志文件。
  pidlogs/nginx.pid;#主模块指令,指定nginx 的pid.
  worker_rlimit_nofile  65535;#用来绑定worker进程和CPU。
  events{#指定nginx工作模式和连接上限。
  use epoll;#设置nginx工作模式,epoll是高效工作模式。
  worker_connections65536;#事件模块指令,定义nginx每个进程最大连接数,默认1024。最大客户连接数由worker_processes和worker_connections决定
  即 max_client=worker_processes*worker_connections,在作为反向代理时:max_client=worker_processes*worker_connections / 4
  }
  http{
  include conf/mime.types;#主模块指令,设置包含文件。
  default_typeapplication/octet-stream;#属于http核心模块指令,设置默认类型为二进制流,当文件类型未定义时使用这种方式。
  client_max_body_size 20;#设置允许客户端请求最大单个文件字节数。
  client_header_buffer_size32k;#指定来自客户端请求头的缓冲区大小。
  large_client_header_buffers  4 32k;#指定客户端请求头中较大的消息头缓存最大数量和大小。
  sendfile on;#开启高效文件传输模式,防止网络堵塞。
  tcp_nopushon;
  tcp_nodelayon;
  keepalive_timeout60;#客户端连接时时间,超时之后服务器端自动关闭该连接。
  client_header_timeout10;#客户端请求头的超时时间。
  client_body_timeout10;#客户端请求主体超时时间。
  send_timeout10;#客户端响应超时时间,仅限于两个连接活动之间的时间
  gzipon;#开启gzip压缩输出数据流,提高传输速度
  gzip_min_length1k;#设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认是0,表示不管多大都进行压缩,建议设置成大于1k的字节数,小于1k可能会越压越大。
  gzip_buffers4  16k;#表示申请4个为16k的内存作为存储gizp的压缩缓存。
  gzip_http_version1.1;#指定http协议版本,默认1.1,默认即可。
  gzip_comp_level2;#gzip压缩比,1为最小,处理最快;9为压缩比最大,处理最慢,传输速度最快,也最消耗CPU;
  gzip_typestext/plain  application/x-javascript text/css  application/xml;   #指定压缩类型,text/html这种类型即使不指定也会被压缩。
  gzip_vary on;#让前端缓存server(如squid、varnish等)也缓存经gzip压缩的页面。
  upstreamcrazy.net{#upstream 是定义负载均衡的模块,定义crazy.net名称的负载均衡器,通过调度算法,将client调度给后端不同的server;
  ip_hash;
  server  10.2.16.253:80;
  server10.2.16.254:80  max_fails=3 fail_timeout=20s;
  server  10.2.16.252:80  down;
  server  10.2.16.251:8080;
  }
  nginx的四种调度算法:
  1、轮询,默认使用rr轮询算法,将client逐一分发给不同的server,后端某台服务器宕机,会被自动剔除,使用户不受影响。
  2、weight,权值算法,数字越大,分配的几率越高,主要用于后端服务器性能不同的情况下。
  3、ip_hash,将client按IP的hash值分配,这样的话,client会被分配给一台固定的server,让client始终访问的都是这台,解决Session问题;
  4、fair, 比以上更智能,根据 页面大小 和 加载速度 进行负载均衡,看后端的服务器响应时间来决定分配请求,时间短的优先。需要下载upstream_fair模块才能使用。
  5、url_hash,此方法按访问url的hash结果来分配请求,使每个url定向到某一台固定server,可以进一步提高server效率。需要下载nginx的hash包才能用。
  upstream模块指定server后端服务器的ip和端口,同时可以设定每个后端服务器在upstream中的状态:
  down: 表示这台server暂时不参与负载均衡;
  backup:预留的备份server,当所有的非bakcup机器出现故障或忙的时候,才会请求bakcup机器,因此这台server压力最轻;
  max_fails:允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误;
  fail_timeout:在经历了max_fails次失败后,暂停服务的时间。和max_fails一起使用;
  注意:当使用ip_hash调度算法时,后端服务器不能是bakcup状态或weight。
  server{#配置nginx虚拟主机
  listen 80;#本机nginx的监听端口
  server_name  www.czy.com;#域名
  index        index.htmlindex.htm index.jsp index.php index.cgi;  #指定首页文件
  root /usr/local/nginx/html/;#指定网页根目录
  charsetgb2312;#网页默认编码格式,gb2312为简体中文;
  access_log   logs/www.czy.com.access.log  main;  #指定访问日志路径,main表示访问日志的输出格式;
  location ~ (\.jsp)|(\.do)$ {# URL 匹配设置,location支持正则匹配和if判断,所以很灵活。
  proxy_pass  http://crazy.net;#指定代理的后端服务器地址和端口,也可以是upstream的负载均衡器名;
  proxy_next_upstream  http_500 http_502 http_503 error timeout invalid_header;  #指定故障转移策略,当后端节点返回500,502,503,等执行超时错误时,自动将请求转发到upstream组的另一台服务器,实现故障转移。
  proxy_redirect off;#如果需要修改从被代理server传来的应答头中的"Location"和"Refresh"字段,可以用这个指令设置。
  proxy_set_header Host $host;#指定后端server获取Client的主机名和地址以及代理的真实IP
  proxy_set_header X-Real_IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size 10m;#
  client_body_buffer_size 128k;#指定客户端请求body缓冲区的大小,可以理解为先保存到本地再传给用户
  proxy_connect_timeout90;#指定后端server的连接超时时间,即发起握手等候响应的超时时间
  proxy_send_timeout 90;#指定后端server的数据回传时间,即在规定时间内后端服务器必须传完所有数据,否则nginx将断开连接
  proxy_read_timeout 90;#设置nginx从后端server取信息的时间,表示建立连接成功后,nginx等待后端服务器的响应时间
  proxy_buffer_size 4k;#设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小
  proxy_buffers 4 32k;#设置缓冲区的数量和大小,nginx从后端server获取的响应信息会放到缓冲区
  proxy_busy_buffers_size 64k;#设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy_buffers*2
  proxy_temp_file_write_size 64k;#设置 Proxy缓存临时文件的大小
  }
  location ~ ^/(upload|html)/ {#将upload和html目录下的所有文件都交给nginx处理
  root/usr/local/nginx/html/;#指定/usr/local/nginx/html/下的upload或html目录
  expires30d;#expires指定静态文件过期时间,30d表示30天
  }
  location ~ .*.jsp$ {#将所有以.jsp文件为后缀的url都交给10.2.16.253的80端口来处理
  index index.jsp;
  proxy_passhttp://10.2.16.253:80;
  }
  location /NginxStatus{#开启nginx的stubstatus模块,能够获取nginx的工作状态,此模块需要编译安装时指定才能用
  stub_statuson;#启用
  access_loglogs/NginxStatus.log;
  auth_basic"NginxStatus";#指定认证机制
  auth_basic_user_file../htpasswd;#指定密码文件,Nginx的auth_basic与apache的兼容,因此用htpasswd命令来生成一个密码文件即可
  }#在http://ip/NginxStatus 输入刚刚htpasswd创建的用户名密码即可看到
  location ~ \.php$ {
  root/usr/local/nginx/html;#
  fastcgi_pass127.0.0.1:9000;#设置fastcgi的使用端口
  fastcgi_indexindex.php;#首页
  fastcgi_paramSCRIPT_FILENAME/usr/local/nginx/html$fastcgi_script_name;#指定php网页文件的主目录
  includefastcgi_params;#包含fastcgi的参数配置文件
  }
  location ~ \.cgi$ {#添加fastcgi对perl的支持,需要下载wrapper程序,然后写脚本启动,详细解释在下文
  root  /usr/local/nginx/html;
  fastcgi_pass  unix:/usr/local/nginx/logs/nginx-fcgi.sock;#通信方式为unix socket,速度快
  fastcgi_index index.cgi;
  fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;   #
  includefastcgi_params;
  }
  location ~* \.(jpg|gif|png|swf)$ {#匹配 以jpg或gif或png或swf结尾的文件的网页根目录
  root  /usr/local/nginx/html/img;
  indexindex.jpg  index.gif  index.png  index.swf;
  }
  ####关于perl(fastcgi)安装:
  1、需要先获取wrapper程序,从http://www.nginx.eu/nginx-fcgi/下载nginx-fcgi.txt文件,然后将其命名为nginx-fcgi.pl,放到/usr/local/nginx目录下,nginx-fcgi.pl是一个用perl脚本写的wrapper实例,所以操作系统必须支持perl程序和相关模块。
  2、安装FCGI、安装IO模块、安装IO-ALL模块,过程略
  3、编写启动wrapper程序的脚本,用unix套接字的方式启动,给套接字文件777权限。
  #####关于nginx支持java,可以使用Nginx做反向代理,后端跑tomcat,把.jsp | .do 的文件,都定向到tomcat来处理。
  nginx内核参数优化项:
  net.ipv4.tcp_max_tw_buckets = 6000 #设定timewait的数量,默认是180000,这里设置为6000
  net.ipv4.ip_local_port_range = 1024 65000   #用来设定允许系统打开的端口范围
  net.ipv4.tcp_tw_recycle = 1#设置启用timewait快速回收
  net.ipv4.tcp_tw_reuse = 1#设置开启重用,允许将TIME-WAIT sockets 重新用于新的TCP连接
  net.ipv4.tcp_syncookies = 1#设置开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies进行处理
  net.core.somaxconn = 262144#默认值是128,用于调节系统同时发起的tcp连接数,在高并发的请求中,默认的值可能会导致连接超时或者重传
  net.core.netdev_max_backlog = 262144#表示当每个网络接口,接收数据包,的速率,比内核,处理这些包的,速率快时,允许发送到 队列 的数据包的最大数目
  net.ipv4.tcp_max_orphans = 262144#防止简单DDOS***,不能过分依靠这个限制甚至人为减小这个值,更多的情况下应该增加这个值
  net.ipv4.tcp_max_syn_backlog = 262144#用于记录那些 尚未收到 客户端确认信息 的 连接请求 的最大值,对于有128MB内存的系统来说,默认值是1024,
  net.ipv4.tcp_synack_retries = 1 #决定了内核放弃连接之前,发送SYN+ACK包的数量
  net.ipv4.tcp_syn_retries = 1 #表示在内核放弃建立连接之前发送SYN包的数量
  net.ipv4.tcp_fin_timeout = 1  #决定了套接字保持在FIN-WAIT-2状态的时间,默认值是60秒,正确设置这个值非常重要,有时即使一个负载很小的web服务器,也会出现大量的死套接字而产生内存溢出的风险
  net.ipv4.tcp_keepalive_time = 30 #当keepalived启用的时候,TCP发送keepalive消息的频度,默认值是2(单位是小时)


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-634741-1-1.html 上篇帖子: Nginx+Mysql+PHP构建LNMP平台 下篇帖子: 针对nginx、haproxy、lvs 的优缺点分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表