• Nginx 安装 配置 使用


     

    Nginx 安装 配置 使用

    基本的HTTP服务器特性

    • 处理静态文件,索引文件以及自动索引;打开文件描述符缓存(缓存元数据和文件描述符,下一次可以直接从内存找到数据或者文件的位置);
    • 使用缓存加速反向代理;简单负载均衡以及容错(后端服务的健康状况检查);
    • 远程FastCGI,uwsgi,SCGI,和memcached服务的缓存加速支持;简单的负载均衡以及容错;
    • 模块化的架构。过滤器包括gzip压缩、ranges支持、chunked响应、XSLT,SSI以及图像缩放。在SSI 过滤器中,一个包含多个SSI的页面,如果经由FastCGI或反向代理处理,可被并行处理;
    • 支持SSL,TLS SNI。 
      Tengine(淘宝的nginx或叫tnginx,整合非常多的第三方插件) 
      varnish:提供缓存,有限内存缓存(使用算法使性能更好) 
      squid:它和varnish就好比httpd和nginx 
      nginx:其缓存功能保存到磁盘中 
      已经附带了memcached,可以直接管理memcached 
      httpd:既支持磁盘缓存,有支持内存缓存 

      其他的HTTP服务器特性

    • 基于名字和IP的虚拟主机;
    • Keep-alive和pipelined连接支持;
    • 灵活的配置;
    • 重新加载配置以及在线升级时,不需要中断正在处理的请求; 
      (新的连接建立是使用新的配置,老的连接则在在下一次请求时候使用新配置,这种方式较nginx的热部署,平滑升级)
    • 自定义访问日志格式,带缓存的日志写操作(先将日志放于缓存,然后存在磁盘)以及快速日志轮转(日志滚动);
    • 3xx-5xx错误代码重定向;
    • 重写(rewrite)模块:使用正则表达式改变URI;
    • 根据客户端地址执行不同的功能;(根据客户端的类型比如手机设备返回wrap页面)
    • 基于客户端IP地址和HTTP基本认证机制的访问控制;
    • 支持验证HTTP referer;(ngx_http_referer_module模块允许拦截“Referer”请求头中含有非法值的请求,阻止它们访问站点。 需要注意的是伪造一个有效的“Referer”请求头是相当容易的, 因此这个模块的预期目的不在于彻底地阻止这些非法请求,而是为了阻止由正常浏览器发出的大规模此类请求。 还有一点需要注意,即使正常浏览器发送的合法请求,也可能没有“Referer”请求头。比如你的网站A的图片被网站B盗链了,当访问B的时候会产生对A的大量的访问,导致A访问量过大,用此方式修改只允许站内连接)
    • 支持PUT、DELETE、MKCOL、COPY以及MOVE方法;
    • 支持FLV流和MP4流;
    • 速度限制;
    • 来自同一地址的同时连接数或请求数限制;
    • 嵌入Perl语言。 

      架构和扩展性

    • 一个主进程和多个工作进程,工作进程以非特权用户运行;
    • 支持的事件机制:kqueue(FreeBSD 4.1+)、epoll(Linux 2.6+)、rt signals(realtime signals Linux 2.2.19+)、/dev/poll(Solaris 7 11/99+)、event ports(Solaris 10)、select以及poll;
    • 众多支持的kqueue特性包括EV_CLEAR、EV_DISABLE(临时禁止事件)、NOTE_LOWAT、EV_EOF,可用数据的数量,错误代码;
    • 支持sendfile(FreeBSD 3.1+, Linux 2.2+, Mac OS X 10.5+)、sendfile64(Linux 2.4.21+)和sendfilev(Solaris 8 7/01+);
    • 文件AIO(FreeBSD 4.3+, Linux 2.6.22+);
    • DIRECTIO (FreeBSD 4.4+, Linux 2.4+, Solaris 2.6+, Mac OS X);
    • 支持Accept-filters(FreeBSD 4.1+, NetBSD 5.0+,可以只接受有限的连接 )和 TCP_DEFER_ACCEPT(Linux 2.4+);
    • 10000个非活跃的HTTP keep-alive连接仅占用约2.5M内存;
    • 尽可能避免数据拷贝操作(如sendfile)。 
      上图中master监控worker进程运行状况。master是由管理员启用的,加载配置文件来进行全局管理,worker是使用普通用户,由master发起,是master的子进程。nginx是高度模块化的,向上图中worker进程中有很多模块,用户发起的请求交给worker进程,而其本身交给自己的模块进行相应的处理,这些模块以流水线的形式进行工作的,比如第一个模块解析请求的头部, 第二个取得数据,第三个创建相应。 
      上面的描述: 
      重新加载配置以及在线升级时,不需要中断正在处理的请求 
      详细的过程是,当新的配置文件加载到nginx时,nginx建立新的worker进程(使用新的配置文件)来相应新的请求,而原来的worker进程在完成以前的请求之后被master kill掉,于是动态缓慢加载新的配置文件

    完成内容

    • 主进程主要完成如下工作: 
      1. 读取并验正配置信息;
      2. 创建、绑定及关闭套接字;
      3. 启动、终止及维护worker进程的个数;
      4. 无须中止服务而重新配置工作特性;
      5. 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;(类似重新加载配置文件加载,新版本的master兼容老版本的worker)
      6. 重新打开日志文件,实现日志滚动;
      7. 编译嵌入式perl脚本;
    • worker进程主要完成的任务包括: 
      1. 接收、传入并处理来自客户端的连接;
      2. 提供反向代理及过滤功能;
      3. nginx任何能完成的其它任务; 
        cache loader进程主要完成的任务包括:
      4. 检查缓存存储中的缓存对象;
      5. 使用缓存元数据建立内存数据库;
    • cache manager进程的主要任务: 
      1. 缓存的失效及过期检验; 
        Nginx的配置有着几个不同的上下文:main(对任何配置都生效,全局的)、http(包括server,upstream实现反向代理,location定义访问相应),还有实现邮件服务反向代理的mail。配置语法的格式和定义方式遵循所谓的C风格,因此支持嵌套,还有着逻辑清晰并易于创建、阅读和维护等优势。
    • sendfile: 
      步骤一:系统调用read导致了从用户空间到内核空间的上下文切换。DMA模块从磁盘中读取文件内容,并将其存储在内核空间的缓冲区内,完成了第1次复制。 
      步骤二:数据从内核空间缓冲区复制到用户空间缓冲区,之后系统调用read返回,这导致了从内核空间向用户空间的上下文切换。此时,需要的数据已存放在指定的用户空间缓冲区内(参数tmp_buf),程序可以继续下面的操作。 
      步骤三:系统调用write导致从用户空间到内核空间的上下文切换。数据从用户空间缓冲区被再次复制到内核空间缓冲区,完成了第3次复制。不过,这次数据存放在内核空间中与使用的socket相关的特定缓冲区中,而不是步骤一中的缓冲区。 
      步骤四:系统调用返回,导致了第4次上下文切换。第4次复制在DMA模块将数据从内核空间缓冲区传递至协议引擎的时候发生,这与我们的代码的执行是独立且异步发生的。你可能会疑惑:“为何要说是独立、异步?难道不是在write系统调用返回前数据已经被传送了?write系统调用的返回,并不意味着传输成功——它甚至无法保证传输的开始。调用的返回,只是表明以太网驱动程序在其传输队列中有空位,并已经接受我们的数据用于传输。可能有众多的数据排在我们的数据之前。除非驱动程序或硬件采用优先级队列的方法,各组数据是依照FIFO的次序被传输的(图1中叉状的DMA copy表明这最后一次复制可以被延后)。 
      采用sendfile可以很好地避免在将数据有DMA传入用户空间,再由用户空间传入内核空间的socket缓冲: 
      步骤一:mmap系统调用导致文件的内容通过DMA模块被复制到内核缓冲区中,该缓冲区之后与用户进程共享,这样就内核缓冲区与用户缓冲区之间的复制就不会发生。 
      步骤二:write系统调用导致内核将数据从内核缓冲区复制到与socket相关联的内核缓冲区中。 
      步骤三:DMA模块将数据由socket的缓冲区传递给协议引擎时,第3次复制发生。

    nginx安装:

    >本文采用编译安装的方式
    1. 解决依赖关系 
      编译安装nginx需要事先需要安装开发包组”Development Tools”和 “Development Libraries”。同时,还需要专门安装pcre-devel包:

       yum -y install zlib zlib-devel openssl openssl-devel pcre-devel gd-devel
    2. 添加用户

      groupadd -r nginx
      useradd -r -g nginx nginx
    3. 编译安装

      ./configure 
      --prefix=/usr
      --sbin-path=/usr/sbin/nginx
      --conf-path=/etc/nginx/nginx.conf
      --error-log-path=/var/log/nginx/error.log
      --http-log-path=/var/log/nginx/access.log
      --pid-path=/var/run/nginx.pid
      --lock-path=/var/run/nginx.lock
      --http-client-body-temp-path=/var/cache/nginx/client_temp
      --http-proxy-temp-path=/var/cache/nginx/proxy_temp
      --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
      --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
      --http-scgi-temp-path=/var/cache/nginx/scgi_temp
      --user=nginx
      --group=nginx
      --with-http_ssl_module
      --with-http_realip_module
      --with-http_addition_module
      --with-http_sub_module
      --with-http_dav_module
      --with-http_flv_module
      --with-http_mp4_module
      --with-http_gunzip_module
      --with-http_gzip_static_module
      --with-http_random_index_module
      --with-http_secure_link_module
      --with-http_stub_status_module
      --with-http_auth_request_module
      --with-mail
      --with-mail_ssl_module
      --with-file-aio
      --with-ipv6
      --with-http_v2_module
      --with-http_image_filter_module
      --with-pcre
      --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
      make
      make install
    4. 配置支持Centos7 systemctl服务管理

      vim /lib/systemd/system/nginx.service

      添加下面内容

      [Unit]
      Description=The NGINX HTTP and reverse proxy server
      After=syslog.target network.target remote-fs.target nss-lookup.target

      [Service]
      Type=forking
      PIDFile=/var/run/nginx.pid
      ExecStartPre=/usr/sbin/nginx -t
      ExecStart=/usr/sbin/nginx
      ExecReload=/bin/kill -s HUP $MAINPID
      ExecStop=/bin/kill -s QUIT $MAINPID
      PrivateTmp=true

      [Install]
      WantedBy=multi-user.target

      可以通过systemctl status start stop来看nginx服务内容

    5. 配置nginx

      vim /etc/nginx/nginx.conf

      #在http节点下,添加upstream节点

      upstream mysite {
      server 172.20.13.229:8081;
      server 172.20.13.230:8082;
      }

      #修改server节点下的location节点

      location / {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_buffering off;
      proxy_pass http://mysite;
      }

      #主要内容在mysite中

    完成:)

  • 相关阅读:
    各大搜索引擎的User-Agent
    xxx couldn't be loaded because it has not been added to the build settings.
    C#解压、压缩RAR文件
    [转载]C# Random 生成不重复随机数
    [转载]如何打一手好Log
    MongoDB服务器启动异常 1067
    [转载]Asp.net MVC2 与 MVC3 路由调试好帮手RouteDebug 与 RouteDebugger
    [转载]C#中获取时间戳(UnixTime)的方法
    C# winform 弹出输入框
    设计与框架
  • 原文地址:https://www.cnblogs.com/owenma/p/5915340.html
Copyright © 2020-2023  润新知