Tutorialspoint Nginx 教程
来源:易百教程
Nginx教程™
Nginx[读音:engine x]是HTTP和反向代理服务器,邮件代理服务器,以及Igor Sysoev最初编写的通用TCP/UDP代理服务器。在很长一段时间以来,它一直在许多负载重的俄罗斯网站上运行,包括:Yandex,Mail.Ru,VK和Rambler。 根据Netcraft的说法,Nginx在2017年3月份服务或代理了28.50%的最繁忙的网站。这里有一些成功案例:Netflix,Wordpress.com,FastMail.FM。
源代码和文档按照两条BSD类许可证分发。
商业支持可从Nginx,Inc.获得。
基本的HTTP服务器功能
- 提供静态和索引文件,自动索引; 打开文件描述符缓存;
- 加速反向代理与缓存; 负载均衡和容错;
- 通过缓存FastCGI,uwsgi,SCGI和memcached服务器来加速支持; 负载均衡和容错;
- 模块化架构。 过滤器包括gzip,字节范围,分块响应,XSLT,SSI和图像变换过滤器。 如果由代理或FastCGI/uwsgi/SCGI服务器处理,则单页内的多个SSI包含可以并行处理;
- SSL和TLS SNI支持;
- 支持具有加权和依赖关系优先级的HTTP/2。
其他HTTP服务器功能
- 基于名称和基于IP的虚拟服务器;
- 保持活动和管道连接的支持;
- 访问日志格式,缓冲日志写入,快速日志轮换和syslog日志记录;
- 3xx-5xx错误代码重定向;
- 重写模块:使用正则表达式更改URI;
- 根据客户端地址执行不同的功能;
- 根据客户端IP地址,密码(HTTP Basic认证)和子请求结果进行访问控制;
- HTTP引用的验证
- PUT,DELETE,MKCOL,COPY和MOVE方法;
- FLV和MP4流媒体;
- 响应速度限制;
- 限制来自一个地址的同时连接或请求的数量;
- 基于IP的地理定位;
- A/B测试;
- 嵌入式Perl
- nginScript。
邮件代理服务器功能
- 使用外部HTTP认证服务器将用户重定向到IMAP或POP3服务器;
- 使用外部HTTP认证服务器进行用户认证,并将连接重定向到内部SMTP服务器;
- 认证方式:
- POP3:USER / PASS,APOP,AUTH LOGIN / PLAIN / CRAM-MD5;
- IMAP:LOGIN,AUTH LOGIN / PLAIN / CRAM-MD5;
- SMTP:AUTH LOGIN / PLAIN / CRAM-MD5;
- SSL支持;
- STARTTLS和STLS支持。
TCP/UDP代理服务器功能
- TCP和UDP的通用代理;
- SSL和TLS SNI支持TCP;
- 负载均衡和容错;
- 基于客户地址的访问控制;
- 根据客户端地址执行不同的功能;
- 限制来自一个地址的同时连接数;
- 访问日志格式,缓冲日志写入,快速日志轮换和syslog日志记录;
- 基于IP的地理定位;
- A/B测试;
- nginScript。
架构和可扩展性
- 一个主和几个工作进程; 工作进程在非特权用户下运行;
- 灵活配置;
- 重新配置和升级可执行文件,而不会中断客户端服务;
- 支持kqueue(FreeBSD 4.1+),epoll(Linux 2.6+),/ dev / poll(Solaris 7 11/99 +),事件端口(Solaris 10),select和poll;
- 支持各种kqueue功能,包括EV_CLEAR,EV_DISABLE(临时禁用事件),NOTE_LOWAT,EV_EOF,可用数据数,错误代码;
- 支持各种epoll功能,包括EPOLLRDHUP(Linux 2.6.17+,glibc 2.8+)和EPOLLEXCLUSIVE(Linux 4.5+,glibc 2.24+);
- 支持sendfile(FreeBSD 3.1+,Linux 2.2+,macOS 10.5+),sendfile64(Linux 2.4.21+)和sendfilev(Solaris 8 7/01 +);
- 文件AIO(FreeBSD 4.3+,Linux 2.6.22+);
- DIRECTIO(FreeBSD 4.4+,Linux 2.4+,Solaris 2.6+,macOS);
- 接受过滤器(FreeBSD 4.1+,NetBSD 5.0+)和TCP_DEFER_ACCEPT(Linux 2.4+)支持;
- 10,000个不活动的HTTP保持连接大约需要2.5M内存;
- 数据复制操作保持最小。
经测试的操作系统和平台
- FreeBSD 3 — 11 / i386; FreeBSD 5 — 11 / amd64;
- Linux 2.2 — 4 / i386; Linux 2.6 — 4 / amd64; Linux 3 — 4 / armv6l, armv7l, aarch64, ppc64le;
- Solaris 9 / i386, sun4u; Solaris 10 / i386, amd64, sun4v;
- AIX 7.1 / powerpc;
- HP-UX 11.31 / ia64;
- macOS / ppc, i386;
- Windows XP, Windows Server 2003.
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx教程
Nginx特性 - Nginx教程™
NGINX有什么不同? NGINX使用可扩展的事件驱动架构,而不是更传统的过程驱动架构。 这需要更低的内存占用,并且当并发连接扩大时,使内存使用更可预测。
在传统的Web服务器体系结构中,每个客户端连接作为一个单独的进程或线程处理,随着网站的流行度增加,并发连接数量的增加,Web服务器减慢,延迟了对用户的响应。
从技术的角度来看,产生一个单独的进程/线程需要将CPU切换到新的任务并创建一个新的运行时上下文,消耗额外的内存和CPU时间,从而对性能产生负面影响。
NGINX开发的目标是实现10倍以上的性能,优化服务器资源的使用,同时也能够扩展和支持网站的动态增长。 因此,NGINX成为最知名的模块化,事件驱动,异步,单线程Web服务器和Web代理之一。
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx特性
为什么需要Nginx? - Nginx教程™
当前信息时代,哪里都是应用程序。这些应用程序们不仅仅是运行人们工作场所的工具 - 它们现在正在经营人们的生活。 对即时响应的需求,完美的行为和更多的功能是前所未有的。 而且,当然,人们期望应用程序在不同类型的设备上运行平稳,特别是在移动设备上。 应用程序执行的速度与它所做的一样重要。
NGINX的核心功能,例如其具有高性能HTTP和反向代理服务器的大规模可扩展事件驱动架构,访问和带宽控制以及与各种应用程序高效集成的能力,有助于使其成为任何网站或服务需要性能,可扩展性和可靠性。
比如说,使用其它传统服务器软件,每个客户端连接作为一个单独的进程或线程处理,随着网站的流行度增加,并发连接数量的增加,Web服务器减慢,延迟了对用户的响应,到了最后实在撑不下去了,服务器软件响应不过来或死掉了,网站或应用程序也挂了。
所以说像NGINX这样一个可扩展性和可靠性的服务器软件,简单耐操,实在没有什么好的理由拒绝使用它。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » 为什么需要Nginx?
Nginx的优势(优点) - Nginx教程™
处理高性能和高效率的并发一直是部署nginx的主要优势。现在我们来了解有关Nginx更多的优点。
在过去几年中,Web架构师已经接受了将应用程序基础架构与Web服务器分离和分离的想法。 然而,以前以LAMP(Linux,Apache,MySQL,PHP,Python或Perl)为基础的网站的形式可能不仅仅是一个基于LEMP的(“E”代表“Engine x”)) ,但是越来越多地将网络服务器推送到基础设施的边缘,并以不同的方式将相同或更新的一组应用程序和数据库工具集成在网络服务器周围。
nginx非常适合这一点,因为它提供了方便卸载并发,延迟处理,SSL(安全套接字层),静态内容,压缩和缓存,连接和请求限制所需的关键功能,甚至可以从应用程序中传输HTTP媒体流层到更有效的Web服务器层。 它还允许与memcached/Redis或其他“NoSQL”解决方案直接集成,以便在为大量并发用户服务时提高性能。
随着近来开发套件和编程语言的广泛使用,越来越多的公司正在改变其应用开发和部署习惯。 nginx已经成为这些变化范式中最重要的组成部分之一,它已经帮助许多公司快速启动和开发他们的网络服务。
nginx的第一行是在2002年写的。2004年,它根据BSD许可证的两个条款向公众发布。 nginx用户的数量一直在增长,他们提出了想法,并提交了对整个社区非常有益和有益的错误报告,建议和意见。
nginx代码库是原始的,并且是从头开始以C编程语言编写的。 nginx已被移植到许多架构和操作系统,包括Linux,FreeBSD,Solaris,Mac OS X,AIX和Microsoft Windows。 nginx拥有自己的库,其标准模块不会超出系统的C库,除了zlib,PCRE和OpenSSL之外,如果不需要,或者由于潜在的许可证冲突,可以选择将其从构建中排除。
关于Windows版本的nginx
当nginx在Windows环境中工作时,nginx的Windows版本更像是一个概念证明,而不是一个功能完整的端口。 在这个时候,nginx和Windows内核架构有一些不能很好地交互的局限性。 用于Windows的nginx版本的已知问题包括并发连接数量低得多,性能下降,无缓存,无带宽监管。 nginx for Windows的未来版本将更加紧密地匹配主流功能。
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx的优势(优点)
Nginx架构 - Nginx教程™
处理并发连接的传统的基于进程或线程的模型涉及使用单独的进程或线程处理每个连接,并阻止网络或输入/输出操作。 根据应用,在内存和CPU消耗方面可能非常低效。 产生一个单独的进程或线程需要准备一个新的运行时环境,包括分配堆和堆栈内存,以及创建新的执行上下文。 额外的CPU时间也用于创建这些项目,这可能会导致由于线程在过多的上下文切换上的转机而导致性能下降。 所有这些并发症都表现在较老的Web服务器架构(如Apache)中。 这是提供丰富的一般应用功能和优化的服务器资源使用之间的一个折衷。
从一开始nginx就是一个专门的工具,可以实现更高性能,更密集和经济地使用服务器资源,同时实现网站的动态发展,所以它采用了不同的模式。 它实际上受到各种操作系统中高级事件机制的不断发展的启发。发展结果变成是一个模块化的,事件驱动的,异步的,单线程的非阻塞架构的nginx代码基础。
nginx大量使用复用和事件通知,并专门用于分离进程的特定任务。 连接在有限数量的单线程进程称为工作(worker)的高效运行循环中处理。 在每个工作(worker)中,nginx可以处理每秒数千个并发连接和请求。
代码结构
nginx工作(worker)码包括核心和功能模块。 nginx的核心是负责维护严格的运行循环,并在请求处理的每个阶段执行模块代码的适当部分。 模块构成了大部分的演示和应用层功能。 模块读取和写入网络和存储,转换内容,执行出站过滤,应用服务器端包含操作,并在代理启动时将请求传递给上游服务器。
nginx的模块化架构通常允许开发人员扩展一组Web服务器功能,而无需修改nginx内核。 nginx模块略有不同,即核心模块,事件模块,阶段处理程序,协议,可变处理程序,过滤器,上游和负载平衡器。nginx不支持动态加载的模块; 即在构建阶段将模块与核心一起编译。
在处理与接受,处理和管理网络连接和内容检索相关的各种操作时,nginx在基于Linux,Solaris和BSD的操作系统中使用事件通知机制和一些磁盘I/O性能增强,如:kqueue,epoll, 和事件端口。 目标是为操作系统提供尽可能多的提示,以便及时获取入站和出站流量,磁盘操作,读取或写入套接字,超时等异步反馈。 对于每个基于Unix的nginx运行的操作系统,大量优化了复用和高级I/O操作的不同方法的使用。
nginx架构的高级概述如下图所示 -
工作模式
如前所述,nginx不会为每个连接生成一个进程或线程。 相反,工作(worker)进程接受来自共享“listen”套接字的新请求,并在每个工作(worker)内执行高效的运行循环,以处理每个工作(worker)中的数千个连接。 没有专门的仲裁或分配与nginx工作(worker)的联系; 这个工作(worker)是由操作系统内核机制完成的。 启动后,将创建一组初始侦听套接字。 然后,工作(worker)在处理HTTP请求和响应时不断接受,读取和写入套接字。
运行循环是nginx工作(worker)代码中最复杂的部分。 它包括全面的内部调用,并且在很大程度上依赖异步任务处理的想法。 异步操作通过模块化,事件通知,广泛使用回调函数和微调定时器来实现。 总体而言,关键原则是尽可能不阻塞。 nginx仍然可以阻塞的唯一情况是工作(worker)进程没有足够的磁盘存储。
由于nginx不会连接一个进程或线程,所以在绝大多数情况下,内存使用非常保守,非常有效。 nginx也节省CPU周期,因为进程或线程没有持续的创建 - 销毁模式。 nginx的作用是检查网络和存储的状态,初始化新连接,将其添加到运行循环中,并异步处理直到完成,此时连接被重新分配并从运行循环中删除。 结合仔细使用系统调用(syscall)和精确实现支持接口(如pool和slab内存分配器),nginx通常可以在极端工作负载下实现中到低的CPU使用。
在一些磁盘使用和CPU负载模式,应调整nginx工作(worker)的数量。 在这里说一点基础规则:系统管理员应该为其工作负载尝试几个配置。 一般建议可能如下:如果负载模式是CPU密集型的,例如,处理大量TCP/IP,执行SSL或压缩,则nginx工作(worker)的数量应与CPU内核数量相匹配; 如果负载大多是磁盘I/O绑定,例如,从存储或重代理服务不同的内容集合 - 工作(worker)的数量可能是核心数量的一到两倍。有些工程师会根据个人存储单元的数量选择工作(worker)的数量,但这种方法的效率取决于磁盘存储的类型和配置。
nginx的开发人员将在即将推出的版本中解决的一个主要问题是如何避免磁盘I/O上的大多数阻塞。 目前,如果没有足够的存储性能来提供特定工作(worker)生成的磁盘操作,该工作(worker)可能仍然阻止从磁盘读取/写入。 存在许多机制和配置文件指令来减轻此类磁盘I/O阻塞情况。要注意的是,诸如:sendfile和AIO之类的选项的组合通常会为磁盘性能带来很大的余量。 应该根据数据集,可用于nginx的内存量和底层存储架构来规划安装一个nginx服务器。
现有工作(worker)模式的另一个问题是与嵌入式脚本的有限支持有关。 一个使用标准的nginx分发,只支持嵌入Perl脚本。一个简单的解释:关键问题是嵌入式脚本阻止任何操作或意外退出的可能性。 这两种类型的行为将立即导致工作(worker)挂起的情况,同时影响到数千个连接。 更多的工作(worker)计划是使nginx的嵌入式脚本更简单,更可靠,适用于更广泛的应用。
nginx进程角色
nginx在内存中运行多个进程; 有一个主进程和几个工作(worker)进程。 还有一些特殊用途的过程,特别是缓存加载器和缓存管理器。 所有进程都是单线程版本为1.x的nginx。 所有进程主要使用共享内存机制进行进程间通信。主进程作为root用户运行。 缓存加载器,缓存管理器和工作(worker)则以无权限用户运行。
主程序负责以下任务:
- 读取和验证配置
- 创建,绑定和关闭套接字
- 启动,终止和维护配置的工作(worker)进程数
- 重新配置,无需中断服务
- 控制不间断的二进制升级(如果需要,启动新的二进制并回滚)
- 重新打开日志文件
- 编译嵌入式Perl脚本
工作(worker)进程接受,处理和处理来自客户端的连接,提供反向代理和过滤功能,并执行几乎所有其他的nginx能力。 关于监视nginx实例的行为,系统管理员应该关注工作(worker)进程,因为它们是反映Web服务器实际日常操作的过程。
缓存加载器进程负责检查磁盘缓存项目,并使用缓存元数据填充nginx的内存数据库。 本质上,缓存加载器准备nginx实例来处理已经存储在磁盘上的特定分配的目录结构中的文件。 它遍历目录,检查缓存内容元数据,更新共享内存中的相关条目,然后在所有内容清洁并准备使用时退出。
缓存管理器主要负责缓存到期和无效。 在正常的nginx操作期间它保持在内存中,并且在失败的情况下由主进程重新启动。
nginx缓存简介
在nginx中的缓存以文件系统上的分层数据存储的形式实现。 缓存密钥是可配置的,并且可以使用不同的请求特定参数来控制进入缓存的内容。 缓存密钥和缓存元数据存储在共享存储器段中,高速缓存加载器,缓存管理器和工作(worker)可以访问它们。 目前,除了操作系统的虚拟文件系统机制暗示的优化之外,没有任何内存中的文件缓存。 每个缓存的响应都放在文件系统上的不同文件中。 层次结构(级别和命名细节)通过nginx配置指令进行控制。 当响应写入缓存目录结构时,文件的路径和名称将从代理URL的MD5哈希导出。
将内容放置在缓存中的过程如下:当nginx从上游服务器读取响应时,内容首先写入缓存目录结构之外的临时文件。 当nginx完成处理请求时,它重命名临时文件并将其移动到缓存目录。 如果用于代理的临时文件目录位于另一个文件系统上,则该文件将被复制,因此建议将临时文件目录和缓存目录保存在同一文件系统上。 当需要显式清除缓存目录结构时,从文件中删除文件也是非常安全的。 nginx有第三方扩展,可以远程控制缓存的内容,还有更多的工作计划将此功能集成到主分发中。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx架构
Nginx安装 - Nginx教程™
根据操作系统的不同,nginx可以安装也不太相同,安装nginx有以下几种不同的方式。
在Linux上安装
对于Linux,可以使用来自nginx.org的nginx软件包。参考网址:
在FreeBSD上安装
在FreeBSD上,可以从包或通过ports系统安装nginx。 端口系统提供更大的灵活性,允许在各种选项之间进行选择。 端口将使用指定的选项编译nginx并进行安装。
在Window上安装
先省略了,不要问为什么!
从源代码构建[推荐]
如果需要一些特殊的功能,在包和端口不可用的情况下,也可以从源代码编译来安装nginx。虽然源代码编译安装更灵活,但这种方法对于初学者来说可能很复杂(建议初学者自己使用源代码编译安装来安装nginx)。有关更多信息,请参阅从源构建nginx。
在本文中,主要介绍从源代码安装nginx,这篇教程是基于CentOS7 64bit系统来安装的,非Centos系统不适用。现在我们就开始吧!
Nginx编译安装
1. 安装前工作
首先更新系统软件源,使用以下命令更新系统 -
[root@localhost ~]# yum update
有关两个命令的一点解释:
yum -y update - 升级所有包,改变软件设置和系统设置,系统版本内核都升级
yum -y upgrade - 升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变
依赖包安装
[root@localhost src]# yum -y install gcc gcc-c++ autoconf automake libtool make cmake
[root@localhost src]# yum -y install zlib zlib-devel openssl openssl-devel pcre-devel
2. 下载Nginx安装源文件
源码下载,可官网下载地址:http://nginx.org/en/download.html 下载并上传到服务器(这里选择最新稳定版本:nginx-1.10.3),如下图所示 -
或直接在服务上执行以下命令下载 -
[root@localhost ~]# cd /usr/local/src
[root@localhost src]# wget -c http://nginx.org/download/nginx-1.10.3.tar.gz
解压上面下载的文件 -
[root@localhost src]# tar zxvf nginx-1.10.3.tar.gz
在编译之前还要做一些前期的准备工作,如:依懒包安装,Nginx用户和用户组等。
3. 新建nginx用户及用户组
使用 root 用户身份登录系统,执行以下命令创建新的用户。
[root@localhost src]# groupadd nginx
[root@localhost src]# useradd -g nginx -M nginx
useradd命令的-M参数用于不为nginx建立home目录
修改/etc/passwd,使得nginx用户无法bash登陆(nginx用户后面由/bin/bash改为/sbin/nologin),
[root@localhost src]# vi /etc/passwd
然后找到有 nginx 那一行,把它修改为(后面由/bin/bash改为/sbin/nologin):
nginx:x:1002:1003::/home/nginx:/sbin/nologin
4. 编译配置、编译、安装
下面我们进入解压的nginx源码目录:/usr/local/src/ 执行以下命令 -
[root@localhost ~]# cd /usr/local/src/nginx*
[root@localhost nginx-1.10.3]# pwd
/usr/local/src/nginx-1.10.3
[root@localhost nginx-1.10.3]#
[root@localhost nginx-1.10.3]# ./configure --prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/run/nginx.pid \
--with-http_ssl_module \
--user=nginx \
--group=nginx \
--with-pcre \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module
注意:上面的反斜杠\ 表示换行继续。
--prefix=/usr/local/nginx 指定安装到 /usr/local/nginx 目录下。
上面配置完成后,接下来执行编译 -
[root@localhost nginx-1.10.3]# make
[root@localhost nginx-1.10.3]# make install
... ...
cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default'
test -d '/usr/local/nginx/run' \
|| mkdir -p '/usr/local/nginx/run'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/html' \
|| cp -R html '/usr/local/nginx'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
make[1]: Leaving directory `/usr/local/src/nginx-1.10.3'
[root@localhost nginx-1.10.3]#
上面编译时间跟你的电脑配置相关,所以可能需要一些等待时间。
查看安装后的程序版本:
[root@localhost nginx-1.10.3]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.10.3
修改Nginx默认端口(可选):
[root@localhost nginx-1.10.3]# vi /usr/local/nginx/conf/nginx.conf
找到 -
... ...
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
... ...
把上面的 80 修改为你想要的端口,如:8080 。
修改配置后验证配置是否合法:
[root@localhost nginx-1.10.3]# /usr/local/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
启动Nginx程序、查看进程 -
[root@localhost nginx-1.10.3]# /usr/local/nginx/sbin/nginx
[root@localhost nginx-1.10.3]# ps -ef | grep nginx
root 29151 1 0 22:01 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 29152 29151 0 22:01 ? 00:00:00 nginx: worker process
root 29154 2302 0 22:01 pts/0 00:00:00 grep --color=auto nginx
[root@localhost nginx-1.10.3]#
nginx停止、重启
未添加nginx服务前对nginx的管理只能通过一下方式管理:
# nginx 管理的几种方式 -
# 启动Nginx
/usr/local/nginx/sbin/nginx
# 从容停止Nginx:
kill -QUIT 主进程号 # 如上一步中的 ps 命令输出的 29151,就是 Nginx的主进程号
# 快速停止Nginx:
kill -TERM 主进程号
# 强制停止Nginx:
pkill -9 nginx
# 平滑重启nginx
/usr/nginx/sbin/nginx -s reload
现在我们来看看安装的Nginx的运行结果,可以简单地使用curl命令访问localhost测试,结果如下 -
[root@localhost nginx-1.10.3]# curl localhost
<!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>
[root@localhost nginx-1.10.3]#
或者也可以打开浏览访问目标服务器的IP,在本示例中,服务器的IP地址是:192.168.0.195,所以打开浏览器访问如下结果 -
提示: 如果没有看到以上界面,在确保Nginx启动的前提下,检查SeLinux和防火墙是否已关闭。关闭防火墙命令:systemctl stop firewalld.service。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx安装
Nginx安装(从Linx包安装) - Nginx教程™
目前,nginx软件包可用于以下发行版和版本:
RHEL/CentOS:
版本 | 支持的平台 |
5.x | x86_64, i386 |
6.x | x86_64, i386 |
7.x | x86_64, ppc64le |
Debian:
版本 | 代码名称(codename) | 支持的平台 |
7.x | wheezy | x86_64, i386 |
8.x | jessie | x86_64, i386 |
Ubuntu:
版本 | 代码名称(codename) | 支持的平台 |
12.04 | precise | x86_64, i386 |
14.04 | trusty | x86_64, i386, aarch64/arm64 |
16.04 | xenial | x86_64, i386, ppc64el |
16.10 | yakkety | x86_64, i386 |
SLES:
版本 | 支持的平台 |
12 | x86_64 |
要实现Linux软件包的自动更新,可以为RHEL/CentOS发行版设置yum存储库,Debian/Ubuntu发行版的apt存储库,以及SLES的zypper存储库。
在本文中,我们重点以Debian/Ubuntu发行版的apt存储库作为一个演示,并在Ubuntu系统上安装Nginx。
1. 用于稳定版本的预构建软件包
RHEL/CentOS系统平台
要设置RHEL/CentOS的yum存储库,需要创建一个名称为/etc/yum.repos.d/nginx.repo的文件,其中包含以下内容:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1
根据所使用的分配,将“OS”替换为“rhel”或“centos”,对于5.x,6.x或7.x,请将“OSRELEASE”替换为“5”,“6”或“7” 版本。
有关于如何查看系统版本 -
[root@localhost nginx-1.10.3]# lsb_release -a
bash:lsb_release: command not found
[root@localhost nginx-1.10.3]# yum install lsb –y
[root@localhost nginx-1.10.3]# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.3.1611 (Core)
Release: 7.3.1611
Codename: Core
[root@localhost nginx-1.10.3]#
第二种方法:
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@localhost ~]#
Debian/Ubuntu系统平台
对于Debian/Ubuntu,为了验证nginx存储库签名,并且在安装nginx软件包时消除关于缺少PGP密钥的警告,必须将用于将nginx软件包和存储库签署的密钥添加到apt程序密钥环中。 请从Nginx官方网站下载密钥:http://nginx.org/keys/nginx_signing.key , 并使用以下命令将其添加到apt程序密钥环:
sudo apt-key add nginx_signing.key
Debian系统则将Debian代码替换为Debian发行版代码(codename),并将以下内容附加到/etc/apt/sources.list文件的末尾:
deb http://nginx.org/packages/debian/ codename nginx
deb-src http://nginx.org/packages/debian/ codename nginx
对于Ubuntu将Ubuntu发行版代号替换codename,并将以下内容附加到/etc/apt/sources.list文件的末尾:
deb http://nginx.org/packages/ubuntu/ codename nginx
deb-src http://nginx.org/packages/ubuntu/ codename nginx
对于Debian / Ubuntu,请运行以下命令:
apt-get update
apt-get install nginx
SLES系统平台
对于SLES,运行以下命令:
zypper addrepo -G -t yum -c 'http://nginx.org/packages/sles/12' nginx
2. 源码包
包源码包可以在包源码源码库中找到: http://hg.nginx.org/pkg-oss?_ga=1.85593177.1509956953.1490042234 。
默认分支保存当前主线版本的包源码,而stable-*分支则用于稳定版本的最新的源码包。 要构建二进制包,可在Debian/Ubuntu上的debian/目录中或在RHEL/CentOS/SLES上的rpm/SPECS/中运行make命令。
包源码分布在与nginx相同的2条BSD类许可证下。
3. Ubuntu Server安装Nginx实例
对于Debian/Ubuntu,为了验证nginx存储库签名,并且在安装nginx软件包时消除关于缺少PGP密钥的警告,必须将用于将nginx软件包和存储库签署的密钥添加到apt程序密钥环中。 请从Nginx官方网站下载密钥:http://nginx.org/keys/nginx_signing.key , 并使用以下命令将其添加到apt程序密钥环:
yiibai@ubuntu:~$ wget -c http://nginx.org/keys/nginx_signing.key
--2017-03-31 20:13:06-- http://nginx.org/keys/nginx_signing.key
Resolving nginx.org (nginx.org)... 95.211.80.227, 206.251.255.63, 2001:1af8:4060:a004:21::e3, ...
Connecting to nginx.org (nginx.org)|95.211.80.227|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1561 (1.5K) [application/octet-stream]
Saving to: ‘nginx_signing.key’
nginx_signing.key 100%[===================>] 1.52K --.-KB/s in 0s
2017-03-31 20:13:06 (105 MB/s) - ‘nginx_signing.key’ saved [1561/1561]
yiibai@ubuntu:~$ ls
nginx_signing.key
yiibai@ubuntu:~$
yiibai@ubuntu:~$ sudo apt-key add nginx_signing.key
查看 Ubuntu发行版代号,使用以下命令 -
yiibai@ubuntu:~$ sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04
Codename: xenial
yiibai@ubuntu:~$
Ubuntu将Ubuntu发行版代号替换codename,并将以下两行内容附加到/etc/apt/sources.list文件的末尾:
deb http://nginx.org/packages/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/ubuntu/ xenial nginx
如下所示 -
现在,可以运行下面命令来安装nginx了:
yiibai@ubuntu:~$ sudo apt-get update
Get:1 http://nginx.org/packages/ubuntu xenial InRelease [3,589 B]
Hit:2 http://us.archive.ubuntu.com/ubuntu xenial InRelease
Get:3 http://nginx.org/packages/ubuntu xenial/nginx Sources [4,139 B]
Get:4 http://us.archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
Get:5 http://nginx.org/packages/ubuntu xenial/nginx amd64 Packages [7,012 B]
Get:6 http://nginx.org/packages/ubuntu xenial/nginx i386 Packages [6,999 B]
Get:7 http://us.archive.ubuntu.com/ubuntu xenial-backports InRelease [102 kB]
Get:8 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB]
Fetched 328 kB in 5s (61.3 kB/s)
Reading package lists... Done
yiibai@ubuntu:~$
yiibai@ubuntu:~$ sudo apt-get install nginx
... ...
... ...
Selecting previously unselected package nginx.
(Reading database ... 54601 files and directories currently installed.)
Preparing to unpack .../nginx_1.10.3-1~xenial_amd64.deb ...
----------------------------------------------------------------------
Thanks for using nginx!
Please find the official documentation for nginx here:
* http://nginx.org/en/docs/
Commercial subscriptions for nginx are available on:
* http://nginx.com/products/
----------------------------------------------------------------------
Unpacking nginx (1.10.3-1~xenial) ...
Processing triggers for man-db (2.7.5-1) ...
Processing triggers for systemd (229-4ubuntu7) ...
Processing triggers for ureadahead (0.100.0-19) ...
Setting up nginx (1.10.3-1~xenial) ...
Processing triggers for systemd (229-4ubuntu7) ...
Processing triggers for ureadahead (0.100.0-19) ...
配置文件默认会被安装到: /etc/nginx 目录下 -
1. 启动 Nginx 测试 -
yiibai@ubuntu:~$ sudo /etc/init.d/nginx
Usage: /etc/init.d/nginx {start|stop|status|restart|reload|force-reload|upgrade|configtest|check-reload}
yiibai@ubuntu:~$ sudo /etc/init.d/nginx start
[ ok ] Starting nginx (via systemctl): nginx.service.
yiibai@ubuntu:~$
2. 查询nginx进程
yiibai@ubuntu:~$ ps -ef | grep nginx
root 9933 1 0 20:36 ? 00:00:00 nginx: master process /usr/sbi n/nginx -c /etc/nginx/nginx.conf
nginx 9938 9933 0 20:36 ? 00:00:00 nginx: worker process
yiibai 9978 8461 0 20:40 pts/0 00:00:00 grep --color=auto nginx
yiibai@ubuntu:~$
上面输出结果中,master就代表该进程是nginx的主进程,它的进程ID是:9933。
3. 停止nginx
要停止Nginx,可以使用以下命令 -
kill -QUIT 主进程号
本例中就是 : kill -QUIT 9933
当然还有通用的停止进程的命令,那就是暴力停止了。
kill -9 进程号
kill一个进程,在查询一下进程是否还存在,一个个的kill,全部kill完就可以了。
4. 测试nginx服务
打开浏览器或或在终端上使用 curl localhost访问目标服务器,如下 -
或在终端上使用:curl localhost -
yiibai@ubuntu:~$ curl localhost
<!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>
yiibai@ubuntu:~$
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx安装(从Linx包安装)
Nginx从源码构建安装配置 - Nginx教程™
使用configure命令配置构建。 它定义了系统的各个方面,包括允许使用nginx进行连接处理的方法。 最后它创建一个Makefile。 configure命令支持以下参数:
- --prefix = path - 定义将保留服务器文件的目录。 这个同一个目录也将用于由configure(除了库源的路径)和nginx.conf配置文件中设置的所有相关路径。 它默认设置为/usr/local/nginx目录。
- --sbin-path = path - 设置nginx可执行文件的名称。此名称仅在安装期间使用。默认情况下文件名为 prefix/sbin/nginx。
- --conf-path = path - 设置nginx.conf配置文件的名称。 如果需要,nginx可以始终使用不同的配置文件启动,方法是在命令行参数-c file 指定。 默认情况下,该文件名为:prefix/conf/nginx.conf。
- --pid-path = path - 设置将存储主进程的进程ID的nginx.pid文件的名称。 安装后,可以使用pid指令在nginx.conf配置文件中更改文件名。 默认情况下,文件名为:prefix/logs/nginx.pid。
- --error-log-path = path - 设置主错误,警告和诊断文件的名称。 安装后,可以在nginx.conf配置文件中使用error_log指令更改文件名。 默认情况下,文件名为:prefix/logs/error.log。
- --http-log-path = path - 设置HTTP服务器主要请求日志文件的名称。 安装后,可以使用access_log指令在nginx.conf配置文件中更改文件名。 默认情况下,文件名为:prefix/logs/access.log。
- --build = name - 设置一个可选的nginx构建名称。
- --user = name - 设置非特权用户的名称,该用户的凭据将由工作进程使用。 安装后,可以使用user指令在nginx.conf配置文件中更改名称。 默认的用户名是:nobody。
- --group = name - 设置由工作进程使用其凭据的组的名称。 安装后,可以使用user指令在nginx.conf配置文件中更改名称。 默认情况下,组名称设置为非特权用户的名称。
- --with-select_module 和 --without-select_module — 启用或禁用构建允许服务器使用select()方法的模块。 如果平台似乎不支持更合适的方法(如kqueue,epoll或/dev/poll),则会自动构建该模块。
- --with-poll_module 和 --without-poll_module — 启用或禁用构建允许服务器使用poll()方法的模块。 如果平台似乎不支持更合适的方法(如kqueue,epoll或/dev/poll),则会自动构建该模块。
- --without-http_gzip_module - 禁用构建压缩HTTP服务器响应的模块。 需要zlib库来构建和运行此模块。
- --without-http_rewrite_module - 禁用构建一个允许HTTP服务器重定向请求并更改请求URI的模块。 需要PCRE库来构建和运行此模块。
- --without-http_proxy_module - 禁用构建HTTP服务器代理模块。
- --with-http_ssl_module - 可以构建一个将HTTPS协议支持添加到HTTP服务器的模块。 默认情况下不构建此模块。 OpenSSL库是构建和运行该模块所必需的。
- --with-pcre = path - 设置PCRE库源的路径。库发行版(4.4 - 8.40版)需要从PCRE站点下载并提取。 其余的由nginx的./configure和make完成。 该库是 location 指令和ngx_http_rewrite_module模块中正则表达式支持所必需的。
- --with-pcre-jit - 使用“即时编译”支持构建PCRE库。
- --with-zlib = path - 设置zlib库的源路径。 库分发(版本1.1.3 - 1.2.11)需要从zlib站点下载并提取。 其余的由nginx的./configure和make完成。 该库是ngx_http_gzip_module模块所必需的。
- --with-cc-opt = parameters - 设置将添加到CFLAGS变量的其他参数。 在FreeBSD下使用系统PCRE库时,应指定--with-cc-opt="-I /usr/local/include"。 如果需要增加select()所支持的文件数,那么也可以在这里指定,如:--with-cc-opt="-D FD_SETSIZE=2048"。
- --with-ld-opt = parameters - 设置链接过程中使用的其他参数。 当在FreeBSD下使用系统PCRE库时,应指定--with-ld-opt="-L /usr/local/lib"。
参数使用示例(所有这些都需要在一行中完成):
./configure
--sbin-path=/usr/local/nginx/nginx
--conf-path=/usr/local/nginx/nginx.conf
--pid-path=/usr/local/nginx/nginx.pid
--with-http_ssl_module
--with-pcre=../pcre-8.40
--with-zlib=../zlib-1.2.11
配置完成后,使用make编译和安装nginx。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx从源码构建安装配置
Nginx快速入门 - Nginx教程™
本文主要介绍nginx的基本配置和操作,并介绍了一些可以完成的简单任务。假设您已经学习过并已经安装好了nginx服务器。 如果没有,请参阅安装nginx页面(http://www.yiibai.com/nginx/nginx-install.html )。 本指南介绍如何启动和停止nginx,并重新加载其配置,解释配置文件的结构,并介绍如何设置nginx以提供静态内容,如何配置nginx作为代理服务器,以及如何将其连接到 一个FastCGI应用程序。
nginx有一个主进程和几个工作进程。 主进程的主要目的是读取和评估配置,并维护工作进程。 工作进程对请求进行实际处理。 nginx采用基于事件的模型和依赖于操作系统的机制来有效地在工作进程之间分配请求。 工作进程的数量可在配置文件中定义,并且可以针对给定的配置进行修改,或者自动调整到可用CPU内核的数量(请参阅worker_processes)。
在配置文件中确定nginx及其模块的工作方式。 默认情况下,配置文件名为nginx.conf,并放在目录:/usr/local/nginx/conf, /etc/nginx, 或 /usr/local/etc/nginx 中。
在前面安装文章配置中,使用的安装配置目录是:/usr/local/nginx/conf 。所以可以在这个目录下找到这个配置文件。
1. 启动,停止和重新加载Nginx配置
要启动nginx,请运行可执行文件。 当nginx启动后,可以通过使用-s参数调用可执行文件来控制它。 使用以下语法:
nginx -s signal
信号(signal)的值可能是以下之一:
- stop - 快速关闭服务
- quit - 正常关闭服务
- reload - 重新加载配置文件
- reopen - 重新打开日志文件
例如,要通过等待工作进程完成服务当前请求来停止nginx进程,可以执行以下命令:
nginx -s quit
注:该命令应该在启动nginx的同一用户下执行。
在将重新配置命令的命令发送到nginx或重新启动之前,配置文件中的更改将不会被应用。 要重新加载配置文件,请执行:
nginx -s reload
当主进程收到要重新加载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。 如果这是成功的,主进程将启动新的工作进程,并向旧的工作进程发送消息,请求它们关闭。 否则,主进程回滚更改,并继续使用旧配置。 老工作进程,接收关闭命令,停止接受新连接,并继续维护当前请求,直到所有这些请求得到维护。 之后,旧的工作进程退出。
还可以借助Unix工具(如kill utility)将信号发送到nginx进程。 在这种情况下,信号直接发送到具有给定进程ID的进程。 默认情况下,nginx主进程的进程ID写入目录/usr/local/nginx/logs或/var/run中的nginx.pid。 例如,如果主进程ID为1628,则发送QUIT信号导致nginx的正常关闭,请执行:
kill -s QUIT 1628
要获取所有运行的nginx进程的列表,可以使用ps命令,例如,以下列方式:
ps -ax | grep nginx
2. 配置文件的结构
nginx由配置文件中指定的指令控制的模块组成。 指令分为简单指令和块指令。 一个简单的指令由空格分隔的名称和参数组成,并以分号(;)结尾。 块指令具有与简单指令相同的结构,但不是以分号结尾,而是以大括号({和})包围的一组附加指令结束。 如果块指令可以在大括号内部有其他指令,则称为上下文(例如:events,http,server和location)。
配置文件中放置在任何上下文之外的伪指令都被认为是主上下文。 events 和http指令驻留在主上下文中,server在http中的,而location在http块中。
#号之后的一行的部分被视为注释。
3. 提供静态内容服务(静态网站)
一个重要的Web服务器任务是提供文件(如图像或静态HTML页面)。这里我们来学习如何实现一个示例,根据请求,文件将从不同的本地目录提供:/data/www(可能包含HTML文件)和/ data/images(包含图像)。这将需要编辑配置文件,并使用两个位置块在http块内设置服务器块。
首先,创建/data/www目录,并将一个包含任何文本内容的index.html文件放入其中,并创建/data/images目录并在其中放置一些图像。创建两个目录 -
[root@localhost ~]# mkdir -p /data/www
[root@localhost ~]# mkdir -p /data/images
[root@localhost ~]#
分别在上面创建的两个目录中放入两个文件:/data/www/index.html 和 /data/images/logo.png,/data/www/index.html文件的内容就一行,如下 -
<h2> New Static WebSite Demo.</h2>
接下来,打开配置文件(/usr/local/nginx/conf/nginx.conf)。 默认的配置文件已经包含了服务器块的几个示例,大部分是注释掉的。 现在注释掉所有这样的块,并启动一个新的服务器块:
http {
server {
}
}
通常,配置文件可以包括服务器监听的端口和服务器名称区分的几个server块。当nginx决定哪个服务器处理请求后,它会根据服务器块内部定义的location指令的参数测试请求头中指定的URI。
将以下location块添加到服务器(server)块:
http {
server {
location / {
root /data/www;
}
}
}
该location块指定与请求中的URI相比较的“/”前缀。 对于匹配请求,URI将被添加到root指令中指定的路径(即/data/www),以形成本地文件系统上所请求文件的路径。 如果有几个匹配的location块,nginx将选择具有最长前缀来匹配location块。 上面的location块提供最短的前缀长度为1,因此只有当所有其他location块不能提供匹配时,才会使用该块。
接下来,添加第二个location块:
http {
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
它将是以/images/(位置/也匹配这样的请求,但具有较短前缀,也就是“/images/”比“/”长)的请求来匹配。
server块的最终配置应如下所示:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
这已经是一个在标准端口80上侦听并且可以在本地机器上访问的服务器( http://localhost/ )的工作配置。 响应以/images/开头的URI的请求,服务器将从/data/images目录发送文件。 例如,响应http://localhost/images/logo.png请求,nginx将发送服务上的/data/images/logo.png文件。 如果文件不存在,nginx将发送一个指示404错误的响应。 不以/images/开头的URI的请求将映射到/data/www目录。 例如,响应http://localhost/about/example.html请求时,nginx将发送/data/www/about/example.html文件。
要应用新配置,如果尚未启动nginx或者通过执行以下命令将重载信号发送到nginx的主进程:
[root@localhost ~]# /usr/local/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
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
如果错误或异常导致无法正常工作,可以尝试查看目录/usr/local/nginx/logs或/var/log/nginx中的access.log和error.log文件中查找原因。
打开浏览器或使用CURL访问Nginx服务器如下所示 -
完整的nginx.conf文件配置内容如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
## 新服务(静态网站)
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
4. 设置简单的代理服务器
nginx的一个常见用途是将其设置为代理服务器,这意味着它可作为一个接收请求的服务器,将其传递给代理服务器,从代理服务器中检索响应,并将其发送给客户端。
我们将配置一个基本的代理服务器,它为来自本地目录的文件提供图像请求,并将所有其他请求发送到代理的服务器。 在此示例中,两个服务器将在单个nginx实例上定义。
首先,通过向nginx配置文件添加一个server块来定义代理服务器,其中包含以下内容:
server {
listen 8080;
root /data/up1;
location / {
}
}
这将是一个监听端口8080的简单服务器(以前,由于使用了标准端口80,所以没有指定listen指令),并将所有请求映射到本地文件系统上的/data/up1目录。 创建此目录并将index.html文件放入其中。 请注意,root指令位于server块上下文中。 当选择用于服务请求的location块不包含自己的root指令时,将使用此root指令。
在上面创建的目录/data/up1中放入一个文件:/data/www/demo.html,文件的内容就一行,如下 -
<h2>About proxy_pass Page at port 8080</h2>
接下来,使用上一节中的服务器配置进行修改,使其成为代理服务器配置。 在第一个位置块中,将proxy_pass指令与参数中指定的代理服务器的协议,名称和端口(在本例中为http://localhost:8080):
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我们将修改当前使用/images/prefix将请求映射到/data/images目录下的文件的第二个location块,使其与典型文件扩展名的图像请求相匹配。 修改后的位置块如下所示:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
该参数是一个正则表达式,匹配所有以.gif,.jpg或.png结尾的URI。正则表达式之前应该是~字符。 相应的请求将映射到/data/images目录。
当nginx选择一个location块来提供请求时,它首先检查指定前缀的location指令,记住具有最长前缀的location,然后检查正则表达式。 如果与正则表达式匹配,nginx会选择此location,否则选择之前记住的那一个。
代理服务器的最终配置将如下所示:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
此服务器将过滤以.gif,.jpg或.png结尾的请求,并将它们映射到/data/images目录(通过向root指令的参数添加URI),并将所有其他请求传递到上面配置的代理服务器。
要应用新配置,如果尚未启动nginx或者通过执行以下命令将重载信号发送到nginx的主进程:
[root@localhost ~]# /usr/local/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
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
首先测试上面配置的 8080 端口的服务,访问服务的8080端口,得到以下结果:
再次访问 80 端口(这里只是一个代理,它会把请求转发给8080的服务,由8080端口这这个服务处理并返回结果到客户端),得到以下结果 -
完整的配置nginx.conf文件内容如下 -
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
## 新服务(服务处理)
server {
listen 8080;
root /data/up1;
location / {
}
}
## 代理配置,数据转发
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
}
5. 设置FastCGI代理
nginx可用于将请求路由到运行使用各种框架和PHP等编程语言构建的应用程序的FastCGI服务器。
使用FastCGI服务器的最基本nginx配置包括使用fastcgi_pass指令(而不是proxy_pass指令),以及fastcgi_param指令来设置传递给FastCGI服务器的参数。 假设FastCGI服务器可以在localhost:9000上访问。 以上一节的代理配置为基础,用fastcgi_pass指令替换proxy_pass指令,并将参数更改为localhost:9000。 在PHP中,SCRIPT_FILENAME参数用于确定脚本名称,QUERY_STRING参数用于传递请求参数。 最终的配置将是:
server {
location / {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
这将设置一个服务器,将除静态图像请求之外的所有请求路由到通过FastCGI协议在localhost:9000上运行的代理服务器。
有关Nginx+PHP+FastCGI服务器,我们将在单独的一篇文章:LANM安装和配置中讲解,请从左侧菜单中查看文章标题进入。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx快速入门
Nginx进程和运行时控制 - Nginx教程™
本节介绍NGINX在运行时启动的过程以及如何控制它们。
在这个部分中,主要涉及两个部分的内容:
- 主进程和工作进程
- 控制NGINX
1. 主进程和工作进程
NGINX有一个主进程和一个或多个工作进程。 如果启用缓存,缓存加载程序和缓存管理器进程也将在启动时运行。
主程序的主要目的是读取和评估配置文件以及维护工作进程。
工作进程执行请求的实际处理。 NGINX依赖于操作系统的机制来有效地在工作进程之间分配请求。 工作进程的数量可在nginx.conf配置文件中定义,可以针对给定的配置进行修复,或者自动调整为可用CPU内核数(请参阅worker_processes)。
2. 控制NGINX
要重新加载配置文件,可以停止或重新启动NGINX,或者发送信号到主进程。 可以使用-s参数运行nginx命令(调用NGINX可执行文件)来发送信号。
nginx -s signal
信号的值可以是以下之一:
- quit – 正常地关闭
- reload – 重新加载配置文件
- reopen – 重新打开日志文件
- stop – 立即关闭(快速关闭)
杀死实用程序也可以使用,将信号直接发送到主进程。 默认情况下,主进程的进程ID被写入位于/usr/local/nginx/logs或/var/run目录中的nginx.pid文件。
nginx可以用信号控制。 默认情况下,主进程的进程ID将写入文件/usr/local/nginx/logs/nginx.pid。 该名称可能在配置时更改,或使用pid指令在nginx.conf文件中进行更改。主程序支持以下信号:
- TERM, INT - 快速关闭
- QUIT - 正常关闭
- HUP - 改变配置,跟上改变的时区(仅适用于FreeBSD和Linux),使用新配置启动新的工作进程,正常关闭旧的工作进程
- USR1 - 重新打开日志文件
- USR2 - 升级可执行文件
- WINCH - 正常关闭工作进程
个别工作进程可以用信号来控制,尽管这不是必需的。 支持的信号有:
- TERM, INT - 快速关闭
- QUIT - 正常关闭
- USR1 - 重新打开日志文件
- WINCH - 调试异常终止(需要启用debug_points)
更改配置
为了使nginx重新读取配置文件,应将HUP信号发送到主进程。 主进程首先检查语法有效性,然后尝试应用新配置,即打开日志文件和新的监听套接字。 如果失败,它会回滚更改,并继续使用旧配置。 如果此操作成功,它将启动新的工作进程,并向旧的工作进程发送消息,请求它们正常关闭。 旧工作进程密切监听套接字,并继续为旧客户端服务。 在所有客户端被服务之后,旧的工作进程被关闭。
我们来举例说明一下。 想象一下,nginx是在FreeBSD 4.x上运行,执行以下命令:
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'
产生以下输出:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
33127 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
33128 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
33129 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
如果将HUP发送到主进程,则输出变为:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33129 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx)
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
PID 33129的老工作流程仍然继续运行。 一段时间后,它退出:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
循环日志文件
要循环日志文件,需要首先重命名。 之后,USR1信号应发送到主进程。 然后,主进程将重新打开所有当前打开的日志文件,并将其分配给正在运行的工作进程的非特权用户作为所有者。 成功重新打开后,主程序关闭所有打开的文件,并将消息发送到工作进程,要求他们重新打开文件。 工作进程也会打开新文件并立即关闭旧文件。 因此,旧文件几乎立即可用于后处理,如压缩。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx进程和运行时控制
Nginx配置文件 - Nginx教程™
NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。 默认情况下,文件名为nginx.conf并放在/etc/nginx目录中(对于开源NGINX产品,位置取决于用于安装NGINX和操作系统的软件包系统,它通常位于/usr/local/nginx/conf/etc/nginx或/usr/local/etc/nginx。)
配置文件由指令及其参数组成。 简单(单行)指令各自以分号结尾。 其他指令作为“容器”,将相关指令组合在一起,将其包围在花括号({})中。 以下是简单指令的一些示例。
user nobody;
error_log logs/error.log notice;
worker_processes 1;
为了使配置更易于维护,建议您将其拆分为存储在/etc/nginx/conf.d目录中的一组功能特定文件,并在主nginx.conf文件中使用include指令引用(包函)指定文件的内容。如下所示 -
include conf.d/http;
include conf.d/stream;
include conf.d/exchange-enhanced;
几个顶级指令(称为上下文)将适用于不同流量类型的指令组合在一起:
指定在这些上下文之外的指令是在主上下文中。
在每个流量处理上下文中,可包括一个或多个服务器上下文来定义控制请求处理的虚拟服务器。 您可以在服务器环境中包含的指令根据流量类型而有所不同。
对于HTTP流量(http上下文),每个服务器指令控制对特定域或IP地址上的资源请求的处理。 服务器上下文中的一个或多个位置上下文定义了如何处理特定的URI集合。
对于邮件和TCP流量(mail 和 stream 上下文),服务器指令各自控制到达特定TCP端口或UNIX套接字的流量处理。
以下配置说明了上下文的使用情况。
user nobody; # a directive in the 'main' context
events {
# configuration of connection processing
}
http {
# Configuration specific to HTTP and affecting all virtual servers
server {
# configuration of HTTP virtual server 1
location /one {
# configuration for processing URIs with '/one'
}
location /two {
# configuration for processing URIs with '/two'
}
}
server {
# configuration of HTTP virtual server 2
}
}
stream {
# Configuration specific to TCP and affecting all virtual servers
server {
# configuration of TCP virtual server 1
}
}
对于大多数指令,在另一个上下文(子上下文)中定义的上下文将继承父级中包含的伪指令的值。 要覆盖从父进程继承的值,请在子上下文中包含该指令。 有关上下文遗留的更多信息,请参阅proxy_set_header伪指令的文档。
要更改配置文件才能生效,NGINX必须重新加载该文件。可以重新启动nginx进程或发送reload信号来升级配置,而不会中断当前请求的处理。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx配置文件
Nginx配置Web服务器 - Nginx教程™
本文介绍如何将NGINX配置作为Web服务器,并包括以下部分:
- 设置虚拟服务器
- 配置位置
- 使用变量
- 返回特定状态码
- 重写请求中的URI
- 重写HTTP响应
- 处理错误
在高层次上,将NGINX配置作为Web服务器有一些问题需要了解,定义它处理哪些URL以及如何处理这些URL上的资源的HTTP请求。 在较低层次上,配置定义了一组控制对特定域或IP地址的请求的处理的虚拟服务器。
用于HTTP流量的每个虚拟服务器定义了称为位置的特殊配置实例,它们控制特定URI集合的处理。 每个位置定义了自己的映射到此位置的请求发生的情况。 NGINX可以完全控制这个过程。 每个位置都可以代理请求或返回一个文件。 此外,可以修改URI,以便将请求重定向到另一个位置或虚拟服务器。 此外,可以返回特定的错误代码,也可以配置特定的页面以对应于每个错误代码。
1. 设置虚拟服务器
NGINX配置文件必须至少包含一个服务器指令来定义虚拟服务器。 当NGINX处理请求时,它首先选择提供请求的虚拟服务器。
虚拟服务器由http上下文中的服务器指令定义,例如:
http {
server {
# Server configuration
}
}
可以将多个server指令添加到http上下文中以定义多个虚拟服务器。
server配置块通常包括一个listen指令,用于指定服务器侦听请求的IP地址和端口(或Unix域套接字和路径)。IPv4和IPv6地址均被接受; 将方括号(。
下面的示例显示了监听IP地址127.0.0.1和端口8080的服务器的配置:
server {
listen 127.0.0.1:8080;
# The rest of server configuration
}
如果省略端口,则使用标准端口。 同样地,如果省略一个地址,服务器将侦听所有地址。 如果没有包含listen指令,则“标准”端口为80/tcp,“default”端口为8000/tcp,具体取决于超级用户权限。
如果有多个服务器与请求的IP地址和端口相匹配,则NGINX将根据服务器块中的server_name指令测试请求的主机头域。 server_name的参数可以是完整(精确)名称,通配符或正则表达式。 通配符是一个字符串,其开头,结尾或两者都包含星号(*); 星号匹配任何字符序列。 NGINX将Perl语法用于正则表达式; 在它们之前使用波浪号(〜)。 此示例说明了一个确切的名称。
server {
listen 80;
server_name example.org www.example.org;
...
}
如果匹配主机头几个名称,则NGINX通过按以下顺序搜索名称并使用其找到的第一个匹配来选择一个:
- 确切的名字(完整准确的名称)
- 以星号开头的最长通配符,例如:*.example.org
- 以星号结尾的最长通配符,如:mail.*
- 第一个匹配正则表达式(按照出现在配置文件中的顺序)
如果主机头字段与服务器名称不匹配,则NGINX会将请求路由到请求到达端口的默认服务器。 默认服务器是nginx.conf文件中列出的第一个服务器,除非您将listen_server参数包含在listen指令中以明确指定服务器为默认值。
server {
listen 80 default_server;
...
}
一个完整的Nginx虚拟机配置示例,这里我们演示配置两个虚拟机,对应域名分别为:vhost1.com 和 vhost2.com,vhost1.com网站的主目录在/data/www/vhost1,vhost2.com网站的主目录在/data/www/vhost2:
server {
listen 80;
server_name vhost1.com www.vhost1.com;
index index.html index.html;
root /data/www/vhost1;
access_log /var/log/vhost1.com.log;
}
server {
listen 80;
server_name vhost2.com www.vhost2.com;
index index.html index.html;
root /data/www/vhost2;
access_log /var/log/vhost2.com.log;
}
2. 配置位置
NGINX可以根据请求URI向不同的代理发送流量或提供不同的文件。 这些块是使用放置在server指令中的location指令来定义的。
例如,您可以定义三个location块,以指示虚拟服务器向一个代理服务器发送一些请求,将其他请求发送到不同的代理服务器,并通过从本地文件系统传递文件来提供其余请求。
NGINX测试根据所有location指令的参数请求URI,并应用匹配location中定义的指令。 在每个location块内,通常可能(除了一些例外)放置更多的location指令以进一步细化特定组请求的处理。
注意:在本教程文章中,单词location是指单个location上下文。
location指令有两种类型的参数:前缀字符串(路径名)和正则表达式。 对于要匹配前缀字符串的请求URI,必须以前缀字符串开头。
具有pathname参数的以下示例位置匹配以/some/path/开头的请求URI,例如/some/path/document.html,它不匹配/my-site/some/path,因为/some/path不在该URI的开头出现。
location /some/path/ {
...
}
正则表达式之前是区分大小写匹配的波形符号(~),或者不区分大小写匹配的波形符号(~*)。 以下示例将包含字符串.html或.html的URI与任何位置相匹配。
location ~ \.html? {
...
}
要找到最符合URI的位置,NGINX首先将URI与前缀字符串的位置进行比较。然后用正则表达式搜索位置。
除非使用^~修饰符对正则表达式给予更高的优先级。在前缀字符串中,NGINX选择最具体的字符串(也就是最长和最完整的字符串)。 下面给出了选择处理请求的位置的确切逻辑:
- 测试所有URI的前缀字符串。
- =(等号)修饰符定义了URI和前缀字符串完全匹配。如果找到完全匹配,则搜索停止。
- 如果^~(插入符号)修饰符预先添加最长匹配前缀字符串,则不会检查正则表达式。
- 存储最长匹配的前缀字符串。
- 根据正则表达式测试URI。
- 断开第一个匹配的正则表达式并使用相应的位置。
- 如果没有正则表达式匹配,则使用与存储的前缀字符串相对应的位置。
=修饰符的典型用例是/(正斜杠)的请求。 如果请求/是频繁的,则指定=/作为location指令的参数加速处理,因为搜索匹配在第一次比较之后停止。
location = / {
...
}
location上下文可以包含定义如何解析请求的指令 - 提供静态文件或将请求传递给代理的服务器。 在以下示例中,匹配第一个location上下文的请求将从/data/images目录中提供文件,并将匹配第二个位置的请求传递给承载 www.example.com 域内容的代理服务器。
server {
location /images/ {
root /data;
}
location / {
proxy_pass http://www.example.com;
}
}
root指令指定要在其中搜索要提供的静态文件的文件系统路径。 与该位置相关联的请求URI将附加到路径,以获取要提供的静态文件的全名。 在上面的示例中,要响应/images/logo.png的请求,NGINX提供服务器本地实际对应文件是:/data/images/logo.png。
proxy_pass指令将请求传递给使用配置的URL访问代理服务器。然后将代理服务器的响应传回客户端。在上面的示例中,所有不以/images/开头的URI的请求都将被传递给代理的服务器(也就是:www.example.com)。
3. 使用变量
可以使用配置文件中的变量,使NGINX进程的请求根据定义的情况而有所不同。 变量是在运行时计算的命名值,用作指令的参数。 一个变量由它的名字开头的$(美元)符号表示。 变量根据NGINX的状态定义信息,例如正在处理的请求的属性。
有许多预定义的变量,如核心HTTP变量,您可以使用set,map和geo指令定义自定义变量。 大多数变量在运行时计算的,并包含与特定请求相关的信息。 例如,$remote_addr包含客户端IP地址,$uri保存当前的URI值。
4. 返回特定状态码
一些网站URI需要立即返回具有特定错误或重定向代码的响应,例如当页面被暂时移动或永久移动时。 最简单的方法是使用return指令。 例如返回未找到的404状态码:
location /wrong/url {
return 404;
}
返回的第一个参数是响应代码。可选的第二个参数可以是重定向的URL(代码301,302,303和307)或在响应体中返回文本。 例如:
location /permanently/moved/url {
return 301 http://www.example.com/moved/here;
}
返回指令可以包含在 location 和 server 上下文中。
重写URI请求
可以通过使用rewrite指令在请求处理期间多次修改请求URI,该指令具有一个可选参数和两个必需参数。 第一个(必需)参数是请求URI必须匹配的正则表达式。 第二个参数是用于替换匹配URI的URI。 可选的第三个参数是可以停止进一步重写指令的处理或发送重定向(代码301或302)的标志。例如:
location /users/ {
rewrite ^/users/(.*)$ /show?user=$1 break;
}
如该示例所示,用户通过匹配正则表达式捕获第二个参数。
您可以在location 和 server上下文中包含多个rewrite指令。 NGINX按照它们发生的顺序逐个执行指令。 当选择该上下文时,server上下文中的rewrite指令将被执行一次。
在NGINX处理一组rewrite指令之后,它根据新的URI选择一个location上下文。 如果所选location块包含rewrite指令,则依次执行它们。 如果URI与其中任何一个匹配,则在处理所有定义的rewrite指令之后,将搜索新location块。
以下示例显示了与返回指令相结合的rewrite指令。
server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
此示例配置区分两组URI。 诸如/download/some/media/file之类的URI更改为/download/some/mp3/file.mp3。由于最后一个标志,所以跳过后续指令(第二次rewrite和return指令),但NGINX继续处理该请求,该请求现在具有不同的URI。类似地,诸如/download/some/audio/file的URI被替换为/download/some/mp3/file.ra。 如果URI与rewrite指令不匹配,则NGINX将403错误代码返回给客户端。
有两个中断处理重写指令的参数:
- last - 停止执行当前服务器或位置上下文中的重写指令,但是NGINX会搜索与重写的URI匹配的位置,并且应用新位置中的任何重写指令(URI可以再次更改,往下继续匹配)。
- break - 像break指令一样,在当前上下文中停止处理重写指令,并取消搜索与新URI匹配的位置。新位置(location)块中的rewrite指令不执行。
5. 重写HTTP响应
有时您需要重写或更改HTTP响应中的内容,将一个字符串替换为另一个字符串。 您可以使用sub_filter指令来定义要应用的重写。 该指令支持变量和替代链,使更复杂的更改成为可能。
例如,您可以更改引用除代理服务器之外的绝对链接:
location / {
sub_filter /blog/ /blog-staging/;
sub_filter_once off;
}
另一个示例将方法从http://更改为http://,并从请求头域替换本地主机地址到主机名。 sub_filter_once指令告诉NGINX在一个位置(location)内连续应用sub_filter伪指令:
location / {
sub_filter 'href="http://127.0.0.1:8080/' 'href="http://$host/';
sub_filter 'img src="http://127.0.0.1:8080/' 'img src="http://$host/';
sub_filter_once on;
}
请注意,如果发生另一个sub_filter匹配,则使用sub_filter修改的响应部分将不再被替换。
- 处理错误
使用error_page指令,您可以配置NGINX返回自定义页面以及错误代码,替换响应中的其他错误代码,或将浏览器重定向到其他URI。 在以下示例中,error_page指令指定要返回404页面错误代码的页面(/404.html)。
error_page 404 /404.html;
请注意,此伪指令并不立即返回该错误(返回指令执行该操作),而仅仅是指定发生时如何处理错误。 错误代码可以来自代理服务器,或者在NGINX处理期间发生(例如,当NGINX找不到客户端请求的文件时,显示404对应的结果)。
在以下示例中,当NGINX找不到页面时,它会将代码301替换为代码404,并将客户端重定向到http:/example.com/new/path.html。 当客户端仍尝试访问其旧URI的页面时,此配置非常有用。 301代码通知浏览器页面已经永久移动,并且需要在返回时自动替换旧地址。
location /old/path.html {
error_page 404 =301 http:/example.com/new/path.html;
}
以下配置是在未找到文件时将请求传递给后端的示例。 因为在error_page指令的等号之后没有指定状态代码,所以对客户机的响应具有代理服务器返回的状态代码(不一定是404)。
server {
...
location /images/ {
# Set the root directory to search for the file
root /data/www;
# Disable logging of errors related to file existence
open_file_cache_errors off;
# Make an internal redirect if the file is not found
error_page 404 = /fetch$uri;
}
location /fetch/ {
proxy_pass http://backend/;
}
}
当没有找到文件时,error_page指令指示NGINX进行内部重定向。 error_page指令的最终参数中的$uri变量保存当前请求的URI,该URI在重定向中被传递。
例如,如果没有找到/images/some/file,它将被替换为/fetch/images/some/file,并且新的搜索位置(location)开始。最后请求最终在第二个location上下文中,并被代理到http://backend/。
如果没有找到文件,则open_file_cache_errors指令可防止写入错误消息。 因为丢失的文件可被正确地处理,但这不是必需的。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx配置Web服务器
Nginx配置静态内容服务器 - Nginx教程™
本节介绍如何使用NGINX来提供静态内容服务,定义搜索路径以查找请求的文件的方法,以及如何设置索引文件。
在这个部分,我们主要涉及以下几个方面的内容:
- 根目录和索引文件
- 尝试几个选项
- 优化NGINX服务内容的速度
1. 根目录和索引文件
root指令指定将用于搜索文件的根目录。 要获取请求文件的路径,NGINX将请求URI附加到root指令指定的路径。 该指令可以放置在http,server或location上下文中的任何级别上。 在下面的示例中,为虚拟服务器定义了root指令。 它适用于不包括root指令的所有location块以显式重新定义根:
server {
root /www/data;
location / {
}
location /images/ {
}
location ~ \.(mp3|mp4) {
root /www/media;
}
}
这里,NGINX在文件系统的/www/data/images/目录中搜索以/images/开头的URI。 但是,如果URI以.mp3或.mp4扩展名结尾,则NGINX会在/www/media/目录中搜索.mp3或.mp4文件,因为它在匹配的location块中定义。
如果请求以斜杠结尾,则NGINX将其视为对目录的请求,并尝试在目录中找到索引文件。index指令定义索引文件的名称(默认值为index.html)。继续示例,如果请求URI为/images/some/path/,则NGINX会传递文件/www/data/images/some/path/index.html(如果存在)。 如果不存在文件,NGINX默认返回HTTP代码404(未找到)。 要配置NGINX以返回自动生成的目录列表,请将on参数添加到autoindex指令中:
location /images/ {
autoindex on;
}
可以在索引指令中列出多个文件名。 NGINX以指定的顺序搜索文件,并返回它找到的第一个文件。
location / {
index index.$geo.html index.html index.html;
}
这里使用的$geo变量是通过geo指令设置的自定义变量。 变量的值取决于客户端的IP地址。
要返回索引文件,NGINX检查其是否存在,然后通过将索引文件的名称附加到基本URI来对通过URI获取的内部重定向。内部重定向会导致对某个位置(location)的新搜索,并且可能会在另一个位置(location)中结束,如以下示例所示:
location / {
root /data;
index index.html index.php;
}
location ~ \.php {
fastcgi_pass localhost:8000;
...
}
在这里,如果请求中的URI是/path/,并且/data/path/index.html不存在,但是/data/path/index.php存在,则将/path/index.php 内部重定向映射到第二个位置(location)。 因此,请求被代理。
2. 尝试几个选项
try_files指令可用于检查指定的文件或目录是否存在并进行内部重定向,如果没有指定的文件或目录,则返回特定的状态代码。 例如,要检查与请求URI相对应的文件的存在,请使用try_files指令和$uri变量,如下所示:
server {
root /www/data;
location /images/ {
try_files $uri /images/default.gif;
}
}
该文件以URI的形式指定,它使用在当前位置或虚拟服务器的上下文中设置的 root 或 alias 伪指令进行处理。 在这种情况下,如果与原始URI相对应的文件不存在,则NGINX将内部重定向到最后一个参数中指定的URI,也就是返回/www/data/images/default.gif。
最后一个参数也可以是一个状态代码(直接在前面的等号)或位置的名称。 在以下示例中,如果try_files指令的任何参数都不会解析为现有文件或目录,则会返回404错误。
location / {
try_files $uri $uri/ $uri.html =404;
}
在下一个示例中,如果原始URI和带有附加尾部斜线的URI都不能解析为现有文件或目录,则将请求重定向到将其传递给代理服务器的命名位置(location)。
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://backend.example.com;
}
3. 优化NGINX服务内容的速度
加载速度是服务任何内容的关键因素。 对您的NGINX配置进行小幅优化可能会提高生产力并帮助实现最佳性能。
启用sendfile
默认情况下,NGINX会自动处理文件传输,并在发送文件之前将其复制到缓冲区中。 启用sendfile指令将消除将数据复制到缓冲区中的步骤,并允许将数据从一个文件描述符直接复制到另一个文件描述符。 或者,为了防止一个快速连接完全占用工作进程,您可以通过定义sendfile_max_chunk指令来限制在单个sendfile()调用中传输的数据量:
location /mp3 {
sendfile on;
sendfile_max_chunk 1m;
...
}
启用tcp_nopush
将tcp_nopush选项与sendfile一起使用。 该选项将使NGINX能够通过sendfile获取数据块之后,在一个数据包中发送HTTP响应头
location /mp3 {
sendfile on;
tcp_nopush on;
...
}
启用tcp_nodelay
tcp_nodelay选项可以覆盖Nagle的算法,最初是为了解决慢网络中的小数据包问题而设计的。 该算法将大量小数据包整合到较大的数据包中,并以200 ms的延迟发送数据包。
如今,当服务大型静态文件时,无论数据包大小如何,都可以立即发送数据。 延迟也会影响在线应用程序(ssh,在线游戏,网上交易)。 默认情况下,tcp_nodelay指令设置为on,表示Nagle的算法被禁用。 该选项仅用于Keepalive连接:
location /mp3 {
tcp_nodelay on;
keepalive_timeout 65;
...
}
优化积压队列
其中一个重要因素是NGINX可以处理传入连接的速度。 一般规则是建立连接时,将其放入监听套接字的“侦听”队列中。 在正常负载下,有一个低队列,或根本没有队列。 但是在高负载下,队列可能会急剧增长,这可能会导致性能不均衡,连接丢失和延迟。
测量侦听队列
让我们来查看当前的侦听队列。 运行命令:
netstat -Lan
命令输出可能如下所示:
Current listen queue sizes (qlen/incqlen/maxqlen)
Listen Local Address
0/0/128 *.12345
10/0/128 *.80
0/0/128 *.8080
命令输出显示端口80的监听队列中有10个不接受的连接,而连接限制为128个连接,这种情况是正常的。
但是,命令输出可能如下所示:
Current listen queue sizes (qlen/incqlen/maxqlen)
Listen Local Address
0/0/128 *.12345
192/0/128 *.80
0/0/128 *.8080
命令输出显示超过128个连接限制的192个不可接受的连接。 当网站的流量很大时,这是很常见的。 为了达到最佳性能,您需要增加NGINX在操作系统和NGINX配置中排队等待接收的最大连接数。
调整操作系统
将net.core.somaxconn键的值从其默认值(128)增加到足够高的值以能够处理高突发流量:
对于FreeBSD,运行命令:
sudo sysctl kern.ipc.somaxconn=4096
对于FreeBSD,运行命令:
sudo sysctl -w net.core.somaxconn=4096
打开文件:/etc/sysctl.conf,将下面一行添加到文件并保存文件:
net.core.somaxconn = 4096
调整NGINX
如果将somaxconn键设置为大于512的值,请更改NGINX listen指令的backlog参数以匹配:
server {
listen 80 backlog 4096;
# The rest of server configuration
}
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx配置静态内容服务器
Nginx反向代理 - Nginx教程™
本文介绍代理服务器的基本配置。 您将学习如何通过不同协议将NGINX请求传递给代理的服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应缓冲。
代理服务器的基本配置目录
- 代理服务器介绍
- 将请求传递给代理的服务器
- 传递请求标头
- 配置缓冲区
- 选择传出IP地址
1. 代理服务器介绍
代理通常用于在多个服务器之间分配负载,无缝地显示来自不同网站的内容,或者通过HTTP以外的协议将请求传递给应用服务器。
2. 将请求传递给代理的服务器
当NGINX代理请求时,它将请求发送到指定的代理服务器,获取响应,并将其发送回客户端。 可以使用指定的协议将请求代理到HTTP服务器(另一个NGINX服务器或任何其他服务器)或非HTTP服务器(可以运行使用特定框架开发的应用程序,如PHP或Python)。 支持的协议包括FastCGI,uwsgi,SCGI和memcached。
要将请求传递给HTTP代理服务器,则在一个location块内指定proxy_pass指令。 例如:
location /some/path/ {
proxy_pass http://www.example.com/link/;
}
此示例配置将在此location处理的所有请求传递到指定地址(http://www.example.com/link/)处的代理服务器。该地址可以指定为域名或IP地址。 该地址还可能包括一个端口:
location ~ \.php {
proxy_pass http://127.0.0.1:8000;
}
请注意,在上述第一个示例中,代理服务器的地址后面是URI为 /link/。 如果URI与地址一起指定,它将替换与location参数匹配请求URI的部分。 例如,这里使用/some/path/page.html的URI请求将被代理到http://www.example.com/link/page.html。 如果地址被指定为没有URI,或者不可能确定要替换的URI部分,则会传递完整的请求URI(可能是修改)。
要将请求传递给非HTTP代理服务器,应使用适当的**_ pass指令:
- fastcgi_pass 将请求传递给FastCGI服务器
- uwsgi_pass 将请求传递给uwsgi服务器
- scgi_pass 将请求传递给SCGI服务器
- memcached_pass 将请求传递给memcached服务器
请注意,在这些情况下,指定地址的规则可能不同。 您可能还需要向服务器传递其他参数(有关详细信息,请参阅参考文档)。
proxy_pass指令也可以指向一组命名的服务器。 在这种情况下,根据指定的方法在组中的服务器之间分配请求。
3. 传递请求标头
默认情况下,NGINX在代理请求“Host” 和 “Connection”中重新定义了两个头字段,并消除了其值为空字符串的头字段。 “Host”设置为$proxy_host变量,“Connection”设置为关闭(close)。
要更改这些设置,以及修改其他header字段,请使用proxy_set_header指令。 该指令可以在一个或多个位置(location)指定。 它也可以在特定的server上下文或http块中指定。 例如:
location /some/path/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8000;
}
在此配置中,“Host”字段设置为 $host 变量。
为了防止头域被传递给代理服务器,请将其设置为空字符串,如下所示:
location /some/path/ {
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:8000;
}
4. 配置缓冲区
默认情况下,NGINX缓存来自代理服务器的响应。 响应存储在内部缓冲区中,并且不会发送到客户端,直到收到整个响应。 缓冲有助于通过慢客户端优化性能,如果响应从NGINX同步传递到客户端,这可能会浪费代理服务器时间。 然而,当启用缓冲时,NGINX允许代理服务器快速处理响应,而NGINX存储响应时间与客户端需要下载的时间一样长。
负责启用和禁用缓冲的指令是proxy_buffering。 默认情况下,它被设置为开启且缓冲已启用。
proxy_buffers指令控制分配给请求的缓冲区的大小和数量。 来自代理服务器的响应的第一部分存储在单独的缓冲区中,其大小由proxy_buffer_size指令设置。 这部分通常包含一个比较小的响应头,并且可以比其余的响应的缓冲区小。
在以下示例中,缓冲区的默认数量增加,并且响应的第一部分的缓冲区的大小小于默认值。
location /some/path/ {
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8000;
}
如果缓存被禁用,则在从代理服务器接收缓冲时,响应将同步发送到客户端。 对于需要尽快开始接收响应的快速交互式客户端,此行为可能是可取的。
要禁用特定位置的缓冲,请在location块中将proxy_buffering伪指令设置为off,如下所示:
location /some/path/ {
proxy_buffering off;
proxy_pass http://localhost:8000;
}
在这种情况下,NGINX只使用由proxy_buffer_size配置的缓冲区来存储响应的当前部分。
5. 选择传出IP地址
如果您的代理服务器有多个网络接口,有时您可能需要选择特定的源IP地址才能连接到代理服务器或上游。 如果NGINX后端的代理服务器只配置为接受来自特定IP网络或IP地址范围的连接,在这种情况下,这个配置选项就很有用。
指定proxy_bind指令和必要网络接口的IP地址:
location /app1/ {
proxy_bind 127.0.0.1;
proxy_pass http://example.com/app1/;
}
location /app2/ {
proxy_bind 127.0.0.2;
proxy_pass http://example.com/app2/;
}
IP地址也可以用变量指定。 例如,$server_addr变量传递接受请求的网络接口的IP地址:
location /app3/ {
proxy_bind $server_addr;
proxy_pass http://example.com/app3/;
}
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx反向代理
Nginx压缩和解压 - Nginx教程™
本节介绍如何配置响应的压缩或解压缩以及发送压缩文件。
在这篇文章中,涉及内容如下 -
- 压缩和解压缩介绍
- 启用压缩
- 启用解压缩
- 发送压缩文件
1. 压缩和解压缩介绍
压缩响应通常会显着减少传输数据的大小。 然而,由于压缩在运行时发生,它还可以增加相当大的处理开销,这会对性能产生负面影响 在向客户端发送响应之前,NGINX会执行压缩,但不会“压缩”已压缩的响应(例如,由代理的服务器)。
2. 启用压缩
要启用压缩,请使用包含gzip指令并指定on值。
gzip on;
默认情况下,NGINX仅使用MIME类型text/html压缩响应。要使用其他MIME类型压缩响应,请包含gzip_types指令并列出其他类型。
gzip_types text/plain application/xml;
要指定要压缩的响应的最小长度,请使用gzip_min_length指令。 默认值为20字节(可将此处调整为1000):
gzip_min_length 1000;
默认情况下,NGINX不会压缩对代理请求的响应(来自代理服务器的请求)。 请求来自代理服务器的事实由请求中Via头字段的存在确定。 要配置这些响应的压缩,请使用gzip_proxied指令。 该指令具有多个参数,指定NGINX应压缩哪种代理请求。例如,仅对不会在代理服务器上缓存的请求压缩响应是合理的。 为此,gzip_proxied指令具有指示NGINX在响应中检查Cache-Control头字段的参数,如果值为no-cache, no-store 或 private,则压缩响应。 另外,您必须包括 Expires 参数以用来检查Expires头域的值。 这些参数在以下示例中与auth参数一起设置,该参数检查Authorization头字段的存在(授权响应特定于最终用户,并且通常不被缓存):
gzip_proxied no-cache no-store private expired auth;
与大多数其他指令一样,配置压缩的指令可以包含在http上下文中,也可以包含在 server 或 location 配置块中。
gzip压缩的整体配置可能如下所示。
server {
gzip on;
gzip_types text/plain application/xml;
gzip_proxied no-cache no-store private expired auth;
gzip_min_length 1000;
...
}
3. 启用解压缩
某些客户端不支持使用gzip编码方法的响应。 同时,可能需要存储压缩数据,或者即时压缩响应并将它们存储在缓存中。 为了成功地服务于不接受压缩数据的客户端,NGINX可以在将数据发送到后一种类型的客户端时即时解压缩数据。
要启用运行时解压缩,请使用gunzip指令。
location /storage/ {
gunzip on;
...
}
gunzip指令可以在与gzip指令相同的上下文中指定:
server {
gzip on;
gzip_min_length 1000;
gunzip on;
...
}
请注意,此指令在单独的模块中定义,默认情况下可能不包含在开源NGINX构建中。
4. 发送压缩文件
要将文件的压缩版本发送到客户端而不是常规文件,请在适当的上下文中将gzip_static指令设置为on。
location / {
gzip_static on;
}
在这种情况下,为了服务/path/to/file的请求,NGINX尝试查找并发送文件/path/to/file.gz。 如果文件不存在,或客户端不支持gzip,则NGINX将发送未压缩版本的文件。
请注意,gzip_static指令不启用即时压缩。它只是使用压缩工具预先压缩的文件。要在运行时即时压缩内容(而不仅仅是静态内容),请使用gzip指令。
该指令在单独的模块中定义,默认情况下可能不包含在开源NGINX构建中。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx压缩和解压
Nginx内容缓存 - Nginx教程™
本节介绍如何启用和配置从代理服务器接收的响应的缓存。主要涉及以下内容 -
- 缓存介绍
- 启用响应缓存
- 涉及缓存的NGINX进程
- 指定要缓存的请求
- 限制或绕过缓存
- 从缓存中清除内容
- 配置缓存清除
- 发送清除命令
- 限制访问清除命令
- 从缓存中完全删除文件
- 缓存清除配置示例
- 字节缓存
- 组合配置示例
1. 介绍
当启用缓存时,NGINX将响应保存在磁盘缓存中,并使用它们来响应客户端,而不必每次都为同一内容代理请求。
2. 启用响应缓存
要启用缓存,请在顶层的http上下文中包含proxy_cache_path指令。 强制的第一个参数是缓存内容的本地文件系统路径,强制keys_zone参数定义用于存储有关缓存项目的元数据的共享内存区域的名称和大小:
http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
}
然后在要缓存服务器响应的上下文(协议类型,虚拟服务器或位置)中包含proxy_cache指令,将由keys_zone参数定义的区域名称指定为proxy_cache_path指令(在本例中为一):
http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
server {
proxy_cache one;
location / {
proxy_pass http://localhost:8000;
}
}
}
请注意,由keys_zone参数定义的大小不会限制缓存的响应数据的总量。 缓存响应本身存储在文件系统上的特定文件中的元数据副本。 要限制缓存的响应数据量,请将max_size参数包含到proxy_cache_path指令中(但请注意,缓存数据的数量可能会临时超出此限制,如以下部分所述。)
3. 涉及缓存的NGINX进程
缓存中还有两个额外的NGINX进程:
- 缓存管理器周期性地被激活以检查缓存的状态。 如果缓存大小超过了由max_cize_path指令设置的max_size参数,缓存管理器将删除最近访问的数据。如前所述,高速缓存管理器激活之间的缓存数据量可以临时超过限制。
- NGINX启动后,缓存加载程序只运行一次。 它将有关以前缓存的数据的元数据加载到共享内存区域。一次加载整个缓存可能会在启动后的最初几分钟内消耗足够的资源来减慢NGINX的性能。 为了避免这种情况,请通过将以下参数包含到proxy_cache_path伪指令来配置缓存的迭代加载:
- loader_threshold - 迭代的持续时间,以毫秒为单位(默认为200)
- loader_files - 在一次迭代期间加载的最大项目数(默认为100)
- loader_sleeps - 迭代之间的延迟(以毫秒为单位)(默认为50)
在以下示例中,迭代持续300毫秒或直到加载了200个项目:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
4. 指定要缓存的请求
默认情况下,NGINX首次从代理服务器接收到这样的响应后,缓存对HTTP GET和HEAD方法的请求的所有响应。 作为请求的密钥(标识符),NGINX使用请求字符串。 如果请求具有与缓存响应相同的密钥,则NGINX将缓存的响应发送给客户端。 您可以在http, server, 或 location上下文中包含各种指令,以控制哪些响应被缓存。
要更改在计算密钥时使用的请求字符,请包括proxy_cache_key伪指令:
proxy_cache_key "$host$request_uri$cookie_user";
要定义在缓存响应之前必须进行具有相同密钥的请求的最小次数,请包括proxy_cache_min_uses指令:
proxy_cache_min_uses 5;
要使用除GET和HEAD之外的方法来缓存对请求的响应,请将它们与GET和HEAD一起列为proxy_cache_methods伪指令的参数:
proxy_cache_methods GET HEAD POST;
5. 限制或绕过缓存
默认情况下,响应将无限期地保留在缓存中。 只有缓存超过最大配置大小,然后按照最后一次请求的时间长度,它们才被删除。 您可以通过在http, server, 或 location上下文中包含指令来设置缓存响应被认为有效的时间长度,甚至是否使用它们。
要限制缓存响应与特定状态代码被认为有效的时间,请包括proxy_cache_valid指令:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
在此示例中,使用代码200或302的响应有效时间为10分钟,并且代码404的响应有效1分钟。 要定义具有所有状态代码的响应的有效时间,请指定any作为第一个参数:
proxy_cache_valid any 5m;
要定义NGINX不会向客户端发送缓存响应的条件,请包括proxy_cache_bypass指令。 每个参数定义一个条件并由多个变量组成。 如果至少有一个参数不为空,并且不等于“0”(零),则NGINX不会在缓存中查找响应,而是将请求立即转发到后端服务器。
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
要定义NGINX根本不缓存响应的条件,请包括proxy_no_cache指令,以与proxy_cache_bypass伪指令相同的方式定义参数。
proxy_no_cache $http_pragma $http_authorization;
6. 从缓存中清除内容
NGINX可以从缓存中删除过期的缓存文件。删除过期的缓存内容以防止同时提供旧版本和新版本的网页。 在接收到包含自定义HTTP头或“PURGE” HTTP方法的特殊“purge”请求时,缓存被清除。
6.1 配置缓存清除
我们设置一个配置来标识使用“PURGE” HTTP方法的请求并删除匹配的URL。
- 在http块层级上,创建一个新变量,例如:$purge_method,这将取决于$request_method变量:
http {
...
map $request_method $purge_method {
PURGE 1;
default 0;
}
}
- 在location中配置高速缓存,包括指定缓存清除请求的条件的proxy_cache_purge指令。 在我们的例子中,它是在上一步配置的$purge_method:
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://localhost:8002;
proxy_cache mycache;
proxy_cache_purge $purge_method;
}
}
6.3 发送清除命令
配置proxy_cache_purge指令后,您需要发送一个特殊的缓存清除请求来清除缓存。 您可以使用一系列工具发出清除请求,例如curl命令:
$ curl -X PURGE -D – "http://www.example.com/*"
HTTP/1.1 204 No Content
Server: nginx/1.5.7
Date: Sat, 01 Dec 2015 16:33:04 GMT
Connection: keep-alive
在该示例中,具有公共URL部分(由星号通配符指定)的资源将被删除。 但是,这些高速缓存条目将不会从缓存中完全删除:它们将保留在磁盘上,直到它们被删除为非活动状态(proxy_cache_path的非活动参数),或由缓存清除程序进程处理,或客户端尝试访问它们 。
6.4 限制访问清除命令
建议您配置允许发送缓存清除请求的有限数量的IP地址:
geo $purge_allowed {
default 0; # deny from other
10.0.0.1 1; # allow from localhost
192.168.0.0/24 1; # allow from 10.0.0.0/24
}
map $request_method $purge_method {
PURGE $purge_allowed;
default 0;
}
在这个例子中,NGINX检查请求中是否使用“PURGE”方法,如果是,分析客户端IP地址。 如果IP地址被列入白名单,那么$purge_method设置为$purge_allowed:“1”允许清除,“0”表示清除。
6.5 从缓存中完全删除文件
要完全删除与星号相匹配的缓存文件,您将需要激活一个特殊的缓存清除程序,该过程将永久地遍历所有缓存条目,并删除与通配符相匹配的条目。 在http块级别上,将purger参数添加到proxy_cache_path指令中:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;
6.6 缓存清除配置示例
http {
...
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;
map $request_method $purge_method {
PURGE 1;
default 0;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://localhost:8002;
proxy_cache mycache;
proxy_cache_purge $purge_method;
}
}
geo $purge_allowed {
default 0;
10.0.0.1 1;
192.168.0.0/24 1;
}
map $request_method $purge_method {
PURGE $purge_allowed;
default 0;
}
}
7. 字节缓存
有时,初始缓存填充操作可能需要一些时间,特别是对于大文件。 当第一个请求开始下载视频文件的一部分时,下一个请求将不得不等待整个文件被下载并放入高速缓存。
NGINX使缓存这样的范围请求成为可能,并逐渐用缓存片模块填充高速缓存。 该文件分为较小的“切片”。 每个范围请求选择将覆盖所请求范围的特定切片,并且如果此范围仍未缓存,请将其放入缓存中。 对这些切片的所有其他请求将从缓存中获取响应。
要启用字节范围缓存:
location / {
slice 1m;
}
slice的大小应适当调整,使切片快速下载。 在处理请求时,太小的大小可能会导致内存使用量过多和大量打开的文件描述符,太大的值可能会导致延迟。
- 将$slice_range变量包含到缓存键中:
proxy_cache_key $uri$is_args$args$slice_range;
- 启用使用206状态代码缓存响应:
proxy_cache_valid 200 206 1h;
- 通过在Range头字段中传递$slice_range变量来将传递范围请求设置为代理服务器:
proxy_set_header Range $slice_range;
字节范围缓存示例:
location / {
slice 1m;
proxy_cache cache;
proxy_cache_key $uri$is_args$args$slice_range;
proxy_set_header Range $slice_range;
proxy_cache_valid 200 206 1h;
proxy_pass http://localhost:8000;
}
请注意,如果切片(slice)缓存打开,则不应更改初始文件。
8. 组合配置示例
以下示例配置组合了上述某些缓存选项。
http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300
loader_files=200 max_size=200m;
server {
listen 8080;
proxy_cache one;
location / {
proxy_pass http://backend1;
}
location /some/path {
proxy_pass http://backend2;
proxy_cache_valid any 1m;
proxy_cache_min_uses 3;
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
}
}
}
在这个例子中,两个位置使用相同的缓存,但是以不同的方式。
由于backend1服务器的响应很少更改,因此不包括缓存控制指令。 首次请求响应缓存,并无限期保持有效。
相比之下,对backend2服务的请求的响应频繁变化,因此它们被认为只有1分钟有效,并且在相同请求3次之前不被缓存。 此外,如果请求符合proxy_cache_bypass指令定义的条件,则NGINX会立即将请求传递给backend2,而不在缓存中查找。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx内容缓存
Nginx配置日志 - Nginx教程™
本节介绍如何在NGINX中配置日志记录错误和处理的请求。在本文章中将涉及以下内容 -
- 设置错误日志
- 设置访问日志
- 启用条件日志记录
- 日志记录到Syslog
1. 设置错误日志
NGINX将遇到的不同严重性级别问题的信息写入错误日志。 error_log指令将日志记录设置为特定文件,stderr或syslog,并指定要记录的消息的最低级别。 默认情况下,错误日志位于{NGING_INSTALL_PATH}/logs/error.log(绝对路径取决于操作系统和安装),并记录来自所指定的所有严重级别的消息。
以下配置将错误消息的最小严重性级别更改为从错误记录到警告:
error_log logs/error.log warn;
## 或者可写为: error_log /var/logs/nginx/error.log warn;
在这种情况下,将记录 warn, error crit, alert 和 emerg 级别的消息。
错误日志的默认设置全局工作。 要覆盖它,将error_log指令放在 main (顶级)配置上下文中。main 上下文中的设置始终由其他配置级别继承。 还可以在 http, stream, server 和 location 级别指定error_log指令,并覆盖从较高级别继承的设置。 如果发生错误,则该消息只写入一个错误日志,最接近发生错误的级别的错误日志。 但是,如果在同一级别指定了多个error_log伪指令,则会将消息写入所有指定的日志。
注意:在开源NGINX版本1.5.2中添加了在同一配置级别指定多个error_log伪指令的功能。
2. 设置访问日志
在处理请求之后,NGINX在访问日志中写入有关客户端请求的信息。 默认情况下,访问日志位于{NGING_INSTALL_PATH}logs/access.log中,{NGING_INSTALL_PATH}为安装nginx的目录,信息以预定义的组合格式写入日志。要覆盖这个默认设置,请使用log_format指令更改记录消息的格式,以及access_log指令,以指定日志的位置及其格式。 日志格式使用变量定义。
以下示例定义扩展预定义组合格式的日志格式,其值指示响应gzip的压缩比。 然后将格式应用于启用压缩的虚拟服务器。
http {
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
server {
gzip on;
access_log /spool/logs/nginx-access.log compression;
...
}
}
以下是一些如何读取生成时间值的规则:
- 当通过多个服务器处理请求时,变量包含由逗号分隔的多个值。
- 当从一个上游组到另一个上游组有内部重定向时,这些值以分号分隔。
- 当请求无法到达上游服务器或无法接收到完整报头时,变量包含“0”(零)。
- 在连接到上游或从缓存中获取回复时出现内部错误的情况下,该变量包含“ - ”(连字符)。
可以通过启用缓冲区的日志消息和名称包含变量的常用日志文件的描述符缓存来优化日志记录。 要启用缓冲,请使用access_log指令的缓冲区参数来指定缓冲区的大小。 当下一个日志消息不适合缓冲区以及其他情况时,缓冲的消息将被写入日志文件。
要启用日志文件描述符的缓存,请使用open_log_file_cache指令。
与error_log指令类似,在特定配置级别定义的access_log伪指令将覆盖以前级别的设置。 当请求的处理完成时,消息将被写入到当前级别上配置的日志中,或者从先前的级别继承。 如果一个级别定义了多个访问日志,则会将消息写入所有的访问日志。
3. 启用条件日志记录
条件记录允许从访问日志中排除琐碎或不重要的日志条目。在NGINX中,条件日志记录由access_log伪指令的if参数启用。
此示例不包括使用HTTP状态代码2xx(成功)和3xx(重定向)的请求:
map $status $loggable {
~^[23] 0;
default 1;
}
access_log /path/to/access.log combined if=$loggable;
4. 日志记录到Syslog
syslog实用程序是计算机消息记录的标准,并允许从单个syslog服务器上的不同设备收集日志消息。 在NGINX中,对syslog的日志记录使用error_log和access_log伪指令中的syslog:前缀进行配置。
Syslog消息可以发送到服务器=可以是域名,IP地址或UNIX域的套接字路径。 可以使用端口指定域名或IP地址来覆盖默认端口514. 可以在unix:prefix之后指定UNIX域套接字路径:
error_log server=unix:/var/log/nginx.sock debug;
access_log syslog:server=[2001:db8::1]:1234,facility=local7,tag=nginx,severity=info;
在该示例中,NGINX错误日志消息将在调试日志记录级别写入UNIX域套接字,并将访问日志写入具有IPv6地址和端口1234的syslog服务器。
facility =参数指定正在记录消息的程序类型。 默认值为local7。 其他可能的值是:auth,authpriv,daemon,cron,ftp,lpr,kern,mail,news,syslog,user,uucp,local0 … local7。
tag =参数将自定义标签应用于syslog消息(在我们的示例中为nginx)。
severity =参数设置访问日志的syslog消息的严重性级别。 严重性越来越高的可能值为:debug,info,notice,warn,error(default),crit,alert和emerg。 消息记录在指定的级别和更严重的级别。 在我们的示例中,严重性级别错误还使得可以 crit, alert 和 emerg 级别。
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx配置日志
Nginx+PHP7源码安装配置 - Nginx教程™
在前面几篇文章中,我们已经介绍并演示安装 Nginx 的几种方式,在开始本篇文章的阅读和实践之前,建议先阅读“Nginx安装配置”:http://www.yiibai.com/nginx/nginx-install.html ,在上面文章的基础之上,我们再添加 PHP7 的安装配置。
1. Nginx安装配置
如果需要一些特殊的功能,在包和端口不可用的情况下,也可以从源代码编译来安装nginx。虽然源代码编译安装更灵活,但这种方法对于初学者来说可能很复杂(建议初学者自己使用源代码编译安装来安装nginx)。有关更多信息,请参阅从源构建nginx。
在本文中,主要介绍从源代码安装nginx,这篇教程是基于CentOS7 64bit系统来安装的,非Centos系统不适用。现在我们就开始吧!
1.1 安装前工作
首先更新系统软件源,使用以下命令更新系统 -
[root@localhost ~]# yum update
有关两个命令的一点解释:
yum -y update - 升级所有包,改变软件设置和系统设置,系统版本内核都升级
yum -y upgrade - 升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变
依赖包安装
[root@localhost src]# yum -y install gcc gcc-c++ autoconf automake libtool make cmake
[root@localhost src]# yum -y install zlib zlib-devel openssl openssl-devel pcre-devel
1.2. 下载Nginx安装源文件
源码下载,可官网下载地址:http://nginx.org/en/download.html 下载并上传到服务器(这里选择最新稳定版本:nginx-1.10.3),如下图所示 -
或直接在服务上执行以下命令下载 -
[root@localhost ~]# cd /usr/local/src
[root@localhost src]# wget -c http://nginx.org/download/nginx-1.10.3.tar.gz
解压上面下载的文件 -
[root@localhost src]# tar zxvf nginx-1.10.3.tar.gz
在编译之前还要做一些前期的准备工作,如:依懒包安装,Nginx用户和用户组等。
1.3. 新建nginx用户及用户组
使用 root 用户身份登录系统,执行以下命令创建新的用户。
[root@localhost src]# groupadd nginx
[root@localhost src]# useradd -g nginx -M nginx
useradd命令的-M参数用于不为nginx建立home目录
修改/etc/passwd,使得nginx用户无法bash登陆(nginx用户后面由/bin/bash改为/sbin/nologin),
[root@localhost src]# vi /etc/passwd
然后找到有 nginx 那一行,把它修改为(后面由/bin/bash改为/sbin/nologin):
nginx:x:1002:1003::/home/nginx:/sbin/nologin
1.4. 编译配置、编译、安装
下面我们进入解压的nginx源码目录:/usr/local/src/ 执行以下命令 -
[root@localhost ~]# cd /usr/local/src/nginx*
[root@localhost nginx-1.10.3]# pwd
/usr/local/src/nginx-1.10.3
[root@localhost nginx-1.10.3]#
[root@localhost nginx-1.10.3]# ./configure --prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/run/nginx.pid \
--with-http_ssl_module \
--user=nginx \
--group=nginx \
--with-pcre \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module
注意:上面的反斜杠\ 表示换行继续。
--prefix=/usr/local/nginx 指定安装到 /usr/local/nginx 目录下。
上面配置完成后,接下来执行编译 -
[root@localhost nginx-1.10.3]# make
[root@localhost nginx-1.10.3]# make install
... ...
cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default'
test -d '/usr/local/nginx/run' \
|| mkdir -p '/usr/local/nginx/run'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/html' \
|| cp -R html '/usr/local/nginx'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
make[1]: Leaving directory `/usr/local/src/nginx-1.10.3'
[root@localhost nginx-1.10.3]#
上面编译时间跟你的电脑配置相关,所以可能需要一些等待时间。
查看安装后的程序版本:
[root@localhost nginx-1.10.3]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.10.3
修改Nginx默认端口(可选):
[root@localhost nginx-1.10.3]# vi /usr/local/nginx/conf/nginx.conf
找到 -
... ...
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
... ...
把上面的 80 修改为你想要的端口,如:8080 。
修改配置后验证配置是否合法:
[root@localhost nginx-1.10.3]# /usr/local/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
启动Nginx程序、查看进程 -
[root@localhost nginx-1.10.3]# /usr/local/nginx/sbin/nginx
[root@localhost nginx-1.10.3]# ps -ef | grep nginx
root 29151 1 0 22:01 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 29152 29151 0 22:01 ? 00:00:00 nginx: worker process
root 29154 2302 0 22:01 pts/0 00:00:00 grep --color=auto nginx
[root@localhost nginx-1.10.3]#
nginx停止、重启
未添加nginx服务前对nginx的管理只能通过一下方式管理:
# nginx 管理的几种方式 -
# 启动Nginx
/usr/local/nginx/sbin/nginx
# 从容停止Nginx:
kill -QUIT 主进程号 # 如上一步中的 ps 命令输出的 29151,就是 Nginx的主进程号
# 快速停止Nginx:
kill -TERM 主进程号
# 强制停止Nginx:
pkill -9 nginx
# 平滑重启nginx
/usr/nginx/sbin/nginx -s reload
现在我们来看看安装的Nginx的运行结果,可以简单地使用curl命令访问localhost测试,结果如下 -
[root@localhost nginx-1.10.3]# curl localhost
<!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>
[root@localhost nginx-1.10.3]#
或者也可以打开浏览访问目标服务器的IP,在本示例中,服务器的IP地址是:192.168.0.195,所以打开浏览器访问如下结果 -
提示: 如果没有看到以上界面,在确保Nginx启动的前提下,检查SeLinux和防火墙是否已关闭。关闭防火墙命令:systemctl stop firewalld.service。
2. PHP7安装配置
2.1 源码下载
官网地址:php7下载
[root@localhost ~]# cd /usr/local/src
[root@localhost src]# wget -c http://cn2.php.net/distributions/php-7.1.3.tar.gz
解压压缩包:
[root@localhost src]# tar -xzvf php-7.*
[root@localhost src]# cd php-7*
2.2 安装编译所需依赖包
[root@localhost php-7.1.3]# yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel
或者常见大部分依懒包安装 -
[root@localhost php-7.1.3]# yum install -y wget gcc gcc-c++ autoconf libjpeg libjpeg-devel perl perl* perl-CPAN libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers png jpeg autoconf gcc cmake make gcc-c++ gcc ladp ldap* ncurses ncurses-devel zlib zlib-devel zlib-static pcre pcre-devel pcre-static openssl openssl-devel perl libtoolt openldap-devel libxml2-devel ntpdate cmake gd* gd2 ImageMagick-devel jpeg jpeg* pcre-dev* fontconfig libpng libxml2 zip unzip gzip
2.3 源码编译、安装
通过 ./configure –help 查看支持的编译配置参数,如下所示 -
[root@localhost php-7.1.3]# ./configure --help
`configure' configures this package to adapt to many kinds of systems.
Usage: ./configure [OPTION]... [VAR=VALUE]...
To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
Configuration:
-h, --helpdisplay this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --versiondisplayversion information and exit
-q, --quiet, --silent do not print `checking ...' messages
--cache-file=FILE cache test results inFILE [disabled]
-C, --config-cache alias for `--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources inDIR [configure dir or `..']
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc. You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.
For better control, use the options below.
PHP+Nginx组合的编译配置命令 -
[root@localhost php-7.1.3]# ./configure --prefix=/usr/local/php7 \
--with-config-file-path=/usr/local/php7/etc \
--with-config-file-scan-dir=/usr/local/php7/etc/php.d \
--with-mcrypt=/usr/include \
--enable-mysqlnd \
--with-mysqli \
--with-pdo-mysql \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-gd \
--with-iconv \
--with-zlib \
--enable-xml \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--enable-gd-native-ttf \
--with-openssl \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--enable-opcache
# 执行完成后的结果:
Generating files
configure: creating ./config.status
creating main/internal_functions.c
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
| License: |
| This software is subject to the PHP License, available in this |
| distribution in the file LICENSE. By continuing this installation |
| process, you are bound by the terms of this license agreement. |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point. |
+--------------------------------------------------------------------+
Thank you for using PHP.
config.status: creating php7.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/fpm/php-fpm.conf
config.status: creating sapi/fpm/www.conf
config.status: creating sapi/fpm/init.d.php-fpm
config.status: creating sapi/fpm/php-fpm.service
config.status: creating sapi/fpm/php-fpm.8
config.status: creating sapi/fpm/status.html
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands
编译 + 安装,编译源码, 如下所示 -
$ make
Generating phar.php
Generating phar.phar
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
directorytreeiterator.inc
pharcommand.inc
directorygraphiterator.inc
invertedregexiterator.inc
clicommand.inc
phar.inc
Build complete.
Don't forget to run 'make test'.
## 对编译结果进行测试:
[root@localhost php-7.1.3]# make test
## 很遗憾,我这里make test报错了,已反馈php test信息。
## 安装程序至指定目录:
[root@localhost php-7.1.3]# make install
Installing shared extensions: /usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/
Installing PHP CLI binary: /usr/local/php7/bin/
Installing PHP CLI man page: /usr/local/php7/php/man/man1/
Installing PHP FPM binary: /usr/local/php7/sbin/
Installing PHP FPM defconfig: /usr/local/php7/etc/
Installing PHP FPM man page: /usr/local/php7/php/man/man8/
Installing PHP FPM status page: /usr/local/php7/php/php/fpm/
Installing phpdbg binary: /usr/local/php7/bin/
Installing phpdbg man page: /usr/local/php7/php/man/man1/
Installing PHP CGI binary: /usr/local/php7/bin/
Installing PHP CGI man page: /usr/local/php7/php/man/man1/
Installing build environment: /usr/local/php7/lib/php/build/
Installing header files: /usr/local/php7/include/php/
Installing helper programs: /usr/local/php7/bin/
program: phpize
program: php-config
Installing man pages: /usr/local/php7/php/man/man1/
page: phpize.1
page: php-config.1
/usr/local/src/php-7.1.3/build/shtool install -c ext/phar/phar.phar /usr/local/php7/bin
ln -s -f phar.phar /usr/local/php7/bin/phar
Installing PDO headers: /usr/local/php7/include/php/ext/pdo/
[root@localhost php-7.1.3]#
查看安装成功后的版本信息 -
[root@localhost local]# /usr/local/php7/bin/php -v
PHP 7.1.3 (cli) (built: Apr 13 2017 22:47:30) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
[root@localhost local]#
2.4. 修改配置
修改php配置,查看php加载配置文件路径:
[root@localhost local]# /usr/local/php7/bin/php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/php7/etc
[root@localhost local]#
php-7.1.3源码目录下:
[root@localhost local]# ll /usr/local/src/php-7.1.3/ | grep ini
-rw-rw-r--. 1 yiibai yiibai 71063 Mar 14 09:17 php.ini-development
-rw-rw-r--. 1 yiibai yiibai 71095 Mar 14 09:17 php.ini-production
[root@localhost local]#
复制PHP的配置文件,使用以下命令 -
[root@localhost local]# cp /usr/local/src/php-7.1.3/php.ini-production /usr/local/php7/etc/php.ini
## 根据需要对`php.ini`配置进行配置修改,请自行参考官方文档配置 。
[root@localhost local]# /usr/local/php7/bin/php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/php7/etc
Loaded Configuration File => /usr/local/php7/etc/php.ini
[root@localhost local]#
2.5 启用php-fpm服务
上面我们在编译php7的时候,已经将fpm模块编译了,那么接下来,我们要启用php-fpm。但是默认情况下它的配置文件和服务都没有启用,所以要我们自己来配置,先重命名并移动以下两个文件:
[root@localhost local]# cd /usr/local/php7/etc
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
[root@localhost etc]# cp php-fpm.d/www.conf.default php-fpm.d/www.conf
php-fpm的具体配置这里不做深入去详解,因为在编译之前./configure的时候,我们都已经确定了一些配置,比如运行fpm的用户和用户组之类的,所以默认配置应该不会存在路径问题和权限问题。
配置php-fpm的服务载入:
就像上面的nginx一样,我们希望使用 service php-fpm start|stop|restart 这些操作来实现服务的重启,但没有像nginx那么复杂,php编译好之后,给我们提供了一个php-fpm的程序。这个文件放在php编译源码目录中:
[root@localhost local]# cd /usr/local/src/php-7.1.3/sapi/fpm/
## 或直接使用可执行文件: /usr/local/php7/sbin/php-fpm
[root@localhost local]# ls
[root@localhost local]# cp init.d.php-fpm /etc/init.d/php-fpm
[root@localhost local]# chmod +x /etc/init.d/php-fpm
[root@localhost local]# chkconfig --add php-fpm
[root@localhost local]# chkconfig php-fpm on
通过上面这个操作,我们就可以使用 service php-fpm start 来启用php-fpm了。用 ps -ef | grep php-fpm看看进程吧。
[root@localhost fpm]# ps -ef | grep php-fpm
root 108421 1 0 23:19 ? 00:00:00 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf)
nginx 108422 108421 0 23:19 ? 00:00:00 php-fpm: pool www
nginx 108423 108421 0 23:19 ? 00:00:00 php-fpm: pool www
root 108507 2285 0 23:23 pts/0 00:00:00 grep --color=auto php-fpm
[root@localhost fpm]#
这样,PHP环境就安装完成了,接下来我们通过Nginx代理集成PHP7,来实现Nginx+PHP服务。
3. Nginx代理集成PHP7配置
通过上面的操作,nginx和php-fpm服务都已经正常运行起来了,但是php-fpm只是在127.0.0.1:9000上提供服务,外网是无法访问的,而且也不可能直接通过php-fpm给外网提供服务,因此需要使用nginx去代理9000端口执行php。
实际上这个过程只需要对nginx进行配置即可,php-fpm已经在后台运行了,我们需要在nginx的配置文件中增加代理的规则,即可让用户在访问80端口,请求php的时候,交由后端的php-fpm去执行,并返回结果。现在编辑Nginx的配置文件 -
[root@localhost local]# vi /usr/local/nginx/conf/nginx.conf
如果你大致了解过nginx的配置,应该能够很快分辨出这个配置文件里面的结构,并且知道server块代表一个虚拟主机,要增加虚拟主机就再增加一个server块,而且这个conf文件中也给出了例子。那么怎么代理php-fpm呢?找到:
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /script$fastcgi_script_name;
# include fastcgi_params;
#}
把前面的#注释符号去掉,把script改为$document_root最终如下:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
这样就可以了,重新载入nginx配置即可,使用以下命令 -
/usr/local/nginx/sbin/nginx -s reload
然后到/usr/local/nginx/html去写一个php文件:index.php进行测试,文件:index.php的代码如下 -
<?php
phpinfo();
?>
现在访问目录IP,应该能看到结果如下 -
提示:如果无法打开,可能需要关闭防火墙,使用命令:systemctl stop firewalld
附完整的Nginx配置(/usr/local/nginx/conf/nginx.conf)文件内容:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.html;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.html;
# }
#}
}
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx+PHP7源码安装配置
Nginx+PHP7+MySQL5.7(LNMP)环境配置 - Nginx教程™
在前面几篇文章中,我们已经介绍并演示安装 Nginx 的几种方式,在开始本篇文章的阅读和实践之前,建议先阅读“Nginx安装配置”:http://www.yiibai.com/nginx/nginx-install.html ,在上面文章的基础之上,我们再添加 PHP7 的安装配置以及MySQL的安装配置,最后编写一个简单的PHP测试程序。
目录:
- Nginx安装配置
- PHP7安装配置
- MySQL5.7安装配置
1. Nginx安装配置
如果需要一些特殊的功能,在包和端口不可用的情况下,也可以从源代码编译来安装nginx。虽然源代码编译安装更灵活,但这种方法对于初学者来说可能很复杂(建议初学者自己使用源代码编译安装来安装nginx)。有关更多信息,请参阅从源构建nginx。
在本文中,主要介绍从源代码安装nginx,这篇教程是基于CentOS7 64bit系统来安装的,非Centos系统不适用。现在我们就开始吧!
1.1 安装前工作
首先更新系统软件源,使用以下命令更新系统 -
[root@localhost ~]# yum update
有关两个命令的一点解释:
yum -y update - 升级所有包,改变软件设置和系统设置,系统版本内核都升级
yum -y upgrade - 升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变
依赖包安装
[root@localhost src]# yum -y install gcc gcc-c++ autoconf automake libtool make cmake
[root@localhost src]# yum -y install zlib zlib-devel openssl openssl-devel pcre-devel
1.2. 下载Nginx安装源文件
源码下载,可官网下载地址:http://nginx.org/en/download.html 下载并上传到服务器(这里选择最新稳定版本:nginx-1.10.3),如下图所示 -
或直接在服务上执行以下命令下载 -
[root@localhost ~]# cd /usr/local/src
[root@localhost src]# wget -c http://nginx.org/download/nginx-1.10.3.tar.gz
解压上面下载的文件 -
[root@localhost src]# tar zxvf nginx-1.10.3.tar.gz
在编译之前还要做一些前期的准备工作,如:依懒包安装,Nginx用户和用户组等。
1.3. 新建nginx用户及用户组
使用 root 用户身份登录系统,执行以下命令创建新的用户。
[root@localhost src]# groupadd nginx
[root@localhost src]# useradd -g nginx -M nginx
useradd命令的-M参数用于不为nginx建立home目录
修改/etc/passwd,使得nginx用户无法bash登陆(nginx用户后面由/bin/bash改为/sbin/nologin),
[root@localhost src]# vi /etc/passwd
然后找到有 nginx 那一行,把它修改为(后面由/bin/bash改为/sbin/nologin):
nginx:x:1002:1003::/home/nginx:/sbin/nologin
1.4. 编译配置、编译、安装
下面我们进入解压的nginx源码目录:/usr/local/src/ 执行以下命令 -
[root@localhost ~]# cd /usr/local/src/nginx*
[root@localhost nginx-1.10.3]# pwd
/usr/local/src/nginx-1.10.3
[root@localhost nginx-1.10.3]#
[root@localhost nginx-1.10.3]# ./configure --prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/run/nginx.pid \
--with-http_ssl_module \
--user=nginx \
--group=nginx \
--with-pcre \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module
注意:上面的反斜杠\ 表示换行继续。
--prefix=/usr/local/nginx 指定安装到 /usr/local/nginx 目录下。
上面配置完成后,接下来执行编译 -
[root@localhost nginx-1.10.3]# make
[root@localhost nginx-1.10.3]# make install
... ...
cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default'
test -d '/usr/local/nginx/run' \
|| mkdir -p '/usr/local/nginx/run'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/html' \
|| cp -R html '/usr/local/nginx'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
make[1]: Leaving directory `/usr/local/src/nginx-1.10.3'
[root@localhost nginx-1.10.3]#
上面编译时间跟你的电脑配置相关,所以可能需要一些等待时间。
查看安装后的程序版本:
[root@localhost nginx-1.10.3]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.10.3
修改Nginx默认端口(可选):
[root@localhost nginx-1.10.3]# vi /usr/local/nginx/conf/nginx.conf
找到 -
... ...
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
... ...
把上面的 80 修改为你想要的端口,如:8080 。
修改配置后验证配置是否合法:
[root@localhost nginx-1.10.3]# /usr/local/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
启动Nginx程序、查看进程 -
[root@localhost nginx-1.10.3]# /usr/local/nginx/sbin/nginx
[root@localhost nginx-1.10.3]# ps -ef | grep nginx
root 29151 1 0 22:01 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 29152 29151 0 22:01 ? 00:00:00 nginx: worker process
root 29154 2302 0 22:01 pts/0 00:00:00 grep --color=auto nginx
[root@localhost nginx-1.10.3]#
nginx停止、重启
未添加nginx服务前对nginx的管理只能通过一下方式管理:
# nginx 管理的几种方式 -
# 启动Nginx
/usr/local/nginx/sbin/nginx
# 从容停止Nginx:
kill -QUIT 主进程号 # 如上一步中的 ps 命令输出的 29151,就是 Nginx的主进程号
# 快速停止Nginx:
kill -TERM 主进程号
# 强制停止Nginx:
pkill -9 nginx
# 平滑重启nginx
/usr/nginx/sbin/nginx -s reload
现在我们来看看安装的Nginx的运行结果,可以简单地使用curl命令访问localhost测试,结果如下 -
[root@localhost nginx-1.10.3]# curl localhost
<!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>
[root@localhost nginx-1.10.3]#
或者也可以打开浏览访问目标服务器的IP,在本示例中,服务器的IP地址是:192.168.0.195,所以打开浏览器访问如下结果 -
提示: 如果没有看到以上界面,在确保Nginx启动的前提下,检查SeLinux和防火墙是否已关闭。关闭防火墙命令:systemctl stop firewalld.service。
2. PHP7安装配置
2.1 源码下载
官网地址:php7下载
[root@localhost ~]# cd /usr/local/src
[root@localhost src]# wget -c http://cn2.php.net/distributions/php-7.1.3.tar.gz
解压压缩包:
[root@localhost src]# tar -xzvf php-7.*
[root@localhost src]# cd php-7*
2.2 安装编译所需依赖包
[root@localhost php-7.1.3]# yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel
或者常见大部分依懒包安装 -
[root@localhost php-7.1.3]# yum install -y wget gcc gcc-c++ autoconf libjpeg libjpeg-devel perl perl* perl-CPAN libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers png jpeg autoconf gcc cmake make gcc-c++ gcc ladp ldap* ncurses ncurses-devel zlib zlib-devel zlib-static pcre pcre-devel pcre-static openssl openssl-devel perl libtoolt openldap-devel libxml2-devel ntpdate cmake gd* gd2 ImageMagick-devel jpeg jpeg* pcre-dev* fontconfig libpng libxml2 zip unzip gzip
2.3 源码编译、安装
通过 ./configure –help 查看支持的编译配置参数,如下所示 -
[root@localhost php-7.1.3]# ./configure --help
`configure' configures this package to adapt to many kinds of systems.
Usage: ./configure [OPTION]... [VAR=VALUE]...
To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
Configuration:
-h, --helpdisplay this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --versiondisplayversion information and exit
-q, --quiet, --silent do not print `checking ...' messages
--cache-file=FILE cache test results inFILE [disabled]
-C, --config-cache alias for `--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources inDIR [configure dir or `..']
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc. You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.
For better control, use the options below.
PHP+Nginx组合的编译配置命令 -
[root@localhost php-7.1.3]# ./configure --prefix=/usr/local/php7 \
--with-config-file-path=/usr/local/php7/etc \
--with-config-file-scan-dir=/usr/local/php7/etc/php.d \
--with-mcrypt=/usr/include \
--enable-mysqlnd \
--with-mysqli \
--with-pdo-mysql \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-gd \
--with-iconv \
--with-zlib \
--enable-xml \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--enable-gd-native-ttf \
--with-openssl \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--enable-opcache
# 执行完成后的结果:
Generating files
configure: creating ./config.status
creating main/internal_functions.c
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
| License: |
| This software is subject to the PHP License, available in this |
| distribution in the file LICENSE. By continuing this installation |
| process, you are bound by the terms of this license agreement. |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point. |
+--------------------------------------------------------------------+
Thank you for using PHP.
config.status: creating php7.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/fpm/php-fpm.conf
config.status: creating sapi/fpm/www.conf
config.status: creating sapi/fpm/init.d.php-fpm
config.status: creating sapi/fpm/php-fpm.service
config.status: creating sapi/fpm/php-fpm.8
config.status: creating sapi/fpm/status.html
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands
编译 + 安装,编译源码, 如下所示 -
$ make
Generating phar.php
Generating phar.phar
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
directorytreeiterator.inc
pharcommand.inc
directorygraphiterator.inc
invertedregexiterator.inc
clicommand.inc
phar.inc
Build complete.
Don't forget to run 'make test'.
## 对编译结果进行测试:
[root@localhost php-7.1.3]# make test
## 很遗憾,我这里make test报错了,已反馈php test信息。
## 安装程序至指定目录:
[root@localhost php-7.1.3]# make install
Installing shared extensions: /usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/
Installing PHP CLI binary: /usr/local/php7/bin/
Installing PHP CLI man page: /usr/local/php7/php/man/man1/
Installing PHP FPM binary: /usr/local/php7/sbin/
Installing PHP FPM defconfig: /usr/local/php7/etc/
Installing PHP FPM man page: /usr/local/php7/php/man/man8/
Installing PHP FPM status page: /usr/local/php7/php/php/fpm/
Installing phpdbg binary: /usr/local/php7/bin/
Installing phpdbg man page: /usr/local/php7/php/man/man1/
Installing PHP CGI binary: /usr/local/php7/bin/
Installing PHP CGI man page: /usr/local/php7/php/man/man1/
Installing build environment: /usr/local/php7/lib/php/build/
Installing header files: /usr/local/php7/include/php/
Installing helper programs: /usr/local/php7/bin/
program: phpize
program: php-config
Installing man pages: /usr/local/php7/php/man/man1/
page: phpize.1
page: php-config.1
/usr/local/src/php-7.1.3/build/shtool install -c ext/phar/phar.phar /usr/local/php7/bin
ln -s -f phar.phar /usr/local/php7/bin/phar
Installing PDO headers: /usr/local/php7/include/php/ext/pdo/
[root@localhost php-7.1.3]#
查看安装成功后的版本信息 -
[root@localhost local]# /usr/local/php7/bin/php -v
PHP 7.1.3 (cli) (built: Apr 13 2017 22:47:30) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
[root@localhost local]#
2.4. 修改配置
修改php配置,查看php加载配置文件路径:
[root@localhost local]# /usr/local/php7/bin/php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/php7/etc
[root@localhost local]#
php-7.1.3源码目录下:
[root@localhost local]# ll /usr/local/src/php-7.1.3/ | grep ini
-rw-rw-r--. 1 yiibai yiibai 71063 Mar 14 09:17 php.ini-development
-rw-rw-r--. 1 yiibai yiibai 71095 Mar 14 09:17 php.ini-production
[root@localhost local]#
复制PHP的配置文件,使用以下命令 -
[root@localhost local]# cp /usr/local/src/php-7.1.3/php.ini-production /usr/local/php7/etc/php.ini
## 根据需要对`php.ini`配置进行配置修改,请自行参考官方文档配置 。
[root@localhost local]# /usr/local/php7/bin/php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/php7/etc
Loaded Configuration File => /usr/local/php7/etc/php.ini
[root@localhost local]#
2.5 启用php-fpm服务
上面我们在编译php7的时候,已经将fpm模块编译了,那么接下来,我们要启用php-fpm。但是默认情况下它的配置文件和服务都没有启用,所以要我们自己来配置,先重命名并移动以下两个文件:
[root@localhost local]# cd /usr/local/php7/etc
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
[root@localhost etc]# cp php-fpm.d/www.conf.default php-fpm.d/www.conf
php-fpm的具体配置这里不做深入去详解,因为在编译之前./configure的时候,我们都已经确定了一些配置,比如运行fpm的用户和用户组之类的,所以默认配置应该不会存在路径问题和权限问题。
配置php-fpm的服务载入:
就像上面的nginx一样,我们希望使用 service php-fpm start|stop|restart 这些操作来实现服务的重启,但没有像nginx那么复杂,php编译好之后,给我们提供了一个php-fpm的程序。这个文件放在php编译源码目录中:
[root@localhost local]# cd /usr/local/src/php-7.1.3/sapi/fpm/
## 或直接使用可执行文件: /usr/local/php7/sbin/php-fpm
[root@localhost local]# ls
[root@localhost local]# cp init.d.php-fpm /etc/init.d/php-fpm
[root@localhost local]# chmod +x /etc/init.d/php-fpm
[root@localhost local]# chkconfig --add php-fpm
[root@localhost local]# chkconfig php-fpm on
通过上面这个操作,我们就可以使用 service php-fpm start 来启用php-fpm了。用 ps -ef | grep php-fpm看看进程吧。
[root@localhost fpm]# ps -ef | grep php-fpm
root 108421 1 0 23:19 ? 00:00:00 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf)
nginx 108422 108421 0 23:19 ? 00:00:00 php-fpm: pool www
nginx 108423 108421 0 23:19 ? 00:00:00 php-fpm: pool www
root 108507 2285 0 23:23 pts/0 00:00:00 grep --color=auto php-fpm
[root@localhost fpm]#
这样,PHP环境就安装完成了,接下来我们通过Nginx代理集成PHP7,来实现Nginx+PHP服务。
3. Nginx代理集成PHP7配置
通过上面的操作,nginx和php-fpm服务都已经正常运行起来了,但是php-fpm只是在127.0.0.1:9000上提供服务,外网是无法访问的,而且也不可能直接通过php-fpm给外网提供服务,因此需要使用nginx去代理9000端口执行php。
实际上这个过程只需要对nginx进行配置即可,php-fpm已经在后台运行了,我们需要在nginx的配置文件中增加代理的规则,即可让用户在访问80端口,请求php的时候,交由后端的php-fpm去执行,并返回结果。现在编辑Nginx的配置文件 -
[root@localhost local]# vi /usr/local/nginx/conf/nginx.conf
如果你大致了解过nginx的配置,应该能够很快分辨出这个配置文件里面的结构,并且知道server块代表一个虚拟主机,要增加虚拟主机就再增加一个server块,而且这个conf文件中也给出了例子。那么怎么代理php-fpm呢?找到:
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /script$fastcgi_script_name;
# include fastcgi_params;
#}
把前面的#注释符号去掉,把script改为$document_root最终如下:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
这样就可以了,重新载入nginx配置即可,使用以下命令 -
/usr/local/nginx/sbin/nginx -s reload
然后到/usr/local/nginx/html去写一个php文件:index.php进行测试,文件:index.php的代码如下 -
<?php
phpinfo();
?>
现在访问目录IP,应该能看到结果如下 -
提示:如果无法打开,可能需要关闭防火墙,使用命令:systemctl stop firewalld
附完整的Nginx配置(/usr/local/nginx/conf/nginx.conf)文件内容:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.html;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.html;
# }
#}
}
MySQL5.7安装配置
MySQL5.7在Linux安装有很多种方式,这里为了节省时间和减少文章的篇幅,我们基于系统集成环境安装。当然如果想以编译源代码方式安装的话,可以参考MySQL的官方文档。
Centos7.0安装Mysql5.7.11
在网上找了很多关于Centos7.0安装MySQL5.7.11的教程,找到靠谱的还得看运气,嘿嘿。
- 检测下系统有没有自带的MySQL:yum list installed | grep mysql,
如果已经有的话执行命令yum -y remove mysql-libs.x86_64卸载已经安装的MySQL。 - 先到MySQL官网下载5.7.11的安装包(http://dev.mysql.com/downloads/mysql/),download-yum选择Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package。
也可以直接进入CentOS系统下载安装包:
wget http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm
# 或者
wget http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-community-server-5.7.18-1.el7.x86_64.rpm
如果新的系统还没有wget命令的话可以先:yum install wget,一般都会有安装了wget命令工具。
- 添加选择yum源 -
[root
@localhost
src]# yum localinstall mysql57-community-release-el7-7.noarch.rpm
[root
@localhost
src]# yum repolist all | grep mysql
mysql-connectors-community/x86_64 MySQL Connectors Community enabled: 30
mysql-connectors-community-source MySQL Connectors Community - So disabled
mysql-tools-community/x86_64 MySQL Tools Community enabled: 47
mysql-tools-community-source MySQL Tools Community - Source disabled
mysql55-community/x86_64 MySQL 5.5 Community Server disabled
mysql55-community-source MySQL 5.5 Community Server - So disabled
mysql56-community/x86_64 MySQL 5.6 Community Server disabled
mysql56-community-source MySQL 5.6 Community Server - So disabled
mysql57-community/x86_64 MySQL 5.7 Community Server enabled: 187
mysql57-community-source MySQL 5.7 Community Server - So disabled
把需要安装的启用,其他的禁用。
- 安装MySQL:
[root@localhost src]# yum install mysql-community-server
.....
Installing : mysql-community-server-5.7.18-1.el7.x86_64 4/6
Installing : mysql-community-libs-compat-5.7.18-1.el7.x86_64 5/6
Erasing : 1:mariadb-libs-5.5.52-1.el7.x86_64 6/6
Verifying : mysql-community-server-5.7.18-1.el7.x86_64 1/6
Verifying : mysql-community-common-5.7.18-1.el7.x86_64 2/6
Verifying : mysql-community-client-5.7.18-1.el7.x86_64 3/6
Verifying : mysql-community-libs-compat-5.7.18-1.el7.x86_64 4/6
Verifying : mysql-community-libs-5.7.18-1.el7.x86_64 5/6
Verifying : 1:mariadb-libs-5.5.52-1.el7.x86_64 6/6
Installed:
mysql-community-libs.x86_64 0:5.7.18-1.el7
mysql-community-libs-compat.x86_64 0:5.7.18-1.el7
mysql-community-server.x86_64 0:5.7.18-1.el7
Dependency Installed:
mysql-community-client.x86_64 0:5.7.18-1.el7
mysql-community-common.x86_64 0:5.7.18-1.el7
Replaced:
mariadb-libs.x86_64 1:5.5.52-1.el7
Complete!
[root@localhost src]#
- 安装完成之后会自动在log中生成连接的密码。
启动MySQL:
[root@localhost src]# service mysqld start
Redirecting to /bin/systemctl start mysqld.service
[root@localhost src]# ps -axu|grep mysqld
mysql 2952 15.1 18.2 1127664 182008 ? Sl 05:15 0:01 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root 2982 0.0 0.0 112648 964 pts/0 R+ 05:15 0:00 grep --color=auto mysqld
[root@localhost src]#
查看root用户的密码:
[root@localhost src]# grep password /var/log/mysqld.log
2017-04-16T09:15:17.046285Z 1 [Note] A temporary password is generated for root@localhost: afWrxaqQi0!M
[root@localhost src]#
如上面所示,root用户的密码为:afWrxaqQi0!M。现在我们使用上面的密码连接到MySQL数据。
[root@localhost src]# mysql -uroot -p
password:
[root@localhost src]# show databases;
#ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> ALTER USER root@localhost IDENTIFIED BY 'Pass@123456';
mysql> flush privileges;
创建一个简单的表:tb_user -
create database test;
use test;
create table tb_user(
id int(10) not null auto_increment primary key,
username varchar(64) default ''
);
insert into tb_user (id,username) values(1, 'maxsu');
insert into tb_user (id,username) values(2, 'minsu');
好了已经可以成功连接了,默认不能远程连接,在使用数据库之前,MySQL服务器要求你必须先修改原密码。另外如果需要开机启动的话,可以自行搜索解决。
PHP7连接MySQL
PHP5中可以使用 mysql extension,mysqli 和 PDO_MYSQL。但是在PHP7中移除了mysql extension,只剩下后面两种选择。
PHP 提供了三种不同的API去连接mysql数据库。下面的示例代码展示了3种不同连接mysql数据库的方式。
连接方式-1
文件:mysqli.php 代码如下 -
<?php
/*
* mysqli
* 数据库地址,登陆账号,密码,数据库名称
*/
$mysqli = new mysqli("127.0.0.1", "root", "Pass@123456", "test");
if($mysqli){
echo 'Connected to MySQL Success.';
}else{
echo 'Connected to MySQL Fail.';
}
echo '<hr/>';
$sql = "SELECT * FROM tb_user";
$result = $mysqli->query($sql);
if ($result) {
while ($row = $result->fetch_assoc()) {
echo 'Username: '.$row['username']. '<br/>';
}
}
/* free result set */
$result->free();
/* close connection */
$mysqli->close();
?>
将文件:mysqli.php 放到 /usr/local/nginx/html 目录下,打开浏览器访问测试结果如下 -
连接方式-2
文件:pdo.php 代码如下 -
<?php
/*
* 第一个参数是mysql:host,第二是dbname,第三个账户名,第四个密码
*/
try {
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test", "root", "Pass@123456");
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$sql = "select * from tb_user";
echo $sql . "<hr/>";
$pdo->query('set names utf8;');
$result = $pdo->query($sql);
if($result){
$rows = $result->fetchAll();
foreach ($rows as $row) {
$username = $row[1];
echo 'Username: '.$username.'<br/>';
}
}
将文件:pdo.php 放到 /usr/local/nginx/html 目录下,打开浏览器访问测试结果如下 -
本站代码下载:http://www.yiibai.com/siteinfo/download.html
本文属作者原创,转载请注明出处:易百教程 » Nginx+PHP7+MySQL5.7(LNMP)环境配置