WEB服务-Nginx之2-功能介绍和安装
WEB服务-Nginx之2-功能介绍和安装
Nginx基础概述
Nginx介绍
nginx: engine X,是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次公开发布时间是2004年10月4日,版本号是0.1.0。
nginx有商业版和社区版,2019年3月11日F5 Networks 6.7亿美元的价格收购。
nginx 是免费,开源,高性能的HTTP和反向代理服务器,邮件代理服务器,通用TCP/UDP代理服务器。
解决了C10K问题(10K Connections)。官网:http://nginx.org
nginx的二次发行版:
-
Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。从2011年12月开始,Tengine成为一个开源项目,官网 http://tengine.taobao.org/
-
OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春,官网:http://openresty.org/cn/
我们为什么选择Nginx服务?
- Nginx非常轻量,源代码仅保留http与核心模块代码,其余模块代码会作为插件来安装
- 代码模块化 (易读,便于二次开发,对于开发人员非常友好)
- Nginx技术成熟,具备的功能是企业最常使用而且最需要的
- 适合当前主流架构趋势,微服务、云架构、中间层
- 统一技术栈,降低维护成本,降低技术更新成本。
- 互联网公司都选择Nginx
基础特性:
- 模块化设计,较好的扩展性
- 高可靠性
- 支持热部署:不停机更新配置文件,升级版本,更换日志文件
- 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
- event-driven,aio,mmap,sendfile
基本功能:
- 静态资源的web服务器:html,图片,js,css,txt等静态资源
- 结合FastCGI(LNMP),uWSGI(python)等协议反向代理动态资源请求
- http/https协议反向代理服务器
- pop3/imap4协议反向代理服务器
- tcp/udp协议的请求转发(反向代理)
总结:前三个功能是nginx的最实用特性。
web服务相关功能:
- 虚拟主机(server)
- 支持keep-alive和管道连接( 共享TCP连接发起并发的HTTP请求)
- 访问日志(支持基于日志缓冲提高其性能)
- url rewrite
- 路径别名
- 基于IP及用户的访问控制
- 支持速率限制及并发数限制
- 重新配置和在线升级而无须中断客户的工作进程
- Memcached的GET接口
Nginx和Apache的区别
Nginx
- 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
- 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
- nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
- nginx 的设计高度模块化,编写模块相对简单
- nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
- nginx 作为负载均衡服务器,支持 7 层负载均衡
- nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
- 启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级
- 社区活跃,各种高性能模块出品迅速
Apache
- apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
- apache 发展到现在,模块超多,基本想到的都可以找到
- apache 更为成熟,少 bug ,nginx 的 bug 相对较多
- apache 超稳定
- apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
- apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
- apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区
总结
Apache和Nginx最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程;而 nginx 是异步的,多个连接(万级别)可以对应一个进程。
一般来说,需要性能的 web 服务,用 nginx 。如果不需要性能只求稳定,更考虑 apache。
更为通用的方案是,前端 nginx 抗并发,后端 apache 集群,配合起来会更好。
IO多路复用机制select,poll,epoll
Nginx采用Epool,Apache采用Select
Select: 当用户发起一次请求,进行一次遍历扫描,从而导致性能低下。
Epool: 当用户发起请求,直接进行处理,效率高效,并无连接限制。
应用程序服务器
web服务程序 | 介绍 |
---|---|
httpd | Apache软件基金会的一个开放源码的网页服务器 |
nginx | 开源的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器软件 |
lighttpd | 德国人领导的开源Web服务器软件 |
IIS | 网页文件:.asp |
tomcat | 网页文件:.jsp |
jetty | 开源的servlet容器,基于Java的web容器 |
Resin | CAUCHO公司,支持servlets和jsp的引擎 |
webshpere | IBM的软件平台 |
weblogic | (BEA)并入Oracle,市场上主要的Java(J2EE)应用服务器软件 |
jboss | 基于J2EE的开源应用服务器软件 |
oc4j | Oracle 用于Java的运行时的环境 |
市场占有率统计:www.netcraft.com
静态WEB软件
- nginx
- apache
- IIS
- lighttpd
- tengine
- openresty-nginx
动态WEB软件
- Tomcat
- Resin
- weblogic
- Jboss
nginx组织模型
web请求处理机制
1、多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。
2、多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了。IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。
主进程(master process)的功能:
- 读取Nginx 配置文件并验证其有效性和正确性
- 建立、绑定和关闭socket连接
- 按照配置生成、管理和结束工作进程
- 接受外界指令,比如重启、升级及退出服务器等指令
- 不中断服务,实现平滑升级,重启服务并应用新的配置
- 开启日志文件,获取文件描述符
- 不中断服务,实现平滑升级,升级失败进行回滚处理
- 编译和处理perl脚本
工作进程(woker process)的功能:
- 接受处理客户的请求
- 将请求以此送入各个功能模块进行处理
- IO调用,获取响应数据
- 与后端服务器通信,接收后端服务器的处理结果
- 缓存数据,访问缓存索引,查询和调用缓存数据
- 发送请求结果,响应客户的请求
- 接收主程序指令,比如重启、升级和退出等
程序架构
master/worker结构
- 一个master进程:
负载加载和分析配置文件、管理worker进程、平滑升级 - 一个或多个worker进程:
处理并响应用户请求 - 缓存相关的进程:
cache loader:载入缓存对象
cache manager:管理缓存对象
进程间通信
工作进程是由主进程生成的,在Nginx服务器启动过程中,主进程根据配置文件决定启动工作进程的数量,然后使用fork()函数,建立一张全局的工作表,用于存放当前未退出的所有的工作进程。
主进程生成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进程,该管道与普通的管道不同,它是由主进程指向工作进程的单项通道,包含了主进程想工作进程发出的指令、工作进程ID、工作进程在工作进程表中的索引和必要的文件描述符等信息。
主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互。
工作进程之间的通信原理基本上和主进程与工作进程之间的通信是一样的,只要工作进程之间能够取得彼此的信息,建立管道即可通信,但是由于工作进程之间是完全隔离的,因此一个进程想要直到另外一个进程的状态信息就只能通过主进程来设置了。
为了实现工作进程之间的交互,主进程在生成工作进程只之后,在工作进程表中进行遍历,将该新进程的ID以及针对该进程建立的管道句柄传递给工作进程中的其他进程,为工作进程之间的通信做准备。
当工作进程1向工作进程2发送指令的时候,首先在主进程给它的其他工作进程工作信息中找到2的进程ID,然后将正确的指令写入指向进程2的管道,工作进程2捕获到管道中的事件后,解析指令并进行相关操作,这样就完成了工作进程之间的通信。
Nginx快速安装
Nginx的安装方式
-
源码编译=>Nginx (1.版本随意 2.安装复杂 3.升级繁琐 4.规范 5.便于管理)
-
官方仓库=>Nginx (1.版本较新 2.安装简单 3.配置易读)
-
epel仓库=>Nginx (1.版本较低 2.安装简单 3.配置不易读)
源码编译安装
- 安装Nginx依赖
[root@web01 ~]# yum install -y gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel make automake autoconf httpd-tools
- 在官网下载源码包并解压
[root@web01 ~]# cd /opt
[root@web01 opt]# wget https://nginx.org/download/nginx-1.16.0.tar.gz
[root@web01 opt]# tar xvf nginx-1.16.0.tar.gz
-
创建系统用户
默认该用户属于和该用户同名的用户组(不存在创建),
-r
创建系统用户(uid<1000,没有家目录,没有邮件),-s
不允许登录
[root@web01 opt]# useradd -r -s /sbin/nologin nginx
添加第三方模块
第三模块是对nginx的功能扩展,第三方模块需要在编译安装nginx时,使用参数
--add-module=PATH
指定路径添加。
echo模块,实现输出变量等信息,开源的,推荐使用OpenResty。
注意:编译安装nginx时,使用1.16.x版本,1.18.x版本暂时不兼容。
- 切换到
/opt
目录下,安装git
,对网站克隆[root@web01 ~]# cd /opt [root@web01 /opt]# yum install git [root@web01 /opt]# git clone https://github.com/openresty/echo-nginx-module.git Cloning into 'echo-nginx-module'... remote: Enumerating objects: 4, done. remote: Counting objects: 100% (4/4), done. remote: Compressing objects: 100% (4/4), done. remote: Total 3022 (delta 0), reused 2 (delta 0), pack-reused 3018 Receiving objects: 100% (3022/3022), 1.16 MiB | 24.00 KiB/s, done. Resolving deltas: 100% (1624/1624), done. [root@web01 /opt]# ls echo-nginx-module/ config LICENSE README.markdown src t util valgrind.suppress
- 或者直接下载指定版本包,解压并修改名称
[root@web01 /opt]# wget -O echo-nginx-module-0.62.tar.gz https://github.com/openresty/echo-nginx-module/archive/v0.62.tar.gz [root@web01 /opt]# tar xf echo-nginx-module-0.62.tar.gz [root@web01 /opt]# mv echo-nginx-module-0.62 echo-nginx-module
- 切换到源码包解压后的目录下,开始编译
[root@web01 opt]# cd nginx-1.16.0/
[root@web01 nginx-1.16.0]# ./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--add-module=/opt/echo-nginx-module # 第三方模块echo模块
-
make: 根据Makefile文件生成相应的模块。
make install: 创建目录,并将生成的模块和文件复制到相应的目录。
make -j2
并行编译,并行任务,一般是以CPU的核心数目的两倍为宜。
[root@web01 nginx-1.16.0]# make -j2 && make install
- 创建nginx命令软连接
[root@web01 nginx-1.16.0]# ln -s /apps/nginx/sbin/nginx /usr/sbin
[root@web01 nginx-1.16.0]# ll /usr/sbin/nginx
lrwxrwxrwx 1 root root 22 Dec 11 16:04 /usr/sbin/nginx -> /apps/nginx/sbin/nginx
- 启动nginx服务,并设置开机启动
[root@web01 nginx-1.16.0]# nginx
[root@web01 nginx-1.16.0]# ss -tnpul | grep 80
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=2176,fd=6),("nginx",pid=2175,fd=6))
[root@web01 nginx-1.16.0]# echo "/usr/sbin/nginx" >> /etc/rc.d/rc.local # 加入开机启动脚本
[root@web01 nginx-1.16.0]# chmod +x /etc/rc.d/rc.local # 加上执行权限
也可以加入
systemctl
管理[root@web01 nginx-1.16.0]# cat >/usr/lib/systemd/system/nginx.service <<EOF [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/apps/nginx/logs/nginx.pid ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP \$MAINPID ExecStop=/bin/kill -s TERM \$MAINPID [Install] WantedBy=multi-user.target EOF
之后就可以使用
systemctl
管理了[root@web01 nginx-1.16.0]# systemctl start nginx [root@web01 nginx-1.16.0]# systemctl enable nginx [root@web01 nginx-1.16.0]# systemctl status nginx
- 第三方echo模块配置
[root@web01 ~]# vim /apps/nginx/conf/nginx.conf
server {
...
location / {
root html;
index index.html index.htm;
}
location /test {
root /code;
index index.html;
default_type text/html;
echo "hello world,main-->";
echo_reset_timer;
echo_location /sub1;
echo_location /sub2;
echo "took $echo_timer_elapsed sec for total.";
}
location /sub1 {
echo_sleep 1;
echo sub1;
}
location /sub2 {
echo_sleep 1;
echo sub2;
}
...
}
- 第三方echo模块重载测试
[root@web01 ~]# systemctl reload nginx
[root@web01 ~]# curl 10.0.0.7/text
hello world,main-->
sub1
sub2
took 2.003 sec for total.
官方源仓库安装
- 安装Nginx依赖
[root@web01 ~]# yum install -y gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel make automake autoconf httpd-tools
- 打开官网CentOS安装说明书:http://nginx.org/en/linux_packages.html#RHEL-CentOS
- 选择
RHEL/CentOS
,我们选择nginx-stable版本
- 配置官方源
[root@web01 ~]# cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/\$basearch/
gpgcheck=0
enabled=1
EOF
- 安装Nginx服务
[root@web01 ~]# yum -y install nginx
- 停止httpd服务(如果已安装httpd服务端口冲突)
[root@web01 ~]# systemctl stop httpd
[root@web01 ~]# systemctl disable httpd
- 检查nginx配置文件语法是否正确
[root@web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
- 启动并设置开机自启
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx
elpl源仓库安装
- 安装Nginx依赖
[root@web01 ~]# yum install -y gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel make automake autoconf httpd-tools
- 配置elpl源
[root@web01 ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
- 安装Nginx服务
[root@web01 ~]# yum install nginx
- 启动并设置开机自启
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx
验证启动是否成功
- 端口检测
[root@web01 ~]# netstat -lntup|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0: LISTEN 1221/nginx: master
- 进程检测
[root@web01 ~]# ps -ef|grep nginx
root 1221 1 0 16:54 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 1222 1221 0 16:54 ? 00:00:00 nginx: worker process
- 下载网页
[root@web01 ~]# curl 10.0.0.7
<!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>
- 浏览器检测
打开浏览器访问:http://10.0.0.7
- 检查nginx的软件版本
[root@web01 ~]# nginx -v
nginx version: nginx/1.18.0
- 检查nginx安装时自己添加的参数、编译时附带的可选模块或三方模块。
[root@web01 ~]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
Nginx启停
Nginx可以直接使用二进制命令的方式运行,也可以使用systemctl管理,但是同时只能使用一种方法运行,不能混合使用
- Nginx启动
[root@web01 ~]# /usr/sbin/nginx
[root@web01 ~]# systemctl start nginx
- Nginx停止
[root@web01 ~]# /usr/sbin/nginx -s stop
[root@web01 ~]# systemctl stop nginx
- Nginx重启
[root@web01 ~]# /usr/sbin/nginx -s stop && /usr/sbin/nginx
[root@web01 ~]# systemctl restart nginx
- Nginx重载
[root@web01 ~]# /usr/sbin/nginx -s reload
[root@web01 ~]# systemctl reload nginx
使用systemctl管理,可以查看Nginx服务运行状态:
[root@web01 ~]# systemctl status nginx