【原创】nginx入门

 

 

1、简介

Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2018年08月28日发布1.15.3版本。html

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。前端

2、功能概述

一、HTTP基础功能:

    处理静态文件,索引文件以及自动索引;nginx

    反向代理加速(无缓存),简单的负载均衡和容错;c++

    FastCGI,简单的负载均衡和容错;web

    模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;算法

    SSL 和 TLS SNI 支持;apache

二、IMAP/POP3 代理服务功能:

    使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;后端

    使用外部 HTTP 认证服务器认证用户后链接重定向到内部的 SMTP 后端;浏览器

    认证方法:缓存

    POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;

    IMAP: IMAP LOGIN;

    SMTP: AUTH LOGIN PLAIN CRAM-MD5;

    SSL 支持;

    在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;

三、支持的操做系统:

    FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;

    Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;

    Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;

    MacOS X (10.4) PPC;

四、结构与扩展:

    一个主进程和多个工做进程。工做进程是单线程的,且不须要特殊受权便可运行;

    kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;

    kqueue支持的不一样功能包括 EV_CLEAR, EV_DISABLE (临时禁止事件), NOTE_LOWAT, EV_EOF, 有效数据的数目,错误代码;

    sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;

    输入过滤 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;

    10,000 非活动的 HTTP keep-alive 链接仅须要 2.5M 内存。

    最小化的数据拷贝操做;

五、其余HTTP功能:

    基于IP 和名称的虚拟主机服务;

    Memcached 的 GET 接口;

    支持 keep-alive 和管道链接;

    灵活简单的配置;

    从新配置和在线升级而无须中断客户的工做进程;

    可定制的访问日志,日志写入缓存,以及快捷的日志回卷;

    4xx-5xx 错误代码重定向;

    基于 PCRE 的 rewrite 重写模块;

    基于客户端 IP 地址和 HTTP 基本认证的访问控制;

    PUT, DELETE, 和 MKCOL 方法;

    支持 FLV (Flash 视频);

带宽限制;

3、安装与启动

命令:

yum install -y gcc gcc-c++  pcre pcre-devel zlib zlib-devel # 安装依赖

cd /usr/local/src

wget http://nginx.org/download/nginx-1.15.3.tar.gz # 下载源代码

tar -xvzf nginx-1.15.3.tar.gz

cd nginx-1.15.3

./configure --prefix=/usr/local/nginx

make && make install #编译、安装

启动:/usr/local/nginx/sbin/nginx

测试配置文件:/usr/local/nginx/sbin/nginx –t

重启:/usr/local/nginx/sbin/nginx -s reopen

从新载入配置文件:/usr/local/nginx/sbin/nginx -s reload

快速关闭:/usr/local/nginx/sbin/nginx -s stop

优雅关闭:/usr/local/nginx/sbin/nginx -s quit

访问:

http://192.168.141.130/

 

 

4、配置示例

1)、反向代理

正向代理-转发代理(forward proxy):

 

 

反向代理(reverse proxy):

 

 

配置:

    server {

        listen       80;

        server_name  fxdl.test.com;

 

        location /fxdl {

            proxy_redirect off;

            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_pass http://192.168.141.130:8080/fxdl;

        }

    }

  

2)、动静分离

 

 

配置:

    server {

        listen       80;

        server_name  djfl.test.com;

 

        location ^~ /static/

        {

            alias /usr/local/nginx/djfl/;

            break;

        }

 

        location /djfl {

            proxy_redirect off;

            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_pass http://192.168.141.130:8080/djfl;

        }

}

  

3)、负载均衡

 

 

配置:

upstream fzjh

{

    server 192.168.141.130:8080;

    server 192.168.141.130:9090;

}   

server

{

        listen       80;

        server_name  fzjh.test.com;

       

        location ^~ /static/

        {

            alias /usr/local/nginx/fzjh/;

            break;

        }

 

        location /fzjh {

            proxy_redirect off;

            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_pass http://fzjh/fzjh;

        }

    }

  

负载均衡算法:

Nginx的upstream目前支持如下几种方式的分配

(1)、轮询(默认)

每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器down掉,能自动剔除。

(2)、weight

指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况。

(3)、ip_hash

每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session的问题。

(4)、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

(5)、url_hash(第三方)

按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

4)、FastCGI

FastCGI是一个可伸缩地、高速地在HTTP服务器和动态脚本语言间通讯的接口(FastCGI接口在Linux下是socket(能够是文件socket,也能够是ip socket)),主要优势是把动态语言和HTTP服务器分离开来。多数流行的HTTP服务器都支持FastCGI,包括Apache、Nginx和lightpd。

同时,FastCGI也被许多脚本语言所支持,比较流行的脚本语言之一为PHP。FastCGI接口方式采用C/S架构,能够将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,能够将其直接交付给FastCGI进程执行,而后将获得的结构返回给浏览器。这种方式可让HTTP服务器专注地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提升了整个应用系统的性能。

FastCGI的重要特色:

一、FastCGI是HTTP服务器和动态脚本语言间通讯的接口或者工具。

二、FastCGI优势是把动态语言解析和HTTP服务器分离开来。

三、Nginx、Apache、Lighttpd以及多数动态语言都支持FastCGI。

四、FastCGI接口方式采用C/S架构,分为客户端(HTTP服务器)和服务端(动态语言解析服务器)。

五、PHP动态语言服务端能够启动多个FastCGI的守护进程。

六、HTTP服务器经过FastCGI客户端和动态语言FastCGI服务端通讯。

Nginx FastCGI的运行原理

Nginx不支持对外部动态程序的直接调用或者解析,全部的外部程序(包括PHP)必须经过FastCGI接口来调用。FastCGI接口在Linux下是socket(能够是文件socket,也能够是ip socket)。为了调用CGI程序,还须要一个FastCGI的wrapper,这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,经过FastCGI接口,wrapper接收到请求,而后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据经过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运做过程。

 

 

FastCGI的主要优势是把动态语言和HTTP服务器分离开来,是Nginx专注处理静态请求和向后转发动态请求,而PHP/PHP-FPM服务器专注解析PHP动态请求。

5)、rewrite

看下面两张图:

 

 

 

 

配置:

    server {

        listen       80;

        server_name  old.test.com;

       rewrite ^(.*)$  http://new.test.com$1 permanent;

       #return 301 http://new.test.com$request_uri;

    }

    server {

        listen       80;

        server_name  new.test.com;

 

 

        location / {

            root   html;

            index  index.html index.htm;

        }

    }

  

5、nginx和apache httpd服务器的对比

server

Apache

Nginx     

Proxy代理

很是好

很是好

Rewriter

很是好

Fcgi

很差

热部署

不支持

支持

系统压力比较

很大

很小

稳定性

很是好

安全性

通常

技术支持

很是好

不多

静态文件处理

通常

很是好

Vhosts虚拟主机

支持

不支持

反向代理

通常

很是好

Session sticky

支持

不支持

Apache和Nginx比较

功能对比

Nginx和Apache同样,都是HTTP服务器软件,在功能实现上都采用模块化结构设计,都支持通用的语言接口,如PHP、Perl、Python等,同时还支持正向和反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输等。

  1. 在功能实现上,Apache的全部模块都支持动、静态编译,而Nginx模块都是静态编译的,
  2. 对FastCGI的支持,Apache对Fcgi的支持很差,而Nginx对Fcgi的支持很是好;
  3. 在处理链接方式上,Nginx支持epoll,而Apache却不支持;
  4. 在空间使用上,Nginx安装包仅仅只有几百K,和Nginx比起来Apache绝对是庞然大物。

Nginx相对apache的优势

  • 轻量级,一样起web 服务,比apache 占用更少的内存及资源
  • 静态处理,Nginx 静态处理性能比 Apache 高 3倍以上
  • 抗并发,nginx 处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。在Apache+PHP(prefork)模式下,若是PHP处理慢或者前端压力很大的状况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。
  • 高度模块化的设计,编写模块相对简单
  • 社区活跃,各类高性能模块出品迅速啊

apache相对nginx的优势

  • rewrite,比nginx 的rewrite 强大
  • 模块超多,基本想到的均可以找到
  • 少bug,nginx的bug相对较多
  • 超稳定
  • Apache对PHP支持比较简单,Nginx须要配合其余后端用

选择Nginx的优点所在

  1. 做为Web服务器: Nginx处理静态文件、索引文件,自动索引的效率很是高。
  2. 做为代理服务器,Nginx能够实现无缓存的反向代理加速,提升网站运行速度。
  3. 做为负载均衡服务器,Nginx既能够在内部直接支持Rails和PHP,也能够支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡。
  4. 在性能方面,Nginx是专门为性能优化而开发的,在实现上很是注重效率。它采用内核Poll模型(epoll and kqueue ),能够支持更多的并发链接,最大能够支持对50 000个并发链接数的响应,并且只占用很低的内存资源。
  5. 在稳定性方面,Nginx采起了分阶段资源分配技术,使得CPU与内存的占用率很是低。Nginx官方表示,Nginx保持10 000个没有活动的链接,而这些链接只占用2.5MB内存,所以,相似DOS这样的攻击对Nginx来讲基本上是没有任何做用的。
  6. 在高可用性方面,Nginx支持热部署,启动速度特别迅速,所以能够在不间断服务的状况下,对软件版本或者配置进行升级,即便运行数月也无需从新启动,几乎能够作到7×24小时不间断地运行。

同时使用Nginx和Apache

因为Nginx和Apache各自的优点,如今不少人选择了让二者在服务器中共存。在服务器端让Nginx在前,Apache在后。由Nginx作负载均衡和反向代理,而且处理静态文件,讲动态请求(如PHP应用)交给Apache去处理。

相关文章
相关标签/搜索