web服务器___nginx全攻略

  1、安装nginxjavascript

  一、安装依赖包php

  yum -y install pcre pcre-devel openssl openssl-devel gcc gcc-c++,其中pcre库是perl兼容正则表达式库,用于支持rewrite模块css

 

  二、配置并安装nginxhtml

  安装nginx版本为1.6.3,配置选项以下:前端

  ./configure --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --prefix=/application/nginx-1.6.3/java

  查看全部可用配置选项使用以下命令:node

  ./configure --helpnginx

  编译安装nginx:make&&make installc++

 

  三、建立链接web

  ln -s /applicattion/nginx-1.6.3 /application/nginx

 

  2、配置文件介绍

  一、nginx经常使用模块介绍

  1)核心功能模块

  ngx_core_module                           对应配置文件中为main区块和events区块,是配置nginx全局参数的地方,其中main区块指的就是配置文件最上面没有被任何括号包裹的那些配置项。

  2)标准http功能模块

  ngx_http_core_module                   核心HTTP参数配置,对应http区块
  ngx_http_access_module              访问控制模块
  ngx_http_gzip_module                   压缩模块
  ngx_http_fastcgi_module               fastcgi模块,与动态应用相关如PHP
  ngx_http_proxy_module                 代理模块
  ngx_http_upstream_module           负载均衡模块,可实现网站负载均衡与健康检查
  ngx_http_rewrite_module               URL地址重写
  ngx_http_limit_conn_module         限制用户并发链接数与请求数
  ngx_http_limit_req_module            根据定义的key限制nginx请求过程的速率
  ngx_http_log_module                     访问日志模块,可自定义日志格式
  ngx_http_auth_basic_module         web认证模块,设置nginx用户经过帐号密码访问
  ngx_http_ssl_module                      ssl模块,用于加密HTTP链接如https
  ngx_http_stub_status_module        记录nginx基本访问状态信息

 

  二、主配置文件常规参数说明

  main区块,配置文件最开头没有大括号包裹的内容

  user                               nginx运行用户

  worker_processes         nginx开启的worker进程数,通常设置为与CPU内核数相等,worker进程用于创建链接

  error_log                        错误日志的路径

  pid                                  pid文件的路径

  include                           用于加载配置文件,能够用于其余模块中

 

  events模块

  worker_connections      单个worker进程的最大链接数

 

  http模块

  log_format                     访问日志的记录格式与记录格式的名字

  access_log                    访问日志的路径

  types_hash_max_size   hash表占用的内存最大值

  default_type                   默认媒体类型

 

  server模块,配置在http模块中,用于定义网站相关参数

  listen                              nginx监听的IP和端口

  server_name                 网站的域名

  location                         用于匹配访问路径作响应的处理

  root                               用于定义网站的根目录

  index                             用于指定网站首页路径

  error_page                    用于指定http错误的错误页路径 ,能够将多个http错误指定到同一个错误页的路径下

 

  3、nginx配置虚拟主机

  nginx配置虚拟主机有三种方法,依次以下:

  一、基于域名,经常使用于外网网站

  1)修改server模块中的server_name参数为网站对应的域名 

  2)在server模块中添加一条location语句,指定网站的根目录路径,如location / { root  html/blog },其中location匹配的/即表明nginx的安装目录路径,root参数指定的路径就是从nginx安装路径开始的网站的根目录路径,若是nginx安装路径为/application/nginx/,则该网站的根目录路径为/application/nginx/html/blog/

  3)在公网DNS服务器添加该网站的域名解析记录

 

  二、基于端口,经常使用于内网网站或公网网站的后台

  1)修改server模块的listen参数的端口设置,如listen  81;listen  172.16.1.41:81,不一样的相同IP下的不一样端口对应不一样网站

  2)添加location记录,配置网站根目录

  

  三、基于IP,通常不用

  1)修改server模块的listen参数的IP设置,如listen    172.16.1.41:80;listen   172.16.1.31:80

  2)添加location记录,配置网站根目录         

  注:一、企业中一般将全部server模块配置在一个单独的文件中,而后在主配置文件中用include参数加载,同时删除主配置文件中的其余的server模块的配置

    二、在配置基于域名的虚拟主机时还能够配置别名,即在server_name参数中配置多个域名以空格分隔

    三、在虚拟主机中启用状态模块须要添加一条虚拟主机配置,添加以下的location语句:location / { stub_status on;access_log off; }

  

  4、nginx日志配置

  一、错误日志

  错误日志的配置遵循以下格式:error_log   错误日志文件路径   记录的错误级别;,

  错误级别通常设置为error,错误日志通常设置在main模块中以统一记录全部错误信息

 

  二、访问日志

  访问日志的配置遵循以下格式:access_log  访问日志路径   日志记录格式的名字;

  访问日志的记录格式配置格式以下:log_format   名字    记录格式

  访问日志通常在server模块中配置,访问日志记录格式通常在http模块配置

  记录格式中有以下参数可使用:

  $remote_addr                   访问网站的客户端IP

  $http_x_forwarded_for     当web服务器前端有代理服务器时,让web服务器记录访问的客户端IP,该配置生效须要在代理服务器上作以下配置:proxy_set_header X-Forwarded-For $remote_addr;

  $remote_user                   客户端用户名称

  $time_local                      记录访问时间与时区

  $request                          用户的http请求起始行信息

  $status                             http状态码,记录请求返回的状态

  $body_bytes_sents         服务器发给客户端的响应body字节数

  $http_referer                     记录这次请求是从哪一个连接跳转过来的

  $http_user_agent             记录客户端访问信息

  

  5、nginx日志轮询切割

  因为nginx没有现成的工具作日志切割,所以须要编写脚本并设置定时任务来完成这项工做,脚本编写以下:

  cat>>/server/scripts/cut_nginx_log.sh<<EOF

  cd /application/nginx/logs/

  #Cut   access  log

  /bin/mv www_access.log   www_access-$(date %F -d -1day).log

  #Reload  nginx

  /application/nginx/sbin/nginx -s  reload

  #Push access  log  to  the backup server

  rsync   -az  /application/nginx/logs/  rsync_backup@172.16.1.41::nginxbackup  --password-file=/etc/rsync.password &

  #Delete  more than  seven days of log

  find /application/nginx/logs/   -type f -mtime +7  -name 'www_access-*.log' -delete

  EOF

  定时任务编写以下:

  crontab  -e

  #cut nginx log  write by  liufeng  2018-3-16

   00  00  *  *  *  /bin/sh  /server/scripts/cut_nginx_log.sh>/dev/null  2>&1

 

  6、nginx的location写法

  格式:location  uri   { 处理动做 }

  uri               访问的资源路径

  location匹配uri时的特殊符号:

  =                 精确匹配

  ~                 区分大小写

  ~*               不区分大小写

  ^~              不作正则匹配

  @               内部调用

  location匹配uri时支持正则表达式,同时匹配有以下规律:

  一、等号最优先匹配如location = /

  二、其次匹配^~如location ^~ /image/

  三、再匹配正则如location ~* \.(gif|jpg|jpeg)$

  四、匹配常规字符串,有正则优先匹配正则如location /documents/

  五、最后匹配默认location /

  

  7、nginx的rewrite写法

  格式:rewrite  正则规则      替换内容    [标记]

  例如:rewrite ^/(.*)$  http://www.baidu.com/$1 permanent

  rewrite可用的标记有如下四种:

  last 本规则匹配完成后,继续向下匹配新的location URI规则

  break 本条规则匹配完即停止,再也不匹配后面的任何规则

  redirect 返回302临时重定向

  permanent 返回301永久重定向

 

  8、nginx配置访问认证

  auth_basic "";                                                                                  弹窗上的提示信息

  auth_basic_user_file /application/nginx/conf/htpasswd;                 认证文件的路径

  htpasswd -cb /application/nginx/conf/htpasswd oldboy 123456     建立认证文件,用户名old,密码123456,htpasswd工具由httpd服务安装产生

  能够配置在http区块,server区块或location语句中

 

  9、nginx链接PHP配置

server { listen 80; server_name blog.etiantian.org; location ~ .*\.(php|php5)?$ { root html/blog; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } }

 

   10、nginx反向代理

http { .... upstream 节点池名称 { ip_hash; #会话保持,让相同的客户端始终访问同一台服务器 server 10.0.0.9:80 weight=1; #weight表示负载均衡中的权重 server 10.0.0.10:80 weight=1; server { .... location / { ..... proxy_pass http://节点池名称; #将访问请求转发给节点池中的服务器  proxy_set_header Host $host; #使用客户端访问请求中的域名向后端web服务器发起请求 proxy_set_header X-Forwarded-For $remote_addr; #将客户端的IP转发给web服务器 } } } }

 

   11、nginx优化

  nginx的优化分为性能优化和安全优化两部分,优化操做以下:

  一、性能优化

  1)修改worker进程数量

  worker进程是nginx用于创建与客户端链接的,worker进程数量越多nginx能够创建的链接越多,但也不是越多越好,通常设置为与CPU核数相等便可,具体操做为修改main区块的worker_processes参数,将其设置为与CPU核数相等。如:worker_process    4

  查看CPU核数的方法有如下三种:

  一、grep -c 'processor' /proc/cpuinfo

  二、grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l,该方法看到的是CPU的颗数

  三、在top命令界面下,按数字1便可看到CPU核数

 

  2)将不一样nginx进程绑定到不一样CPU核心上,充分利用CPU资源

  nginx运行中有时会将不少链接交给正在处理任务的CPU核心上而浪费CPU资源,所以以下作这步优化,下面是四核CPU的操做方法,核心更多的CPU方法相似:worker_cpu_affinity 0001 0010 0100 1000;  

 

  3)修改nginx事件处理模型

  经常使用的TCP链接处理模型有select模型和epoll模型,这两个都是I/O多路复用模型即软件主程序不须要关心TCP链接是否就绪,只须要对就绪的链接进行相应的处理,而链接是否已就绪则有专门的监放任务去处理,监放任务会监测哪些TCP链接已经就绪能够往该链接发送数据或接收该链接中的数据,而后将这样的已就绪链接返回给软件主程序处理。而epool模型比select模型高效的缘由就在与监测任务如何知道链接是否就绪的方式上epoll模型采用的是主动通知的方式,即系统内核会将已就绪的链接告诉epoll监测任务,而select模型则须要本身一个一个查看该链接是否已就绪。所以须要将nginx的事件处理模型修改成epoll模型,具体操做为在events区块中使用use参数指定事件模型为epoll。如:events  { use  epoll; }

 

  4)调整单个worker进程的最大链接数

  该优化步骤的操做为修改events区块中的worker_connections参数,将该参数设置为(nginx最大处理链接数/worker进程的数量)的结果。如:events  { worker_connections  4096; }  

 

  5)调整worker进程最大可以使用的文件描述符数量

  文件描述符是系统用于访问文件的依据,每建立一个文件都要消耗一个文件描述符,而nginx运行过程当中须要建立不少文件,好比日志文件、pid文件、socket文件等等,所以须要让nginx可以尽量多的使用文件描述符,避免由于可用文件描述符不足而报错,具体操做为在main区块中用worker_rlimit_nofile参数指定。如worker_rlimit_nofile   65535;

 

  6)开启文件高效传输模式

  开启nginx的sendfile参数可使文件传输更快,通常会配置tcp_nopush和tcp_nodelay参数一块儿使用,tcp_nopush容许把http response header和文件的开始放在一个文件发布,减小网络报文段的数量,tcp_nodelay让nginx在积累必定量的数据以后再发送。具体操做以下:

  http  {

  sendfile  on;

  tcp_nopush  on;

  tcp_nodelay  on;

}

 

  7)nginx超时相关设置

  设置超时可以让nginx适时的抛弃那些耗时过长的任务转而处理新的任务,能够提升任务处理效率。具体操做以下:

  http  {

  keepalive_timeout  60;                       链接超时时间,保持链接的最大时间

  client_header_timeout  15;      nginx读取客户端请求头信息的超时时间

  client_body_timeout  15;                    nginx读取客户端请求体信息的超时时间

  send_timeout  25l                               nginx响应客户端的超时时间

}

 

  8)限制上传文件大小

  上传文件太大会占用过多的带宽,延长传输时间,所以须要限制客户端上传文件的大小,具体操做以下:

  http  {

  client_max_body_size  8m;

}

 

  9)FastCGI相关优化

  因为nginx与php解释程序经过FastCGI传递数据,所以须要优化相关的buffer和cache的设置,具体操做以下:

  location / {    

    fastcgi_connect_timeout 240;                            nginx链接fastcgi的超时时间    

    fastcgi_send_timeout 240;                                 fastcgi服务端返回数据的超时时间    

    fastcgi_read_timeout 240;                                 nginx从fastcgi服务端读取响应信息的超时时间    

    fastcgi_buffer_size 64K;                                    nginx读取从fastcgi服务端收到的第一部分响应信息的缓冲区大小    

    fastcgi_buffers 4 64K;                                        缓冲区数量与大小    

    fastcgi_busy_buffers_size 128K;                       fastcgi忙时buffer的大小    

    fastcgi_temp_file_write_size 128K;                   fastcgi临时文件大小    

    fastcgi_cache oldboy_nginx;                             开启fastcgi缓存并指定名称   

    fastcgi_cache_path /data/ngx_fcgi_cache   levels=2:2   keys_zone=ngx_fcgi_cache:512m   inactive=1d   max_size=40g    fastcgi_cache缓存目录    

    fastcgi_cache_valid 200 302 1h;(301 1d  any 1m)   应答代码缓存时间    

    fastcgi_cache_min_uses 1;                               请求几回后缓存    

    fastcgi_cache_use_stale error timeout invalid_header http_500;       哪些状况使用过时缓存    

    fastcgi_cache_key  http://$host$request_uri;    定义fastcgi_cache的key
}

 

  10)压缩优化

  启用gzip压缩模块对网页元素进行压缩,以加快用户打开网页的速度,同时减小带宽消耗,具体操做以下:

  http  {

  gzip  on;                                       开启gzip压缩

  gzip_min_length  1K;                   启用压缩的文件最小大小

  gzip_buffers  4  32K;                    gzip压缩的buffer个数和大小

  gzip_htto_version  1.1;                 使用的gzip版本

  gzip_comp_level  9;                      压缩的级别

  gzip_types  text/css  text/xml  application/javascript;   指定须要压缩的文件类型

  gzip_vary  on;                                容许缓存服务器缓存nginx压缩后的页面

}

 

  11)缓存优化

  企业网站的网页元素可能很长时间都不会更换,所以当第一次客户端从网站将这些元素下载下来以后应该将这些内容保存必定时间,这样既能够加快用户打开网页的速度,也能够节省企业的带宽,具体操做就是启用nginx的expires缓存,如:location  ~  .*\.(gif|jpg|jgeg|png|bmp|swf)$  {

  expires  3650d;      #将全部的图片元素缓存10年

}

  expires缓存虽然有不少好处,可是也有一个问题即当网站有更新而缓存没有到期用户就没法获取网站最新的内容,解决这个问题有两个方法:

  一、常常更新的元素将缓存时间设置的短一点

  二、将更新的元素的名字修改成新的文件名

    

  12)日志优化

  

 

  二、安全优化

  1)隐藏nginx版本号

  因为软件都会存在漏洞,而不一样版本的nginx的漏洞是不一样的,若是让攻击者知道了服务器上nginx的版本号就能利用特定的漏洞攻击服务器,所以必须隐藏nginx的版本号,具体操做就是在http区块中加上以下配置:server_tokens off;

  

  2)更改默认用户

  nginx的运行用户若是权限过大,当攻击者取得nginx的控制权就会得到很大的服务器操做权限,所以运行nginx的用户必须权限最小化,具体操做就是修改main区块中user参数,将运行用户设置为普通用户。如:user  nginx;

相关文章
相关标签/搜索