为什么使用Nginx
截至2020年,差不多世界上每3个网站中就有1个使用Nginx。
Nginx以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡服务器。在性能上,Nginx占用很少的系统资源,能支持更多的并发连接,达到更高的访问效率;在功能上,Nginx是优秀的代理服务器和负载均衡服务器;在安装配置上,Nginx安装简单、配置灵活。
Nginx支持热部署,启动速度特别快,还可以在不间断服务的情况下对软件版本或配置进行升级,即使运行数月也无需重新启动。
在微服务的体系之下,Nginx正在被越来越多的项目采用作为网关来使用,配合Lua做限流、熔断等控制
nginx特性
l 轻量级(对硬件资源消耗),高性能http服务器
l 高性能反向代理服务器
l 基于模块化设计
l 基于EPOLL事件驱动模型
l 带缓存的日志写操作
l URL重写(rewrite)模块
l 支持验证HTTP referer,实现反倒链机制
l 支持缓存功能
l 在线升级
nginx服务架构
Nginx启动时会启动一个主进程master及多个子进程worker;配置缓存时还会启动cache load和cache manager进程。所有进程以"共享内存"机制完成进程间通信;master进程以特权用户运行,其他进程以非特权用户运行。
Ø Master主进程主要完成如下工作
① 读取并验证配置文件
② 创建、绑定、及关闭套接字socket(IP:port)
③ 启动、终止及维护worker进程的个数
④ 无须中止服务而重新配置工作特性
⑤ 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本
⑥ 重新打开日志文件
⑦ 编译嵌入式perl脚本
Ø Worker进程主要完成如下工作
① 接收、传入并处理客户端的连接
② 提供反向代理及过滤功能
③ IO调用,获取响应数据
④ 与后端服务器通信,接收后端服务器处理结果
⑤ 数据缓存、访问缓存索引、查询和调用缓存数据
⑥ 发送请求结果,响应客户端请求
⑦ 接收主程序指令,比如重启、退出、升级等
nginx部署
nginx安装分为yum安装、编译安装。yum安装要配置yum仓库。一般使用epel源来这安装。yum安装比较简单,下面为编译安装案例。
nginx编译部署
上传所需要的nginx包,这里使用的是nginx1.16.1
下载编译安装nginx,keepalived所需要的基础命令以及依赖
yum install -y vim unzip openssh-clients gcc openssl-devel make kernel-devel gcc-c++ zlib-devel pcre-devel gcc
为了路径一致性和整洁性在/app下创建nginx文件夹
mkdir -p /app/nginx
编译安装nginx
将上传的nginx包解压到/app/nginx目录下
tar -xvf /media/nginx-1.16.1.tar.gz -C /app/nginx/
切换到nginx1.16.1版本 解压目录下
cd /app/nginx/nginx-1.16.1/ ./configure --prefix=/app/nginx/
configure命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本,执行结束时,它会创建一个Makefile文件。
开始编译安装nginx
make && make install
编译安装支持以下参数
nginx的configure命令支持以下参数:
--prefix=path
定义nginx的安装目录
--sbin-path=path
设置nginx的可执行文件的路径
--conf-path=path
nginx允许使用不同的配置文件启动,通过命令行中的-c选项
--pid-path=path
设置nginx.pid文件,将存储的主进程的进程号
--error-log-path=path
设置主错误,警告,和诊断文件的名称
--http-log-path=path
设置主请求的HTTP服务器的日志文件的名称
--user=name
nginx工作进程的用户。可以在nginx.conf配置文件中 使用的 user指令
--group=name
设置nginx工作进程的用户组。可以在nginx.conf配置文件中 使用的 user指令
--with-select_module --without-select_module
启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
--with-poll_module --without-poll_module
启用或禁用构建一个模块来允许服务器使用poll()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
--without-http_gzip_module
不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。
--without-http_rewrite_module
不编译重写模块。编译并运行此模块需要PCRE库支持。
--without-http_proxy_module
不编译http_proxy模块。
--with-http_ssl_module
使用https协议模块。默认没有被构建。建立并运行此模块的OpenSSL库是必需的。
--with-pcre=path
设置PCRE库的源码路径 。
--with-pcre-jit
编译PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。
--with-zlib=path
设置的zlib库的源码路径
--with-cc-opt=parameters
设置额外的参数将被添加到CFLAGS变量
--with-ld-opt=parameters —设置附加的参数
常见编译nginx安装出错
错误1: ./configure: error: the HTTP rewrite module requires the PCRE library. 解决方案: yum install -y pcre-devel 错误2: ./configure: error: SSL modules require the OpenSSL library. 解决方案: yum install -y openssl-devel make && make install 或者指定 OpenSSL
执行启动文件查看状态
编译安装成功。
安装依赖模块
如果需要的话,可以在编译./configure的时候将需要的依赖模块包安装上
一般需要先装pcre 为了重写rewrite
① 选定源码目录
可以是任何目录,本文选定的是/usr/local/src
cd /usr/local/src
② 下载安装PCRE库
cd /usr/local/src wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
③ 安装PCRE库
tar -zxvf pcre-8.44.tar.gz cd pcre-8.44 ./configure make make install
安装zlib库为了gzip压缩
④ 选定源码目录
可以是任何目录,本文选定的是/usr/local/src
cd /usr/local/src
⑤ 下载安装 zlib 库
cd /usr/local/src wget http://zlib.net/zlib-1.2.11.tar.gz
⑥ 安装zlib库
tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure make make install
安装ssl(有些vps默认没装ssl或者版本过低)
⑦ 下载安装 openssl 库
cd /usr/local/src wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
⑧ 安装 openssl库
tar -zxvf openssl-1.1.1g.tar.gz cd openssl-1.1.1g ./configure make make install
全局配置
事件驱动类型
修改liunx默认最大文件数命令如下
cat <<EOF > /etc/security/limits.d/99-nofile.conf root soft nofile 102400 root hard nofile 102400 EOF
事件驱动模型对比
select,poll和epoll
select poll
select每次收集事件时,比如有100万连接的套接字,会把他们全部都传给系统,交给操作系统来寻找这些连接上有没有未处理的事件,会占用巨大的资源来处理,往往在select收集事件的连接时,这100万的连接中的大部分都是没有事件发生的。
epoll如何处理
它在Linux内核中申请了一个简易的文件系统,把原先的一个select或者poll调用分成了3个部分:
- 调用 epoll_create建立1个epoll对象(在epoll文件系统中给这个句柄分配资源)
- 调用 epoll_ctl向epoll对象中添加这100万个连接的套接字
- 调用 epoll_wait 收集发生事件的连接。
这样,只需要在进程启动时建立1个epoll对象,并在需要的时候向它添加或删除连接就可以了,因此,在实际收集事件时,epoll_wait的效率就会非常高,因为调用epoll_wait时并没有向它传递这100万个连接,内核也不需要去遍历全部的连接。
网站服务配置
整体规划:
http {
server {
location { }
location { }
location { }
}
}
server{ } 一对server就是nginx的一个虚拟主机
location{ } 定义客户端的URI地址,根据URI地址不同,给客户端不同的响应,需要使用正则表达式
具体配置:
$remote_addr: 客户端地址
$remote_user: 客户端用户
$time_local: 访问时间
$request: HTTP请求(方法、HTTP版本、URI地址)
$status HTTP状态码
$body_bytes_sent HTTP请求报文大小
$http_referer 超链接地址
$http_user_agent 客户端浏览器类型
$http_x_forwarded_for 客户端地址
location配置示例
客户端所访问的URI的地址其实是location里面的root后面的目录名+location后面的URI的组合
示例1:希望客户端访问ip就可以看到下面的首页
mkdir -p /web/htdocs echo "Nginx test page" > /web/htdocs/index.html
修改默认的location
vim /app/nginx/conf/nginx.conf
location / { root /web/htdocs; index index.html index.htm; }
检查nginx语法
/app/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
重新加载配置文件
/app/nginx/sbin/nginx -s reload
测试
links --dump 192.168.122.153
Nginx test page
示例2:客户端访问http://192.168.122.153/bbs , 可看到/web/bbs目录下的页面
mkdir /web/bbs echo "Nginx bbs test page" > /web/bbs/index.html
修改默认的location
vim /app/nginx/conf/nginx.conf
location /bbs { root /web; index index.html index.htm; }
client在访问时,http://192.168.122.153/ ,这个左斜杠代表的就是配置文件中root后面的目录,
这个目录后面在加上客户端写的URI的地址就是寻找网站首页的地方。URI的地址就是网站主目录下面的低一级目录。
检查语法
/app/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
重新加载文件
/app/nginx/sbin/nginx -s reload
测试
links --dump 192.168.122.153/bbs
Nginx bbs test page