【原创】nginx入门

发布日期:2019-04-24

 

 

一、简介

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

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

二、功能概述

1、HTTP基础功能:

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

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

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

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

    SSL 和 TLS SNI 支持;

2、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 支持;

3、支持的操作系统:

    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;

4、结构与扩展:

    一个主进程和多个工作进程。工作进程是单线程的,且不需要特殊授权即可运行;

    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 内存。

    最小化的数据拷贝操作;

5、其他HTTP功能:

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

    Memcached 的 GET 接口;

    支持 keep-alive 和管道连接;

    灵活简单的配置;

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

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

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

    基于 PCRE 的 rewrite 重写模块;

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

    PUT, DELETE, 和 MKCOL 方法;

    支持 FLV (Flash 视频);

带宽限制;

三、安装与启动

命令:

yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel # 安装依赖cd /usr/local/srcwget http://nginx.org/download/nginx-1.15.3.tar.gz # 下载源代码tar -xvzf nginx-1.15.3.tar.gzcd nginx-1.15.3./configure --prefix=/usr/local/nginxmake && 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/

 

 

四、配置示例

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的重要特点:

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

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

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

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

5、PHP动态语言服务端可以启动多个FastCGI的守护进程。

6、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; } }

  

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

server

Apache

Nginx     

Proxy代理

非常好

非常好

Rewriter

非常好

Fcgi

不好

热部署

不支持

支持

系统压力比较

很大

很小

稳定性

非常好

安全性

一般

技术支持

非常好

很少

静态文件处理

一般

非常好

Vhosts虚拟主机

支持

不支持

反向代理

一般

非常好

Session sticky

支持

不支持

Apache和Nginx比较

功能对比

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

    在功能实现上,Apache的所有模块都支持动、静态编译,而Nginx模块都是静态编译的,对FastCGI的支持,Apache对Fcgi的支持不好,而Nginx对Fcgi的支持非常好;在处理连接方式上,Nginx支持epoll,而Apache却不支持;在空间使用上,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的优势所在

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

同时使用Nginx和Apache

由于Nginx和Apache各自的优势,现在很多人选择了让两者在服务器中共存。在服务器端让Nginx在前,Apache在后。由Nginx做负载均衡和反向代理,并且处理静态文件,讲动态请求(如PHP应用)交给Apache去处理。