前言
早期 Nginx 的诞生是为了解决 web 中出现的 C10K 问题, 即服务器如何承受一万的并发量当时流行的 Web server 为 Apache Httpd, 而 Httpd 的 IO 模型使用的 select()模型, 这种 IO 模型为端口复用模型, 他的并发量只能达到 1024 而 Nginx 的使用了一种 epoll 的 IO 模型, 这种模型使用事件驱动机制极大的提高了并发量当然到现今为止, Nginx 的功能不仅仅提供 web 服务
一. Nginx 架构
1. Nginx 进程架构
由上图可知, nginx 的进程模型分为两级, 一个 master 进程和多个工作进程 master 进程用于负载加载和分析配置文件管理 worker 进程平滑升级 woker 进程处理并响应用户请求, worker 进程在响应用户请求可以通过异步事件驱动和非阻塞多种方式; 与缓存相关的进程用于加载, 管理缓存对象
2. Nginx 高度模块
Nginx 的每个功能由具体模块提供, 是高度模块化的, 但其模块早期不支持 DSO 机制; 近期版本 (1.10 及其以上) 支持动态装载和卸载 Nginx 模块主要分为分类:
1). 核心模块: core module
2). 标准模块: 根据功能不同分为三类
HTTP modules: 用于配置 HTTP 服务, 这里面的模块分为 Standard HTTP modules 和 Optional HTTP modules,Standard modules 本身就有有, 而 Optional 模块需要我们在编译时指定参数才会有而第三方模块在编译时要指向引用此模块
Mail modules: 用于 Mail 相关配置
Stream modules: 用于 Stream 相关配置
3). 第三方模块: 用于扩展 Nginx https://www.nginx.com/resources/wiki/modules/ 此连接可以看到目前支持的第三方模块
3. Nginx 功能
1). 静态的 web 资源服务器: 图片服务器或 js/CSS/html/txt 等静态资源服务器
2). 结合 FastCGI/uwSGI/SCGI 等协议反代动态资源请求
3). http/https 协议的反向代理
4). imap4/pop3 协议的反向代理: 用于处理邮件协议, 此处不涉及
5). tcp/udp 协议的请求转发: 使用 stream 模块
这些功能除了 imap4/pop3 协议的反向代理其他的都会通过模块的方式在后续的文章中一一介绍
二. Nginx 的安装
我们将会使用两种方式来安装 Nginx, 一种是通过 yum 安装, 一种使用源码安装
操作系统版本:
CentOS7.2 处于最小化安装
IP 为 192.168.239.131
清空 iptables 规则:~]# iptables -F
禁用 selinux:~]# setenforce 0
1. YUM 源安装 Nginx
一般没有什么特许要求我们都是通过信任的 yum 源进行安装
1)配置 yum 源
Nginx 在 EPEL 源中, 我们使用的是阿里的镜像
- ~]# vim /etc/yum.repos.d/epel.repo
- [epel]
- name=CentOS-$releasever EPEL
- baseurl=http://mirrors.aliyun.com/epel/$releasever/$basearch
- gpgcheck=0
2)yum 安装 Nginx
~]# yum install -y nginx
查看安装包安装了哪些文件
~]# rpm -ql nginx | less
启动 nginx 服务
~]# systemctl restart nginx
访问 nginx 服务
看到此页面说明 nginx 启动成功
2. 源码编译 Nginx
一般我们都会使用 yum 安装, 因为它更便于升级管理而我们之所以对源码进行编译是因为版本出现了大的漏洞, 或者我们需要第三方模块提供的功能
1)安装编译开发工具(包组)
~]# yum groupinstall -y "Desktop Platform Development" "Server Platform Development" "Development Tools"
查看 yum 源中的包组可以使用 yum grouplist 命令, 如果使用此命令查看的包组名是中文那么在安装是要使用中文安装
2)安装依赖的包
~]# yum install -y install pcre-devel zlib-devel openssl-devel
pcre:perl 兼容的正则表达式库, 他为 nginx 的核心和 rewrite 模块提供正则表达式功能
zlib: 用于 Nginx 为 Gzip 模块提供头部压缩功能
openssl: 为 Nginx SSL 模块提供 HTTPS 协议支持
3)下载源码包
我们编译最新 Nginx 版本
- ~]# wget http://nginx.org/download/nginx-1.13.8.tar.gz (如果没有安装 wget 可以使用 yum install -y wget 安装)
- ~]# tar xf nginx-1.13.8.tar.gz -C /opt
- ~]# cd /opt
- opt]# ln -sv nginx-1.13.8 nginx
- ~]# cd nginx
说明: 之所以创建软连接是因为后期版本的升级时, 我们只需要修改软连接即可而且一旦新版本有问题我们只需修改软连接指向就可以回退到老版本
4)编译之普通版
C 语言编写的程序是有多个原文件组成的, 而且文件与文件之间具有依赖关系所以我们需要特定的项目管理工具对其进行管理, 使得程序在编译的时候可以根据依赖关系依次进行在 Linux 平台上常用的项目管理工具为 GUN make,make 在编译时会根据其 makefile 配置文件中定义的次序对其进行编译
makefile 文件如何生成: 在程序编写完成后, 会使用 autoconf 为程序代码生成一个脚本文件 configure, 这个脚本文件会收集当前系统的开发环境中所依赖的各组件的版本, 和其依赖的环境是否满足, 最后会更具 makefile.in 生成 makefile 文件
makefile.in 文件如何生成: 在程序编写完成后, 会使用 autoconf 为程序代码生成一个 makefile 模板文件 makefile.in
./configure
运行 configure 命令时一定要处于其所在的父目录下
- ~]# cd /opt/nginx
- ~]# ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/etc/nginx.conf --pid-path=/usr/local/nginx/run/nginx.pid --lock-path=/usr/local/nginx/run/nginx.lock --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-http_dav_module --with-threads --with-file-aio
--prefix: 编译完成后, 程序的安装目录默认在 / usr/local
--conf-path: 指明配置文件的安装文件路径, 如果不指明则在 --prefix 指明的目录下
--pid-path: 主程序的 pid 文件路径, 如果不指明则在 --prefix 指明的目录下
--lock-path: 锁文件路径, 如果不指明则在 --prefix 指明的目录下
--error-log-path:nginx 错误日志文件路径, 如果不指明则在 --prefix 指明的目录下
--http-log-path:nginx 访问日志路径, 如果不指明则在 --prefix 指明的目录下
--user,--group: 指明程序运行的用户, 默认是 nobody, 配置文件中使用 user 指令指明
--with-http_ssl_module,--with-http_v2_module, --with-http_stub_status_module,--with-dav-module: 启动对应的模块功能, 使用 --with-XXX_module 的说明默认没有编译, 需要显示说明编译使用 --without-XXX_module 的表明默认会编译, 但如果你不想使用此功能模块, 可以使用此选项显示表明不编译可以使用 --help 查看有哪些选项
--with-threads: 使用线程池功能
--with-file-aio: 启用文件一步 IO 功能
下图为 configure 运行结果
可以看到没有报任何错, 在 configure 当前目录下我们看到生成了一个 Makefile 文件
使用 make 工具编译源码
make 命令会根据生成的 Makefile 文件编译源码, 运行此命令是处于 makefile 的父目录下
nginx]# make
将编译好的文件安装到指定目录
nginx]# make install
在 configure 时我们通过 --prefix 指明安装在 / usr/local/nginx 目录下有些文件是在 nginx 启动后才生成的, 所以此处看不到如下图:
运行 nginx
运行 nginx 程序时发现报错, 查找资料发现是因为没有启动程序使用的用户, 我们指定运行 work 进程的用户为 nginx
我们发现 80 端口已经监听, 访问 nginx 页面
由上图可知 nginx 使用正常
5)编译之添加第三方模块
https://www.nginx.com/resources/wiki/modules/ 可以看到可用的第三方模块此次我们会使用阿里巴巴的 nginx-http-footer-filter 模块进行
下载 nginx-http-footer-filter
- ~]# wget https://github.com/alibaba/nginx-http-footer-filter/archive/1.2.2.zip
- ~]# cp 1.2.2.zip /opt
- opt]# unzip 1.2.2.zip
目录结构为:
opt]# cd nginx
编译
记得清楚原有编译结果, 在重新展开 nginx tarball
- ~]# rm -rf /usr/local/nginx
- ~]# rm -rf /opt/nginx*
- ~]# tar xf nginx-1.13.8.tar.gz -C /opt
- ~]# cd /opt
- opt]# ln -sv nginx-1.13.8 nginx
- ~]# cd nginx
正式编译:
nginx]# ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/etc/nginx.conf --pid-path=/usr/local/nginx/run/nginx.pid --lock-path=/usr/local/nginx/run/nginx.lock --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-http_dav_module --with-threads --with-file-aio --add-module=../nginx-http-footer-filter-1.2.2
修改配置文件
~]# vim /usr/local/nginx/etc/nginx.conf
启动服务
~]# /usr/local/nginx/sbin/nginx start
页面访问 nginx 服务
可以看到配置生效了
此模块的详细用法请看链接 https://github.com/alibaba/nginx-http-footer-filter/tree/1.2.2
5)编译之支持动态装卸在模块
前期的一些步骤就省略了
~]# ./configure --help
~]# ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/etc/nginx.conf --pid-path=/usr/local/nginx/run/nginx.pid --lock-path=/usr/local/nginx/run/nginx.lock --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-http_dav_module --with-threads --with-file-aio --with-stream=dynamic
查看生成的目录
我们如果要想使用此模块就要使用 load_module 加载对应模块, 才能使用其模块中的指令如果我们想要将第三方库编译成动态装卸载怎么办? 只需将 --add-module 改为 --add-dynamic-module 即可
后记
接下来将会整理 Nginx 的配置文件的使用, 以及常用模块的使用
参考资料
https://www.nginx.com/resources/admin-guide/installing-nginx-open-source/
来源: http://www.bubuko.com/infodetail-2492452.html