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中

完成:)

原文地址:https://www.cnblogs.com/owenma/p/5915340.html