Nginx技术详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx技术详解相关的知识,希望对你有一定的参考价值。


nginx Web服务应用:

Nginx(engine x)是一个开源的,支持高并发的www服务和代理服务软件。

Nginx是俄罗斯人Igor Sysoev开发的,最初被应用到俄罗斯的大型网站(www.rambler.ru)上。后来作者将源代码以类BSD许可证的形式开源出来供全球使用。

在功能应用方面,Nginx不仅是一个优秀的Web服务软件,还具有反向代理负载均衡和缓存的功能。

在反向代理负载均衡方面类似于LVS负载均衡及HAProxy等你专业代理软件。

Nginx部署起来更加方便简单,在缓存服务功能方面,有类似于Squid等专业的缓存服务软件。

Nginx可以运行在UNIX、Linux、MS Windows Server、Mac OS X Server、Solaris等操作系统中。


Nginx的重要特性:

--可以针对静态资源高速节点并发访问及缓存。

--可以使用反向代理加速,并且可以进行数据缓存。

--具有简单负载均衡,节点健康检查和容错功能。

--支持远程Fast CGI服务的缓存加速。

--支持Fast CGI、Uwsgi、SCGI、Memcached Server的加速和缓存。

--支持SSL、TLS、SNI。

--具有模块化的架构:

--过滤器包括gzip压缩、ranges支持、chunked响应、XSLT、SSL和图像缩放等功能。

--在SSL过滤器中,包含多个SSL页面,如果经由Fast CGI或反向代理处理,可以并行处理。


Nginx所具备的www服务特性:

--支持基于域名、端口和IP的虚拟主机配置。

--支持KeepAlived和piplined连接。

--可进行简单、方便、灵活的配置和管理。

--支持修改Nginx配置,并且在代码上线时,可平滑重启,不中断业务访问。

--可自定义访问日志格式,临时缓冲写日志操作,快速日志轮询及通过rsyslog处理日志。

--可利用信号控制Nginx进程。

--支持3xx-5xxHTTP状态码重定向。

--支持rewrite模块,支持URI重写及正则表达式匹配。

--支持基于客户端IP地址和HTTP基本认证的访问控制。

--支持PUT、DELETE、MKCOL、COPY、MOVE等特殊的HTTP请求方法。

--支持FLV流和MP4流技术产品应用。

--支持HTTP响应速率限制。

--支持同一IP地址的并发连接或请求限制。

--支持邮件服务代理。


面试必备:

--支持高并发,可以支持几百万并发连接。

--资源消耗少,在3万并发连接下,可以开启10个nginx的线程消耗的内存不到200MB。

--可以做HTTP反向代理及加速缓存,及负载均衡功能,内置对RS节点服务器健康检查功能,折现但能够与专业的HAProxy或LVS的功能。

--具备Squid等专业缓存软件等的缓存功能。

--支持异步网络I/O事件模型epoll(Linux2.6+)。


Nginx软件主要企业应用:

--作为Web服务软件

--使用Nginx运行html、JS、CSS、小图片等静态数据(类似于Lighttpd)

--结合Fast CGI运行php等动态程序(例如使用fastcgi_pass方式)

--Nginx结合Tomcat/Resin等支持Java动态程序(常用proxy_pass)

--反向代理或负载均衡服务(Nginx从1.9.0开始就开始支持TCP的代理了)

--前端业务数据缓存服务


Web服务应用产品性能对比:

--静态数据的访问上:

--处理小文件(小于1MB)时,Nginx和Lighttpd比Apache更有优势,Nginx处理小文件的优势明显,Lighttpd综合最强。

--动态数据的访问上:

--三者差距不大,Apache更有优势,因为处理动态数据的能力在于PHP(Java)和后端数据库的服务能力,也就是说瓶颈不在Web服务器上。

--一般情况下普通PHP引擎支持的并发连接参考值300~1000。

--Java引擎和数据库的并发连接参考值300~1500。


为什么Nginx比Apache的性能高:

Nginx使用最新版的eepoll(Linux 2.6内核)和kqueue(FreeBSD)异步网络I/O模型,而Apache使用的是传统的select模型。

目前Linux下能够承受高并发访问的Squid、Memcached软件采用都是epoll模型。

处理大量的连接的读写时,Apache所采用的select网络I/O模型比较低。


如何正确采用Web服务器:

--静态业务:如果是高并发场景,尽量采用Nginx或Lighttpd,二者首选Nginx。

--动态业务:理论上采用Nginx和Apache均可,建议使用Nginx,为了避免相同业务服务的软件多样化,增加维护成本,动态业务可以使用Nginx兼做前端代理,再根据页面的元素或目录转发到其他的服务器进行处理。

--既有动态业务又有静态业务,就用Nginx。


编译安装Nginx:

(1)安装Nginx需要的pcre(Perl兼容正则表达式)库,允许Nginx使用rewrite模块提供URL重写功能。

yum install pcre pcre-devel -y

(2)安装openssl-devel,允许Nginx提供HTTPS服务。

yum install openssl-devel -y


mkdir -p /home/root/tools         #创建工具目录

cd /home/root/tools        #进入工具目录

tar -zxvf ./nginx-1.13.4.tar.gz       #解压Nginx代码文件

cd ./nginx-1.13.4        #进入源代码目录

useradd nginx -s /sbin/nologin -M

#Do not create the user‘s home directory, even if the system wide setting from /etc/login.defs (CREATE_HOME)is set to yes.

#-M参数指定不要创建home目录,即使系统范围设置/etc/login.defs指定了yes。

#-s参数指定创建用户时设置用户的登录shell,这里指定为不可登录,作为服务进程账号使用。

./configure --user=nginx --group=nginx --prefix=/application/nginx-1.13.4/ --with-http_stub_status_module --with-http_ssl_module

make && make install

ln -s /application/nginx-1.13.4/ /application/nginx    #创建软连接

#当Nginx软件升级编译安装或带新版本后,删除原来的软连接,再重新建立新的软连接就好,如果程序中引用nginx路径的地方不需要做任何更改。

#--with-http_stub_status_module 激活状态信息

#--with-http_ssl_module    开启SSL加密支持

#Nginx的大部分模块都会默认编译到软件中,不需要单独指定编译参数。

(3)启动Nginx

/application/nginx/sbin/nginx -t        #启动的时候检查语法错误

nginx: the configuration file /application/nginx-1.13.4//conf/nginx.conf syntax is ok

nginx: configuration file /application/nginx-1.13.4//conf/nginx.conf test is successful

/application/nginx/sbin/nginx      #启动Nginx

lsof -i :80          #查看Nginx服务端口是否成功启动

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

nginx   37232  root    6u  IPv4  92444      0t0  TCP *:http (LISTEN)

nginx   37233 nginx    6u  IPv4  92444      0t0  TCP *:http (LISTEN)

#也可以通过netstat命令查看:

netstat -tunlap | grep :80

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      37232/nginx

使用浏览器访问http://192.168.10.3,或者使用curl命令:

curl http://192.168.10.3

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

    body {

        width: 35em;

        margin: 0 auto;

        font-family: Tahoma, Verdana, Arial, sans-serif;

    }

</style>

</head>

<body>

<h1>Welcome to nginx!</h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>


<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>


<p><em>Thank you for using nginx.</em></p>

</body>

</html>


Nginx故障集锦:

(1)编译安装的时候遇到的错误:

./configure:error:SSL modules require the OpenSSL library.

You can either do not enable the modules,or install the OpenSSL library into the system,or build the OpenSSL library statically from the source with nginx by using --with-openssl=<path> option.

(2)Nginx启动疑难杂症:

--报错“nginx:[emerg]getpwnam("nginx")failed”:

因为没有对应的Nginx服务用户,执行useradd nginx -s /sbin/nologin -M 创建用户即可。

(3)编译安装PCRE软件的时候,gcc不全导致报错:

make all-am

make[1]:Entering directory `/home/root/tools/pcre-8.30`

    CXX     pcrecpp.lo

libtool:compile:unrecognized option `-DHAVE_CONFIG_H`

libtool:compile:Try`libtool --help‘ for more infomation`

make[1]:***[pcrecpp.lo] error 1

make[1]:Leaving directory `/home/root/tools/pcre-8.30`

make:***[all] error 2

使用yum install gcc-c++ gcc -y安装

(4)查看Nginx的编译参数:

/application/nginx/sbin/nginx -V

nginx version: nginx/1.13.4

built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)

built with OpenSSL 1.0.1e-fips 11 Feb 2013

TLS SNI support enabled

configure arguments: --user=nginx --group=nginx --prefix=/application/nginx-1.13.4/ --with-http_stub_status_module --with-http_ssl_module

(5)浏览器访问不了Nginx网页

需要在服务器端和客户端进行排查:

服务器端:

--首先关闭SELinux:

setforce 0                    #临时设置来临时生效

vim /etc/selinux/config       #更改SELinux的配置文件,下次开机时生效

SELINUX=disabled              #更改参数

:wq

--然后检查防火墙:

/etc/init/iptables stop       #设置防火墙是关闭状态

chkconfig iptables off        #取消开机自启

--再查看Nginx的端口是否开启:

netstat -tunlap | grep :80

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      37232/nginx

--查看Nginx进程是否存在:

ps -aux | grep nginx

root      37232  0.0  0.1  44764  1080 ?        Ss   04:13   0:00 nginx: master process /application/nginx/sbin/nginx

nginx     37233  0.0  0.1  45196  1984 ?        S    04:13   0:00 nginx: worker process

root      38013  0.0  0.0 103308   848 pts/0    S+   07:06   0:00 grep nginx

--可以查看Nginx的日志:

cat /application/nginx/logs/error.log

客户端:

--在客户端上ping服务器端IP地址:

 ping -c3 192.168.10.3        #使用-c参数指定ping发送数据包的次数

PING 192.168.10.3 (192.168.10.3) 56(84) bytes of data.

64 bytes from 192.168.10.3: icmp_seq=1 ttl=64 time=0.036 ms

64 bytes from 192.168.10.3: icmp_seq=2 ttl=64 time=0.029 ms

64 bytes from 192.168.10.3: icmp_seq=3 ttl=64 time=0.025 ms


--- 192.168.10.3 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2001ms

rtt min/avg/max/mdev = 0.025/0.030/0.036/0.004 ms

检查客户端的telnet服务器端的IP地址,端口是否开启:

telnet 192.168.10.3

使用浏览器检查,访问测试。


本文出自 “帅帅的小哥哥” 博客,请务必保留此出处http://xvjunjie.blog.51cto.com/12360960/1955103

以上是关于Nginx技术详解的主要内容,如果未能解决你的问题,请参考以下文章

linux技术nginx详解

nginx 配置详解是啥?

linux (08) nginx入门详解

后端技术:Nginx 应用场景详解

Linux的负载均衡详解

Nginx安装配置详解