Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2018年08月28日发布1.15.3版本。html
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。前端
处理静态文件,索引文件以及自动索引;nginx
反向代理加速(无缓存),简单的负载均衡和容错;c++
FastCGI,简单的负载均衡和容错;web
模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;算法
SSL 和 TLS SNI 支持;apache
使用外部 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 内存。
最小化的数据拷贝操做;
基于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/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/
正向代理-转发代理(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; } }
配置:
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; } }
配置:
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定向到同一个后端服务器,后端服务器为缓存时比较有效。
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动态请求。
看下面两张图:
配置:
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; } }
server |
Apache |
Nginx |
Proxy代理 |
很是好 |
很是好 |
Rewriter |
好 |
很是好 |
Fcgi |
很差 |
好 |
热部署 |
不支持 |
支持 |
系统压力比较 |
很大 |
很小 |
稳定性 |
好 |
很是好 |
安全性 |
好 |
通常 |
技术支持 |
很是好 |
不多 |
静态文件处理 |
通常 |
很是好 |
Vhosts虚拟主机 |
支持 |
不支持 |
反向代理 |
通常 |
很是好 |
Session sticky |
支持 |
不支持 |
Nginx和Apache同样,都是HTTP服务器软件,在功能实现上都采用模块化结构设计,都支持通用的语言接口,如PHP、Perl、Python等,同时还支持正向和反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输等。
因为Nginx和Apache各自的优点,如今不少人选择了让二者在服务器中共存。在服务器端让Nginx在前,Apache在后。由Nginx作负载均衡和反向代理,而且处理静态文件,讲动态请求(如PHP应用)交给Apache去处理。