Nginx服务部署详细说明
1.1 常用来提供静态服务的软件
Apache :这是中小型Web服务的主流,Web服务器中的老大哥,
Nginx :大型网站Web服务的主流,曾经Web服务器中的初生牛犊,现已长大。
Nginx 的分支 Tengine ( http://tengine.taobao.org/)目前也在飞速发展•
Lighttpd :这是一个不溫不火的优秀 Web软件,社区不活跃,静态解析效率很高.在 Nginx 流行前,它是大并发静态业务的首选,国内百度贴吧、豆瓣等众多网站都有Lighttpd奋斗的身彩"
1.2 常用来提供动态服务的软件
PHP ( FastCGI ):大中小型网站都会使用,动态网页语言PHP程序的解析容器。它可配合Apache解析动态程序,不过,这里的PHP不是FastCGI守护进程横式,而是mod_php5.so ( module)也可配合Nginx解析动态程序,此时的PHP常用FastCGI守护进程模式提供服务。
Tomcat :中小企业动态Web服务主流,互联网Java容器主流(如jsp、do )
Resin :大型动态Web服务主流,互联网Java容器主流(如jsp、do )
IIS ( Internet information services ):微软 windows 下的 Web 服务软件(如 asp、aspx )
第2章 nginx 软件
2.1 软件介绍
如果你听说或使用过 Apache软件,那么很快就会熟悉 Nginx软件,与 Apache软件类似, Nginx ( “engme x")是一个开源的,支持高性能、高并发的 WWW服务器和代理服务软件。它是由俄罗斯人 Igor Sysoev开发的,最初被应用在勘罗斯的大型网站 www.rambler.ru 上,后来作者将源代码以类BSD许可证的形式开源出来供全球使用。
Nginx因具有高并发(特别是静态资源)占用系统资源少等特性,且功能丰富而逐渐流行起来。
在功能应用发面,Nginx不但是一个优秀的Web服务软件,还具有反向代理负载均衡功能和缓存服务功能。在反向代理负载均衡功能方面,它类似于大名鼎鼎的LVS负载均衡及Haproxy等专业代理软件,但是Nginx部署起来更为简单、方便;在缓存服务功能方面,它又类似于Squid等专业的缓存服务软件。
Nginx 可以运行在 UNIX、Linux、BSD、Mac 0S X、Solaris,以及 Microsoft Windows 等操作系统中。随着Nginx在国内很多大型网站中的稳定高效运行,近两年它也逐渐被越来越多的中小型网站所使用。当前流行的Nginx Web组合被称为LNMP或LEMP(即Linux Nginx MySQL PHP),其中 LNMP 里的 N 取自Nginx ( "engine x" )
Nginx 的官方介绍见 http://nginx.org/en
2.2 NGINX 软件特性
2.2.1 HTTP服务器的特色及优点:
u 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
u 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB
u 可以做HTTP反向代理及加速缓存、即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能。
u 具备Squid等专业缓存软件等的缓存功能。
u 支持异步网络I/O事件横型epoll(Linux2.6+)
2.2.2 nginx功能特性
Ø web网站服务
Ø 反向代理负载均衡(nginx /lvs /haproxy)
Ø nginx缓存服务(memcache /redis /mongodb)
2.3 nginx软件的企业功能应用
业务类型 | 应用方案 |
静态业务 | 若是高并发场景,尽量采用Nginx或Lighttpd,二者首选Nginx |
动态业务 | 理论上采用Nginx和Apache均可,建议选择Nginx,为了避免相同业务的服务软件多样化,增加额外维护成本。动态业务可以由Nginx兼做前端代理,再根据页面元素的类型或目录,转发到后端相应的服务器处理进程。 ---首选tomcat |
既有静态业务又有动态业务 | 采用Nginx 利用nginx软件是无法处理动态业务请求,要让nginx结合php软件处理动态业务请求,在加上mysql 即 LNMP架构 |
2.4 nginx软件的动态访问瓶颈
2.4.1 与其他软件的对比
先来看看Apache软件的特点,如下
² Apache2.2版本非常稳定强大,据官方说,Apache2.4版本性能更强。
² Prefork模式取消了进程创建开销,性能很高。
² 处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在Apache上。
² 高并发时消耗系统资源相对多一些。
² 基于传统的select模型,高并发能力有限。
² 支持扩展库,可通过DSO、apxs方法编译安装额外的插件功能,不需要重新编译Apache
² 功能多,更稳定,更安全,插件也多。
² 市场份额在逐年递减
再来看看Nginx软件的特点,如下:
n 基于异步网结I/O模 型(epollk kqueue)
n 具备支持高性能,高并发的特性,并发连接可达数万。
n 对小文件(小于1 MB的静态文件)高并发支持很好,性能很高
n 不支持类似 Apache的DSO模式、扩展库必须编译进主程序(缺点)
n 进程占用系统资源比较低。
n 支持Web、反向Proxy、Cache三大重点功能,幷且都很优秀。
n 市场份额在逐年快速增加。
最后是Lighttpd的特点,如下:
² 基于异步网络 I/ O模型,性能、并发都与 Nginx相近。
² 扩展库是 SO模式,比Nginx灵活
² 目前国内的使用率比较低,安全性没有 Apache和Nginx好。
² 通过插件(mod_secdownload)可实现文件 URL地址加密(优点)
² 社区不活跃,市场份额较低,
2.4.2 最主要的区别(select & epoll)
NGINX 使用的是epoll 和Kqueue 异步网络I/O模型,而apache使用的是传统的select模型
比喻:
第一个比喻:
假设你在大学读书,住的宿舍楼有很多房间,你的朋友要来找你。select版宿管大妈就会带着你的朋友到各房间挨个去找,直到找到你为止。而epoll版宿管大妈会先记下每位入住同学的房间号,你的朋友来找你时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满宿舍楼找人了。如果同时来了100个人,都要找自己住这栋楼的同学,select版和epoll版宿管大妈,谁的效率更高,就很明显了。
第二个比喻:
select的调用复杂度是线性的,即O(n)。举个例子,一个保姆照看照看一群孩子,如果把孩子是否需要尿尿比作网络I/O事件,select的作用就好比这个保姆挨个询问每个孩子"你要尿尿吗?”如果孩子回答是,保姆则把孩子领出来放到另外一个地方。当所有孩子询问完之后,保姆领着这些要尿尿的孩子去上厕所(处理网络I/O事件).在epoll机制下,保姆不再需要挨个询问每个孩子是否需要尿尿。取而代之的是,如果孩子需要尿尿,他就自己主动站到事先约定好的地方,而保姆的职责就是查看事先约定好的地方是否有孩子。如果有小孩,则领着孩子去上厕所(网络事件处理)。因此,epoll的这种机制,能够高效地处理成千上万的并发连接,并且性能不会随着连接数増加而下降太多。
2.4.3 apache select和nginx epoll技术对比图
指标 | select | epoll |
性能 | 随着连接数的增加性能急剧下降。处理成千上万的并发连接数,性能很差 | 随着连接数的增加,性能基本上没有下降。处理成千上万连接时性能很好 |
连接数 | 连接数有限制,处理的最大连接数不超过1024,如果要处理的连接数超过1024个,则需要修改FD_SETSIZE宏,并重新编译 | 连接数无限制 |
内在处理机制 | 线性轮询 | 回调callback |
开发复杂性 | 低 | 中 |
第3章 nginx的安装与使用
3.1 nginx软件的编译安装步骤
3.1.1 检查软件安装的系统环境
[root@web01 ~]# cat /etc/RedHat-release
CentOS release 6.9 (Final)
[root@web01 ~]# uname -r
2.6.32-696.el6.x86_64
3.1.2 安装nginx的依赖包(pcre-devel openssl-devel)
yum install -y pcre-devel openssl-devel
pcre:兼容perl语言正则表达式,perl compatible regular expressions
rewirte模块 参数信息(perl方式定义正则表达式)
openssl:ssh---openssh/openssl---https
总结:所有安装依赖软件,后面都要加上-devel
3.1.3 下载nginx软件
wget http://nginx.org/download/nginx-1.10.2.tar.gz
说明:软件很小,用心查看一下
解压软件
tar xf nginx-1.10.2.tar.gz
3.1.4 创建管理用户 www
useradd -M -s /sbin/nologin www
3.1.5 nginx软件编译安装过程
3.1.5.1 注意
软件编译安装步骤
a>软件解压配置(将软件程序安装到哪个目录中 开启nginx软件的哪些功能)
b>软件编译过程
c>软件编译安装过程
注意顺序,顺序不对软件安装会出错
3.1.5.2 编译安装软件
1、配置软件,在软件的解压目录中
[root@web01 nginx-1.10.2]# ./configure --prefix=/application/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module
编译参数说明:
--prefix 表示指定软件安装到哪个目录中,指定目录不存在会自动创建
--user/--group nginx工作进程由哪个用户运行管理
--with-http_stub_status_module 启动nginx状态模块功能(用户访问nginx的网络信息)
--with-http_ssl_module 启动https功能模块
通过软件编译过程中的返回值是否正确,确认配置是否正确
[root@web01 nginx-1.10.2]# echo $?
2、编译软件
[root@web01 nginx-1.10.2]# make
3、编译安装
[root@web01 nginx-1.10.2]# make install
3.1.6 创建软连接
[root@web01 application]# ln -s /application/nginx-1.10.2/ /application/nginx
3.1.7 精简化nginx.conf 主配置文件内容
[root@web01 conf]# egrep -v "#|^$" nginx.conf.default >nginx.conf
3.1.8 启动程序
[root@web01 application]# /application/nginx/sbin/nginx
[root@web01 application]#
检查是否启动
[root@web01 application]# ps -ef |grep nginx
root 26548 1 0 20:13 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx
www 26549 26548 0 20:13 ? 00:00:00 nginx: worker process
root 26551 23431 3 20:13 pts/0 00:00:00 grep --color=auto nginx
检查端口信息
[root@web01 application]# netstat -lntup |grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 26548/nginx
服务部署完成
至此软件安装完毕!
nginx命令简化方法
echo 'export PATH=/application/nginx/sbin:$PATH'>>/etc/profile
source /etc/profile
which nginx
3.1 nginx 目录结构
[root@web01 nginx]# ll
total 36
drwxr-xr-x 2 root root 4096 Oct 21 19:34 conf #配置文件保存目录
drwxr-xr-x 2 root root 4096 Oct 21 19:34 html #站点目录
drwxr-xr-x 2 root root 4096 Oct 21 20:26 logs #nginx 服务相关日志文件保存目录(错误日志访问日志)
drwxr-xr-x 2 root root 4096 Oct 21 19:34 sbin # 服务命令目录(只有一个nginx文件)
3.2 nginx.conf 配置文件说明
这样的配置文件是通过精简化配置文件得到!
[root@web01 conf]# cat nginx.conf
worker_processes 1; ← worker 进程数量
events { ←事件区块
worker_connections 1024; ←每个worker进程可以处理的连接数
} ←事件区块结束
http { ← HTTP 区块
include mime.types; ←支持的媒体文件
default_type application/octet-stream;←默认的媒体类型
sendfile on; ←高效传输模式
keepalive_timeout 65; ←超时时间
server { ← server 区块
listen 80; ←端口
server_name localhost; ←域名
location / { ←第一个location区块
root html; ←站点目录
index index.html index.htm; ←首页文件
} ←第一个location区块结束
error_page 500 502 503 504 /50x.html; ← 错误信息配置
location = /50x.html { 文件位置
root html; 在哪找:路径
}
} ← server 区块结束
} ← HTTP 区块结束
3.2.1 站点目录与首页文件概念
3.2.2 配置文件详解
3.3 【常见错误】nginx软件的编译安装常见错误说明
3.3.1 nginx软件安装过程中遇到的问题
软件依赖包未正确安装问题---PCRE依赖包没有安装
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
解决方法:yum install pcre pcre-devel -y
软件依赖包未正确安装问题---OPENSSL依赖包没有安装
./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.
解决方法:yum install openssl openssl-devel -y
3.3.2 nginx软件启动过程中遇到的问题
nginx软件重复启动产生的错误信息
[root@web01 nginx-1.10.2]# /application/nginx/sbin/nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
解决方法:
nginx软件已经启动无需反复启动,如果需要重新启动需要停止nginx进程或者用reload方式进行重启
3.3.3 启动 Nginx 时如下报错"nginx:[emerg]getpwnam(“nginx”〉failed"
解答这是因为没有对应的Nginx服务用户,执行useradd nginx-s/sbin/no丨ogin-M创建 Nginx
用户即可。为了让读者理解问题,重现上述错误过程,命令如下:
[root@web01 tools]# pkill nginx
[root@web01 tools]# userdel nginx
[root@web01 tools]# /application/nginx/sbin/nginx
nginx: [emerg] getpwnam(Mnginx") failed
[root@web01 tools]# useradd nginx -s /sbin/nologin -M
[root@web01 tools]# /application/nginx/sbin/nginx
3.3.4 编译安装pcre编译软件时,gcc不全导致报错(本文使用yum安装不存在此问题)。
报错信息如下:
[root@gjlin2 pcre-8.30]# make && make install
make all-am
make[l] : Entering directory 7home/gjlin/tools/pcre-8.30'
CXX pcrecpp.lo
libtool : compile : unrecognized option '-DHAVE_CONFIG_H'
libtool : compile : Try 'libtool --help* for more information.
make[l】:*** [pcrecpp.lo】错误 1
make[l] : Leaving directory Vhome/gjlin/tools/pcre-8.30'
make : *** [all]错误 2
解答:执行“yum -y install gcc-c++”命令安装gcc-c++依赖包。
3.3.5 nginx软件编译安装后,看不到程序目录(/application)
说明:编译安装步骤不对(配置 编译 编译安装生成/appliation)
3.3.6 nginx软件排查问题三部曲说明
a 在客户端上ping服务器端IP,检查链路是否通畅
b 在客户端上telnet服务器端IP、端口,检查链路访问是否通畅
c 在客户端上wget检测模拟页面访问是否正常
3.3.7 【注意】403状态码出现情况原因
01. 服务阻止客户端访问
02. 服务端站点目录中,没有指定首页文件信息
3.4 nginx软件使用命令参数
3.4.1 nginx 启动方法
[root@web01 application]# /application/nginx/sbin/nginx
3.4.2 nginx 停止方法
[root@web01 application]# /application/nginx/sbin/nginx -s stop
3.4.3 nginx 重启方法 (平滑重启)
[root@web01 application]# /application/nginx/sbin/nginx -s reload
3.4.4 检查配置文件语法是否正确
[root@web01 application]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is successful
3.4.5 显示配置参数 -V (大写V)
[root@web01 application]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/application/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module
3.4.6 nginx软件使用过程中深入说明
①. nginx软件语法检查方法:
nginx -t
②. nginx软件访问测试过程:
curl -v www.baidu.com
③. nginx软件编译参数查看:
nginx -V <--- 查看原有的编译参数信息
3.5 nginx软件静态页面编写过程
编写配置文件
[root@web02 www]# cat ../../conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.zinx.top;
location / {
root html/www;
index oldboy.html index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
编写静态访问页面文件信息
[root@web1 www]# cat oldboy.html
<html>
<meta charset="utf-8">
<head>
<title>TEST</title>
</head>
<body>
惨绿少年
<table border=1>
<tr> <td>01</td> <td> </td> </tr>
<tr> <td>02</td> <td> </td> </tr>
<tr> <td>03</td> <td> </td> </tr>
</table>
<a href="http://blog.znix.top">
<img src="znix.png" />
</a>
</body>
</html>