西湖鱼 发表于 2018-11-14 09:30:24

Nginx介绍及安装配置

  Nginx介绍
  如果听说过Apache软件那么对于Nginx也会很快就熟悉的和Apache一样nginx是开源的支持高性能高并发的WWW服务、代理服务软件以及电子邮件代理服务器并在一个BSD-like协议下发行由俄罗斯Igor Sysoev所开发开始供俄国大型的入口网址及搜索引擎Rambler使用。
  nginx占有内存小并发能力强特别是静态资源且功能丰富而流行起来。
  从软件的功能应用方面Nginx不但是一个优秀的Web服务软件还可以具有反向代理负载均衡能和缓存服务功能。代理方面类似专业的LVS负载以及Happroxy软件缓存服务功能方面又类似squid专业缓存软件。
  Nginx可以运行在Unix、Linux、BSD等操作系统中最近LNMP比较流行
Nginx特点

[*]  可针对静态资源高速高并发及缓存
[*]  可使用反向代理加速并且可进行数据缓存
[*]  具有简单负载均衡、节点健康检查和容错的功能
[*]  支持远程FastCGI服务的缓存加速
[*]  支持FastCGI Uwsgi SCGI、and Memcached Servers的加速和缓存
[*]  支持ssl 、tls、sni
[*]  具有模块的架构过滤器包括gzip压缩、ranges支持、chunked响应、XSLT、SSI及图像缩放等功能。在SSI过滤器中一个包含多个SSI的页面如果经由FastCGI或反向代理出来可被并行处理
  它所具备的其他WWW服务特性如下

[*]  支持基于名字、端口以及IP的多虚拟主机的站点
[*]  支持Keep-alive和pipelined的连接
[*]  可进行简单、方便、灵活的配置和管理
[*]  支持Nginx配置并且在代码上线时可平滑重启不中断业务访问
[*]  可自定义访问日志格式临时缓冲写日志操作快速日志轮询及通过rsyslog除了日志
[*]  可利用信号控制Nginx进程
[*]  支持3xx-5xx http状态码重定向
[*]  支持rewrite模块支持URI重写及正则表达式匹配
[*]  支持基于客户端IP地址和HTTP基本认知的访问控制
  Nginx作为Web主要的应用场景
  使用Nginx运行HTML\JS\CSS,小图片等静态数据类似lighttpd软件
  Nginx结合FastCGI运行PHP等动态程序
  Nginx结合tomcat/resin等支持Java动态程序
  Nginx、Apache和Lighttpd软件的优缺点
  Apache软件的特点

[*]  2.2版本非常稳定强大官方说其2.4版本性能更强
[*]  Prefork模式取消进程创建开销性能很高
[*]  处理动态业务数据时因管理到后端的引擎和数据库瓶颈不在于Apache本身上
[*]  高并发时消耗系统资源相对多一些
[*]  基于传统的select模型高并发能力有限
[*]  支持扩展库可通过DSO、apxs方法编译安装额外的插件功能不需要重新编译Apache
[*]  功能多更稳当更安全插件也多
  Nginx软件的特点

[*]  基于异步网络I/O模型epoll、kqueue)
[*]  具备支持高性能高并发的特性并发连接可大数万
[*]  对小文件小于1MB的静态文件高并发支持很好性能很高
[*]  不支持类似Apache的DSO模式扩展库必须编译进主程序缺点
[*]  进程占用系统资源比较低
[*]  支持Web、反向proxy、cache三大重点功能并且都很优秀
[*]  市场份额在昨年快速增加
  Lighttpd软件特点

[*]  基于异步网络I/O模型性能并发都和Nginx相近
[*]  扩展库是SO模式比Nginx灵活
[*]  目前国内使用率比较低安全性没有Apache和Nginx好
[*]  通过插件mod_secdownload可实现文件URL地址加密有点
[*]  社区不活跃市场份额较低

  下面对各类web服务器在动态数据性能上的对比从下图中科院看出在出来动态数据时三者的差距不大Apache更有优势一点。这是英文处理动态数据的能力取决于PHPJava和后端的数据库提供的服务能力也就是说瓶颈不在web服务器上。一般情况下普通PHP引擎支持的并发连接参考值为300-1000Java引擎的并发连接参考值为300-1500而数据库的并发连接参考值为300-1500.业务场景及网站架构不通并发连接数也会有上下浮动。这些数字可供初学参考

  为什么Nginx总体性能比Apache高
  Nginx使用最新的epoll和kqueue异步网络I/O模型而Apache则使用select模型目前Linux能承受的高并发访问的squid和memcached都是采用的epoll模型
  下面使用比喻来说明此问题
  第一个比喻
  假设你在大学读书住的宿舍楼有很多间房间你的朋友要来找你select版宿管大妈就会带着你的朋友挨个房间去找直到找到你的朋友为止。而epoll版宿管大妈会先记下每位入住同学的房间号你的朋友来找你是只要告诉你朋友你在那个房间即可不用亲自带着你的朋友满宿舍找人了。如果同时来了100个人。都要找自己住这个宿舍楼的同学时select版和epoll版宿管大妈谁的效率高。显而易见
  第二个比喻
  select的调用复杂度是线性的即0n。举个例子一个保姆照看一群孩子如果有孩子是否需要袅袅比作网络I/O事件select的作用就好比这个保姆挨个询问每个孩子你要尿尿吗如果孩子回答是保姆则把孩子领出来放到一个地方。当所有孩子询问完自后则保姆领着这些要尿尿的孩子去上厕所处理网络I/O事件
  还是以保姆照看孩子为例在epoll机制下保姆不再需要挨个询问每个孩子是否要尿尿。取而代之的是每个孩子如果自己需要尿尿的时候自己主动的站到事先约好的地方而保姆职责就是查看事先约定好的地方是否有孩子如果有小孩则带着孩子去上测试网络事件处理因此epoll的这种机制能够高效的处理成千上万的并发连接而且性能不会随着连接数目的增加而下降太多

  业务场景如何选用Web软件
  静态业务若是高并发场景尽量采用Nginx或Lighttpd首选Nginx
  动态业务理论上采用Nginx和Apache均可建议选择Nginx要避免相同业务服务软件多样化额外增加维护成本。动态业务可以用Nginx兼做前端代理再更加页面元素的类型或目录向后转发到后端相应的服务器进行处理
  如果既有静态业务又有动态业务就采用Nginx
  Nginx的安装
  系统环境
  # cat /etc/redhat-release
  Centos6.7
  # uname -rm
  2.6.32-573.el6.x86_64x86_64
  Nginx所需要的库环境
  # yum install pcre-devel openssl-devle -y
  # rpm -aq pcre-deve pcre openssl-devel openssl
  pcre-7.8-7.el6.x86_64
  openssl-1.0.1e-42.el6.x86_64
Nginx软件包下载安装
  获取nginx在nginx.org官网上可以获得nginx的各种版本
  mkdir/home/oldboy/tools
  cd/home/oldboy/tools/
  wget http://nginx.org/download/nginx-1.6.3.tar.gz
  tarxf nginx-1.6.3.tar.gz
  tarxf nginx-1.6.3.tar.gz
  useradd-M -s /sbin/nologin nginx
  ./configure--prefix=/application/nginx-1.6.3 --user=nginx --group=nginx--with-http_ssl_module --with-http_stub_status_module
make
make install
  ln-s /application/nginx-1.6.3/ /application/nginx
  # ss -lntup|grep nginx
  # /application/nginx/sbin/nginx
  # ss -lntup|grep nginx
  tcp    LISTEN    0      128                  *:80                  *:*   users:(("nginx",4804,6),("nginx",4805,6))
  使用浏览器输入服务器ip地址验证是否安装启动成功

  也可以在服务器本机上使用curl命令进行测试如下
  # curl -I 10.0.0.8
  HTTP/1.1200 OK
  Nginx的配置
  在conf目录下面有配置文件过滤掉default的如下
  # pwd
  /application/nginx/conf
  # tree|grep -v default
  .
  ├── fastcgi.conf
  ├── fastcgi_params
  ├── koi-utf
  ├── koi-win
  ├── mime.types
  ├── nginx.conf
  ├── scgi_params
  ├── uwsgi_params
  └── win-utf
  这里除了nginx.conf其他的配置文件保持默认即可
  Nginx.conf文件介绍
  http{
  include       mime.types;
  default_typeapplication/octet-stream;
  sendfile      on;
  keepalive_timeout65;
  server{#server{}定义了虚拟主机
  listen       80;#监听端口
  server_namelocalhost;#监听的域名
  location / {            #location{}是用来为匹配的URI进行配置URI即语法中的"/uri/" location / 匹配任何查询因为任何查询都是以/开头
  root   html;#知道对应的uri的资源查找路径这html为相对路径完整路径为/application/nginx/html/
  indexindex.html index.htm; #指定index文件的名称可以配置多个以空格分开如果有多个按照顺序查找
  }
  error_page   500 502 503 504/50x.html;
  location = /50x.html {
  root   html;
  }
  }
  }
  Nginx基于域名服务配置
  # cat nginx.conf
  worker_processes1;
  events{
  worker_connections1024;
  }
  http{
  include       mime.types;
  default_typeapplication/octet-stream;
  sendfile      on;
  keepalive_timeout65;
  server {
  listen       80;
  server_namewww.etiantian.org;
  location / {
  root   html/www;
  indexindex.html index.htm;
  }
  }
  server {
  listen       80;
  server_namebbs.etiantian.org;
  location / {
  root   html/bbs;
  indexindex.html index.htm;
  }
  }
  server {
  listen       80;
  server_nameblog.etiantian.org;
  location / {
  root   html/blog;
  indexindex.html index.htm;
  }
  }
  }
  创建域名目录和主页文件index.html
  # mkdir ../html/{bbs,www,blog}
  # ls ../html/
  50x.htmlbbs blogindex.htmlwww
  # for i in bbs www blog;do echo $i >../html/$i/index.html;done
  # tree ../html/
  ../html/
  ├── 50x.html
  ├── bbs
  │   └── index.html
  ├── blog
  │   └── index.html
  ├── index.html
  └── www
  └── index.html
  3directories, 5 files
  # cat ../html/blog/index.html
  Blog
  重启nginx服务
  # ../sbin/nginx -t
  nginx:the configuration file /application/nginx-1.6.3/conf/nginx.conf syntax is ok
  nginx:configuration file /application/nginx-1.6.3/conf/nginx.conf test is successful

  # ../sbin/nginx -s>  本机测试nginx服务器域名访问
  # curl www.etiantian.org
  www
  # curl bbs.etiantian.org
  bbs
  # curl blog.etiantian.org
  blog
  # cat /etc/hosts
  10.0.0.8www.etiantian.orgbbs.etiantian.org blog.etiantian.org
  也可以在widows上给hosts做解析使用浏览器访问域名来测试。这里不列出
  安装错误&解决方法



  模块介绍

  Nginx基于端口的虚拟主机
  基于端口的虚拟主机在生产环境中不多见偶尔会用到一般是为了公司内网提供访问的如OA系统、网站程序后台、CMS发布后台、MySQL的web客户端。使用特殊端口多是从安全上考虑的
  配置虚拟主机监听的端口
  # vim nginx.conf
  sendfile      on;
  keepalive_timeout65;
  server {
  listen       8001;
  server_namebbs.etiantian.org;
  location / {
  root   html/bbs;
  indexindex.html index.htm;
  }
  }
  server {
  listen       8002;
  server_namewww.etiantian.org;
  location / {
  root   html/www;
  indexindex.html index.htm;
  }
  }
  server {
  listen       8003;
  server_nameblog.etiantian.org;
  location / {
  root   html/blog;
  "nginx.conf"34L, 759C written
  # ../sbin/nginx -t
  nginx:the configuration file /application/nginx-1.6.3/conf/nginx.conf syntax is ok
  nginx:configuration file /application/nginx-1.6.3/conf/nginx.conf test is successful

  # ../sbin/nginx -s>  # netstat -lntup
  ActiveInternet connections (only servers)
  ProtoRecv-Q Send-Q Local Address            Foreign Address            State       PID/Program name
  tcp      0   0 0.0.0.0:8001               0.0.0.0:*                   LISTEN      3763/nginx
  tcp      0   0 0.0.0.0:8002               0.0.0.0:*                   LISTEN      3763/nginx
  tcp      0   0 0.0.0.0:8003               0.0.0.0:*                   LISTEN      3763/nginx
  tcp      0   0 0.0.0.0:22               0.0.0.0:*                   LISTEN      1317/sshd
  tcp      0   0 :::22                      :::*                        LISTEN      1317/sshd
  # curl www.eitantian.org
  curl:(6) Couldn't resolve host 'www.eitantian.org'
  # curl www.etiantian.org:8002
  www.etiantian.org
  基于Ip的虚拟主机
  server {
  listen       10.0.0.9:80;
  server_namewww.etiantian.org;
  location / {
  root   html/www;
  indexindex.html index.htm;
  }
  }
  Nginx别名配置
  利用别名来监控集群下面的RS的URL。可以在监控服务器里面配置hosts里面配置别名解析用来监控
  server {
  listen       80;
  server_namewww.etiantian.org etiantian.org
  location / {
  root   html/www;
  indexindex.html index.htm;
  }
  }
  在hosts解析里面配置etiantian.org解析重启服务即可
  第二种方法就是rewrite重定向
  Nginx的配置文件优化
  # cat nginx.conf
  worker_processes1;
  events{
  worker_connections1024;
  }
  http{
  include       mime.types;
  default_typeapplication/octet-stream;
  sendfile      on;
  keepalive_timeout65;
  include extra/www.conf;
  include extra/blog.conf;
  include extra/bbs.conf;
  }
  创建extra目录
  # mkdir extra
  创建配置文件
  #sed -n '18,25p' nginx.conf.name >>extra/www.conf
  #sed -n '10,17p' nginx.conf.name >extra/bbs.conf
  #sed -n '26,33p' nginx.conf.name >>extra/blog.conf
  测试结果
  # ../sbin/nginx -t
  nginx:the configuration file /application/nginx-1.6.3/conf/nginx.conf syntax is ok
  nginx:configuration file /application/nginx-1.6.3/conf/nginx.conf test is successful

  # ../sbin/nginx -s>  # curl www.etiantian.org
  www.etiantian.org
  # curl blog.etiantian.org
  blog.etiantian.org
  # curl bbs.etiantian.org
  bbs.etiantian.org
  Nginx的状态模块
  --with-http_stub_status_module记录nginx的基本访问信息让使用者了解nginx的工作状态
  # ll extra/
  total16
  -rw-r--r--1 root root 185 May 30 15:06 bbs.conf
  -rw-r--r--1 root root 187 May 30 15:06 blog.conf
  -rw-r--r--1 root root 168 May 30 15:33 status.conf
  -rw-r--r--1 root root 199 May 30 15:13 www.conf
  # cat extra/status.conf
  server {
  listen       80;
  server_namestatus.etiantian.org;
  location / {
  stub_status on;
  access_log off;
  }
  }
  # cat nginx.conf
  worker_processes1;
  events{
  worker_connections1024;
  }
  http{
  include       mime.types;
  default_typeapplication/octet-stream;
  sendfile      on;
  keepalive_timeout65;
  include extra/www.conf;
  include extra/blog.conf;
  include extra/bbs.conf;
  include extra/status.conf;
  }
  检查状态信息

  第一个server 表示nginx一共处理了43个连接
  第二个accepts 表示nginx从启动到现在成功创建了43次握手
  请求丢失数=握手数-成功连接数可以看到这里没有丢失
  第三个handle request表示总共处理了27次请求
  Reading 表示nginx读取客户端的Header信息数
  Writing 表示发回给客户端的Header信息数
  Waiting 表示已经处理完正在等候下一次请求指令的驻留连接
  Nginx增加错误日志
  常见的有【debug|info|notice|warn|error|crit|alert|emerg】级别越高信息量越小。工作场景一般是warn|error|crit|这三个级别注意不要配置info等低级别的会带来I/O消耗
  error_log默认配置为
#default:error_logs/error.logerror;
  可放置的标签段为
#context:main,http,server,location
  Nginx的访问日志参数
  可以查看nginx.conf.default配置文件里面有记录日志的详细格式。

  Nginx日志格式中默认的参数配置如下
  log_formatmain '$remote_addr - $remote_user [$time_local] "$request"
  '
  '$status $body_bytes_sent"$http_referer" '
  '"$http_user_agent""$http_x_forwarded_for"';

$server_name虚拟主机名称。
      $remote_addr远程客户端的IP地址。
      -空白用一个“-”占位符替代历史原因导致还存在。
      $remote_user远程客户端用户名称用于记录浏览者进行身份验证时提供的名字如登录百度的用户名scq2099yt如果没有登录就是空白。
      [$time_local]访问的时间与时区比如18/Jul/2012:17:00:01+0800时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。
      $request请求的URI和HTTP协议这是整个PV日志记录中最有用的信息记录服务器收到一个什么样的请求
      $status记录请求返回的http状态码比如成功是200。
      $uptream_statusupstream状态比如成功是200.
      $body_bytes_sent发送给客户端的文件主体内容的大小比如899可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。
      $http_referer记录从哪个页面链接访问过来的。
      $http_user_agent客户端浏览器信息
      $http_x_forwarded_for客户端的真实ip通常web服务器放在反向代理的后面这样就不能获取到客户的IP地址了通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中可以增加x_forwarded_for信息用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
rewrite练习
  http{
  # 定义image日志格式
  log_format imagelog '[$time_local] '$image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
  # 开启重写日志
  rewrite_log on;
  server {
  root /home/www;
  location/ {
  # 重写规则信息
  error_loglogs/rewrite.log notice;
  # 注意这里要用‘’单引号引起来避免{}
  rewrite'^/images/({2})/({5})/(.*)\.(png|jpg|gif)$'/data?file=$3.$4;
  # 注意不能在上面这条规则后面加上“last”参数否则下面的set指令不会执行
  set $image_file$3;
  set $image_type$4;
  }
  location/data {
  # 指定针对图片的日志格式来分析图片类型和大小
  access_loglogs/images.log mian;
  root/data/images;
  # 应用前面定义的变量。判断首先文件在不在不在再判断目录在不在如果还不在就跳转到最后一个url里
  try_files /$arg_file/image404.html;
  }
  location = /image404.html {
  # 图片不存在返回特定的信息
  return 404 "imagenot found\n";
  }
  }
  对形如/images/ef/uh7b3/test.png的请求重写到/data?file=test.png于是匹配到location/data先看/data/images/test.png文件存不存在如果存在则正常响应如果不存在则重写tryfiles到新的image404 location直接返回404状态码。
  例2
  rewrite^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$/resizer/$1.$4?width=$2&height=$3? last;
  对形如/images/bla_500x400.jpg的文件请求重写到/resizer/bla.jpg?width=500&height=400地址并会继续尝试匹配location。
  常用的正则
  .匹配除换行符以外的任意字符
  ?重复0次或1次
  +重复1次或更多次
  *重复0次或更多次
  \d匹配数字
  ^匹配字符串的开始
  $匹配字符串的介绍
  {n}重复n次
  {n,}重复n次或更多次
  匹配单个字符c
  匹配a-z小写字母的任意一个
  小括号()之间匹配的内容可以在后面通过$1来引用$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
  flag标志位
  last : 相当于Apache的标记表示完成rewrite
  break : 停止执行当前虚拟主机的后续rewrite指令集
  redirect : 返回302临时重定向地址栏会显示跳转后的地址
  permanent : 返回301永久重定向地址栏会显示跳转后的地址
  因为301和302不能简单的只返回状态码还必须有重定向的URL这就是return指令无法返回301,302的原因了。
这里 last 和 break 区别有点难以理解
  last一般写在server和if中而break一般使用在location中
  last不终止重写后的url匹配即新的url会再从server走一遍匹配流程而break终止重写后的匹配
  break和last都能组织继续执行后面的rewrite指令

页: [1]
查看完整版本: Nginx介绍及安装配置