nginx是什么
Nginx ("engine x") 是一个高性能的HTTP和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
特点
Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。与旧版本(<=2.2)的Apache不同,nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑,削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。 在Linux操作系统下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。
Nginx的优点
Nginx做为HTTP服务器,有以下几项基本特性:
1.处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.
2.无缓存的反向代理加速,简单的负载均衡和容错.
3.FastCGI,简单的负载均衡和容错.
4.模块化的结构。包括gzipping, byte ranges, chunked responses, 以及 SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。
5.支持SSL 和 TLS SNI.
Nginx专为性能优化而开发,性能是其最重要的考量, 实现上非常注重效率 。它支持内核Poll模型,能经受高负载的考验, 有报告表明能支持高达 50,000 个并发连接数。
Nginx具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如当前apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上是毫无用处的。就稳定性而言, nginx比lighthttpd更胜一筹。
Nginx支持热部署。它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。
Nginx采用master-slave模型, 能够充分利用SMP的优势,且能够减少工作进程在磁盘I/O的阻塞延迟。当采用select()/poll()调用时,还可以限制每个进程的连接数。
Nginx代码质量非常高,代码很规范, 手法成熟, 模块扩展也很容易。特别值得一提的是强大的Upstream与Filter链。 Upstream为诸如reverse proxy,与其他服务器通信模块的编写奠定了很好的基础。而Filter链最酷的部分就是各个filter不必等待前一个filter执行完毕。它可以把前一个filter的输出做为当前filter的输入,这有点像Unix的管线。这意味着,一个模块可以开始压缩从后端服务器发送过来的请求,且可以在模块接收完后端服务器的整个请求之前把压缩流转向客户端。
Nginx采用了一些os提供的最新特性如对sendfile (Linux 2.2+),accept-filter (FreeBSD 4.1+),TCP_DEFER_ACCEPT (Linux 2.4+) 的支持,从而大大提高了性能。
查看当前linux系统环境
[root@web ~]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@web ~]# uname -r 2.6.32-642.el6.x86_64 [root@web ~]# uname -m x86_64 yum安装方式安装pcre库,命令如下 [root@web ~]# yum -y install pcre pcre-devel [root@web ~]# rpm -qa pcre pcre-devel pcre-7.8-7.el6.x86_64 pcre-devel-7.8-7.el6.x86_64 检查安装nginx基础依赖包 pcre-devel、openssl-devel [root@web ~]# rpm -qa pcre-devel pcre-devel-7.8-7.el6.x86_64 [root@web ~]# rpm -qa openssl-devel openssl-devel-1.0.1e-48.el6_8.4.x86_64
常用编译选项说明
nginx大部分常用模块,编译时./configure --help以--without开头的都默认安装。 --prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx --conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf --user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。默认的用户名是nobody。--group=name类似 --with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用--with-pcre自动找到库文件。使用--with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 - 8.30)并解压,剩下的就交给Nginx的./configure和make来完成。perl正则表达式使用在location指令和ngx_http_rewrite_module模块中。 --with-zlib=PATH : 指定 zlib(版本1.1.3 - 1.2.5)的源码解压目录。在默认就启用的网络传输压缩模块ngx_http_gzip_module时需要使用zlib 。 --with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装 --with-http_stub_status_module : 用来监控 Nginx 的当前状态 --with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址 --add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)
编译安装nginx
[root@web ~]# mkdir -p /home/tools [root@web ~]# cd /home/tools/ [root@web tools]# wget -q http://nginx.org/download/nginx-1.6.3.tar.gz [root@web tools]# ll total 788 -rw-r--r-- 1 root root 805253 Apr 8 2015 nginx-1.6.3.tar.gz [root@web tools]# tar -xf nginx-1.6.3.tar.gz [root@web01 tools]# cd nginx-1.6.3 [root@web01 nginx-1.6.3]# ll total 624 drwxr-xr-x 6 1001 1001 4096 Mar 25 15:53 auto -rw-r--r-- 1 1001 1001 236608 Apr 7 2015 CHANGES -rw-r--r-- 1 1001 1001 360501 Apr 7 2015 CHANGES.ru drwxr-xr-x 2 1001 1001 4096 Mar 25 15:53 conf -rwxr-xr-x 1 1001 1001 2369 Apr 7 2015 configure drwxr-xr-x 4 1001 1001 4096 Mar 25 15:53 contrib drwxr-xr-x 2 1001 1001 4096 Mar 25 15:53 html -rw-r--r-- 1 1001 1001 1397 Apr 7 2015 LICENSE drwxr-xr-x 2 1001 1001 4096 Mar 25 15:53 man -rw-r--r-- 1 1001 1001 49 Apr 7 2015 README drwxr-xr-x 8 1001 1001 4096 Mar 25 15:53 src [root@web nginx-1.6.3]# useradd -s /sbin/nologin -M www [root@web nginx-1.6.3]# ./configure --user=www --group=www --prefix=/application/nginx-1.10.2 --with-http_stub_status_module --with-http_ssl_module [root@web nginx-1.6.3]# make &&make install [root@web01 nginx-1.10.2]# ln -s /application/nginx-1.10.2 /application/nginx [root@web01 nginx-1.10.2]# ll /application/nginx lrwxrwxrwx 1 root root 25 Mar 25 16:01 /application/nginx -> /application/nginx-1.10.2
启动nginx
[root@web01 nginx-1.6.3]# /application/nginx/sbin/nginx -t nginx: the configuration file /application/nginx/conf/nginx.conf syntax is ok nginx: configuration file /application/nginx/conf/nginx.conf test is successful [root@web01 ~]# lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 7254 root 6u IPv4 18513 0t0 TCP *:http (LISTEN) nginx 7255 www 6u IPv4 18513 0t0 TCP *:http (LISTEN)
在windows下通过浏览器检查
打开浏览器输入IP
通过浏览器看到如上内容说明Nginx已经启动
在linux下可以使用wget命令检查
[root@web01 ~]# wget 127.0.0.1 --2017-03-25 16:04:43-- http://127.0.0.1/ Connecting to 127.0.0.1:80... connected. HTTP request sent, awaiting response... 200 OK Length: 612 [text/html] Saving to: “index.html” 100%[=====================================================>] 612 --.-K/s in 0s 2017-03-25 16:04:43 (76.4 MB/s) - “index.html” saved [612/612]
web排错三部曲下面介绍客户端排查的思路
第一步,在客户段ping服务器IP,命令如下 [root@web01 ~]# ping 10.0.0.8 PING 10.0.0.8 (10.0.0.8) 56(84) bytes of data. 64 bytes from 10.0.0.8: icmp_seq=1 ttl=64 time=0.148 ms 第二步,在客户端上telnet服务器端IP、端口,命令如下 [c:\~]$ telnet 10.0.0.8 80 Connecting to 10.0.0.8:80... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. 第三步,在客户端使用wget命令检测,如下 [root@web01 ~]# wget 10.0.0.8 --2017-03-25 16:10:06-- http://10.0.0.8/ Connecting to 10.0.0.8:80... connected. HTTP request sent, awaiting response... 200 OK Length: 612 [text/html] Saving to: “index.html” 100%[=====================================================>] 612 --.-K/s in 0s 2017-03-25 16:10:06 (54.7 MB/s) - “index.html” saved [612/612]
Nginx主配置文件nginx.conf
Nginx的配置文件有数百行,我们先去掉使用的默认注释行,最小化讲解Nginx的核心配置参数
去掉所有注释行
[root@web01 conf]# egrep -v "#|^$" nginx.conf.default >nginx.conf 去掉包含#号和空行的内容 worker_processes 1; -----》worker进程的数量 events { ------》事件区块开始 worker_connections 1024; -----》每个worker进程支持的最大连接数 } -------》事件区块的结束 http { -----》http事件区块的开始 include mime.types; -----------》nginx支持的媒体类型库文件 default_type application/octet-stream; -----》默认的媒体类型 sendfile on; -----------》开启高效传输模式 keepalive_timeout 65; -------------》连接超时 server { ------》第一个server区块开始,表示一个独立的虚拟主机站点 listen 80; ----------》提供服务的端口,默认80 server_name localhost; ------》提供服务的域名或主机名 location / { ----》第一个location区块开始 root html; ---------》站点的根目录,相当于Nginx的安装目录 index index.html index.htm; ----》默认的首页文件,多个用空格分开 } ----------》第一个location区块结束 error_page 500 502 503 504 /50x.html;----》出现对应的http状态码时,使用50x.html回应客户 location = /50x.html { ----------》location区块开始,访问50x.html root html; -----------》指定对应的站点目录为html } } } ---------------》http区块结束