1. Nginx 是什么?
Nginx 是由俄罗斯的工程师 Igor Sysoev 在 Rambler 集团任职系统管理员时利用业余时间所开发高性能 web 服务,官方测试 Nginx 能够支撑 5 万并发链接,并且 cpu、内存等资源消耗却非常低,运行非常稳定,所以现在很多知名的公司都在使用 Nginx 或者在此基础上进行了二次开发,包括淘宝、新浪、百度等。对于中小型企业而言,开源免费而又性能强大的 Nginx 必然也是首选,后续我们将看到一组统计数据来说明 Nginx 的应用之广泛。
关于 Nginx官网,目前支持英语和俄语版说明,网站没有优化,符合简约粗暴的Russia风格。
Nginx (engine x)是一个开源、高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP 服务”。
2. Nginx 使用场景
Nginx 的使用场景如下:
2.1 HTTP 服务器
Nginx 作为 Web 服务器能独立提供 Http 服务。另外,我们常常通过 Nginx 作为静态资源服务器来访问服务器上的静态资源,比如对于最新热门的前后端分离架构,前端打好包后直接放到某个地址,在 Nginx 配置后可以通过 Nginx 来访问主机上的前端页面。
2.2 反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。这样的好处是,将不暴露内部的服务地址,只统一使用一个公共出口,通过 URI 匹配转发到不同的内部服务处理请求。 这点应用的最多,很多国有企业内部服务器按照要求,不能直接连接外网,单据的配置一台反向代理服务器,实现转发,比如金蝶的影像服务器。
2.3 负载均衡
负载均衡也是 Nginx 的一个高频使用场景,对于下游存在的多个相同服务,可以将请求采用某种策略(随机、轮询、权重)发到相应的服务处理。这样由于多个相同服务的存在,可以实现高可用功能,在一个服务不可用时,Nginx 会自动发现并将其剔出服务集群,将请求转发给正常的服务进行处理。
2.4 第三方插件
基于第三方插件,Nginx 可以完成各种各样复杂的功能,全方位满足程序员的想法。比如在 Nginx 中引入 lua 模块,可以实现对 Http 请求更细粒度的限制,包括限速、限流、校验认证等等。后续,在 Nginx 上发展出来的 OpenResty 已经应用到了微服务网关方向。
3. CenterOS下部署
笔者正在参加Ningx体系的培训和考试,官方认证通道和ORACLE类似,层级如下:
考试通过会有电子和实体证书,考试通过摄像头监考,需要在120min中回答100道题,60分及格。证书样本如下:
3.1学习一门工具体系先从安装环境开始,从0-1:
Nginx 是完全使用 C 语言开发的,所以必须要有 C 编译环境,往往 CentOS 7.6 的环境会预装 gcc 编译器,所以不用额外安装,如果没有使用 yum 直接安装即可。另外,我们使用 Nginx 的压缩功能、正则表达式功能等,需要安装一些额外的依赖库,这是必须要做的,不然在编译阶段就会报错。如下 3 个是比较 Nginx 中比较常用模块所依赖的库,请在执行 Nginx 源码编译时提前安装好。
代码语言:javascript复制$ sudo yum install -y zlib zlib-devel
$ sudo yum install -y pcre pcre-devel
$ sudo yum install -y openssl openssl-devel
从官网下载对应的安装包,并用WINSCP上传到云服务器上,进行安装,官网路径在文章开头,
编译并安装
代码语言:javascript复制$ cd nginx-1.28.0
$ ./configure # 编译,检查依赖是否正确
$ make && sudo make install # 安装
但是这样往往不是我们需要的。特别是在 Nginx 中,可以指定安装某些或者不安装某些模块,默认安装的模块只适合简单的场景,往往在稍微复杂的情况下,就需要额外添加其他模块,或者第三方以及自定义的模块。这高可扩展性正是 Nginx 的一大亮点。想要查看 configure 的可选参数,使用 --help 选项即可:
代码语言:javascript复制$ ./configure --help
在所有可选参数中,最常用的有两个:
–prefix=PATH:配置 Nginx 安装部署的根目录。类似于在 Windows 下安装软件,我们指定安装目录; –with-xxx_module:–without-xxx_module 其中 xxx 表示 Nginx 一个模块的名称,例如: with-http_ssl_module -> 支持 SSL/TLS, 即 HTTPS with-http_v2_module -> 支持 HTTP/2 without-http_fastcgi_module -> 不使用 fastcgi 为了后续测试功能完善,这里我们编译时候,尽可能多的引入一些模块:
代码语言:javascript复制$ ./configure --prefix=/root/nginx
--with-http_ssl_module
--with-http_stub_status_module
--with-http_gzip_static_module
--with-stream
--with-http_realip_module
--with-http_flv_module
--with-http_random_index_module
--with-mail
--with-pcre
$ make && sudo make install
这里 “” 在 Linux 系统环境下表示两行之间没有换行,只是为了方便展示命令。一般而言,Nginx 的编译是比较顺利的,偶尔报错是大部分因为需要增加的模块依赖的一些库没有事先安装好。
对此,我们可以根据报错信息进行修正问题,保证编译顺利进行。在上一步骤成功后,可以看到 Nginx 我们生成的 Nginx 编译后的根目录了。简单说明根目录下的内容:
2.1 conf 目录 这里放的是 Nginx 的相关配置文件,最重要的莫过于 nginx.conf 了,这个是默认的配置文件。
2.2 html 目录 这里有 2 个简单的 Nginx 页面,分别为 50x.html 和 index.html,index.html 是 Nginx.conf 中默认访问的页面,也就是我们后续启动 Nginx 时,默认访问 80 端口的页面。
2.3 logs 目录 暂时为空,启动 Nginx,使用默认的 Nginx.conf 配置文件,会在当前目录下生成 3 个文件,分别为:
access.log (记录所有请求) error.log (记录所有错误信息) nginx.pid (Nginx 启动的主进程 id) 2.4 sbin 目录 最最重要的文件了,C 编译的工作,最后就是为了得到这样一个二进制文件。Nginx 的启动、重新加载、停止等都是靠该命令完成。我们一般会将该目录放到系统的 PATH 变量中,这样是为了方便直接使用 Nginx 命令,系统能找到该二进制文件。不然的话,我们使用该命令就必须输入全路径,类似下面这样:
- 操作 Nginx 在 Nginx 命令行的使用中,有几个非常重要的参数,也是在操作 Nginx 时经常用到的: 常用参数 作用-t 测试 Nginx.conf 文件的语法是否正常 c 指定 nginx.conf 文件 -s 最重要的操作,不带 - s 是启动, -s reload 是热加载 -s stop 是停止, -s reopen 是重新打开日志
实例:
代码语言:javascript复制# 进入sbin目录
$ cd /root/nginx/sbin
# 启动Nginx
$ ./nginx
# 检查nginx.conf
$ ./nginx -tc /root/nginx/conf/nginx.conf
# 重新加载nginx
$ ./nginx -s reload
# 停止nginx
$ ./nginx -s stop
启动 Nginx 后,首先使用 ps -ef | grep nginx 可以查看 Nginx 进程是否已经启动,基于默认的配置,我们将看到 2 个 Nginx 的启动进程:master 进程和 worker 进程。
这是我们在前面讲到的 Nginx 的 Master-Worker 机制,后面会进行详细讲解。另外,我们可以用命令 netstat -anltp | grep 80,看到 CentOS 上已经在监听 80 端口,而这个监听服务正是 Nginx。最后可以用浏览器或者 curl 命令直接在 CentOS 机器上检查 Nginx 服务:
代码语言:javascript复制$ curl http://localhost
当出现 “Welcome to Nginx!" 这样的欢迎语句,表明我们的 Nginx 已经正常运行了。
至此Ningx在centeros 就安装完成。具体的操作和配置建议查询官方文档。 下一篇进入ningx配置.