01-nginx详细介绍

为什么使用Nginx

截至2020年,差不多世界上每3个网站中就有1个使用Nginx。

0

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

0

下载编译安装nginx,keepalived所需要的基础命令以及依赖

yum install -y vim unzip openssh-clients gcc openssl-devel make kernel-devel gcc-c++ zlib-devel pcre-devel gcc
0

为了路径一致性和整洁性在/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文件。

0

开始编译安装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

执行启动文件查看状态

0

编译安装成功。

0

安装依赖模块

如果需要的话,可以在编译./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

全局配置

0

事件驱动类型

0

修改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个部分:

  1. 调用 epoll_create建立1个epoll对象(在epoll文件系统中给这个句柄分配资源)
  2. 调用 epoll_ctl向epoll对象中添加这100万个连接的套接字
  3. 调用 epoll_wait 收集发生事件的连接。

这样,只需要在进程启动时建立1个epoll对象,并在需要的时候向它添加或删除连接就可以了,因此,在实际收集事件时,epoll_wait的效率就会非常高,因为调用epoll_wait时并没有向它传递这100万个连接,内核也不需要去遍历全部的连接。

网站服务配置

整体规划:

http {
server {
location { }
location { }
location { }
}
}

server{ } 一对server就是nginx的一个虚拟主机
location{ } 定义客户端的URI地址,根据URI地址不同,给客户端不同的响应,需要使用正则表达式

具体配置:

0
$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 客户端地址
0

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,888评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,677评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,386评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,726评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,729评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,337评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,902评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,807评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,349评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,439评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,567评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,242评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,933评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,420评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,531评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,995评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,585评论 2 359

推荐阅读更多精彩内容