目录
1、Nginx简介
1.1、常见服务器的对比
1.1.1、IIS
1.1.2、Tomcat
1.1.3、Apache
1.1.4、Lighttpd
1.2、Nginx的优点
1.2.1、速度更快
1.2.2、配置简单,扩展性强
1.2.3、高可靠性
1.2.4、热部署
1.2.5、成本低、BSD许可证
1.3、Nginx的功能特性及常用功能
1.3.1、基本HTTP服务
1.3.2、高级HTTP服务
1.3.3、邮件服务
1.3.4、Nginx常用的功能模块
2、Nginx环境准备
2.1、Nginx版本介绍
2.2、环境准备
2.2.1、确认centos的内核
2.2.2、确保centos能联网
2.2.3、确认关闭防火墙
2.2.4、确认停用selinux
3、Nginx目录结构分析
4、Nginx服务器启停命令
4.1、方式1:Nginx服务的信号控制
4.1.1、Nginx中的master和worker进程
4.1.2、Nginx的工作方式
4.1.3、如何获取进程的PID
4.1.4、信号有哪些
4.1.5、如何通过控制信号控制Nginx的启停等相关操作?
4.2、方式2:Nginx的命令行控制
5、Nginx服务器版本升级和新增模块
5.1、方案1:使用Nginx服务信号进行升级
5.2、方案2:使用Nginx安装目录的make命令完成升级
6、Nginx核心配置文件结构
6.1、全局块
6.1.1、user指令
6.1.2、worker_processes指令
6.1.3、其他指令
6.2、events块
6.2.1、accept_mutex
6.2.2、multi_accept
6.2.3、worker_connections
6.2.4、use
6.3、http块
6.3.1、定义MINE-Type
6.3.2、自定义服务日志
6.3.3、http块其他配置指令
6.4、server块和location块
Nginx(“engine x”)一个具有高性能的HTTP和反向代理的WEB服务器,同时也是一个POP3/SMTP/IMAP代理服务器,是由伊戈尔·塞索耶夫(俄罗斯人)使用C语言编写的,Nginx的第一个版本是2004年10月4号发布的0.0.0版本。另外值得一提的是伊戈尔·塞索耶夫将Nginx源码进行了开源,这也为Nginx的发展提供了良好的保障。
正向代理:服务的是客户端;反向代理:服务的是服务端。
全称(Internet Information Services)即互联网信息服务,是由微软公司提供的基于Windows系统的互联网基本服务。Windows作为服务器在稳定性与其他一些性能上都不如类UNIX操作系统,因此需要高性能Web服务器场合下,IIS可能就会被“冷落”。
Tomcat是一个运行Servlet和JSP的Web应用软件,Tomcat技术先进、性能稳定且开放源代码,因此深受Java爱好者的喜爱并得到了部分软件开发商的认可,称为目前比较流行的Web应用服务器。但是Tomcat天生是一个重量级的Web服务器,对静态文件和高并发的处理比较弱。
Apache的发展时期很长,同时也有过一段辉煌的业绩。Apache有很多优点,如稳定、开源、跨平台等。但是它出现的时间太久了,在它兴起的年代,互联网的产业规模远远不如今天,所以它被设计成一个重量级的、不支持高并发的Web服务器。在Apache服务器上,如果有数以万计的并发HTTP请求同时访问,就会导致服务器上消耗大量内存,操作系统内核对成百上千的Apache进程做进程间切换也会消耗大量的CPU资源,并导致HTTP请求的平均响应速度降低,这些都决定了Apache不可能称为高性能的Web服务器。这也促使了Lighttpd和Nginx的出现。
Lighttpd是德国的一个开源的Web服务器软件,它和Nginx一样,都是轻量级、高性能的Web服务器,欧美的业界开发者比较钟爱Lighttpd,而国内的公司更多地青睐Nginx,同时网上Nginx的资源要丰富些。
单次请求或者高并发请求的环境下,Nginx都会比其他Web服务器响应的速度更快。一方面在正常情况下,单次请求会得到更快的响应,另一方面,在高峰期(如有数以万计的并发请求),Nginx比其他Web服务器更快的响应请求。Nginx之所以有这么高的并发处理能力和这么好的性能原因在于Nginx采用了多进程和I/O多路复用(epoll)的底层实现。
Nginx的设计极具扩展性,它本身就是由很多模块组成,这些模块的使用可以通过配置文件的配置来添加。这些模块有官方提供的也有第三方提供的模块,如果需要完全可以开发服务自己业务特性的定值模块。
Nginx采用的是多进程模式运行,其中有一个master主进程和N多个worker进程,worker进程的数量我们可以手动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快速去“拉起”新的worker进程提供服务。
现在互联网项目都要求以7*24小时进行服务的提供,针对于这一要求,Nginx也提供了热部署功能,即可以在Nginx不停止的情况下,对Nginx进行文件升级、更新配置和更换日志文件等功能。
BSD是一个开源的许可证,世界上的开源许可证有很多,现在比较流行的有六种分别是GPL、BSD、MIT、Mozilla、Apache、LGPL。Nginx本身是开源的,我们不仅可以免费地将Nginx应用在商业领域,而且还可以在项目中直接修改Nginx的源码来定制自己的特殊要求。这些点也都是Nginx为什么能吸引无数开发者继续为Nginx来贡献自己的智慧和青春。
Nginx提供的基本功能服务从大体上归纳为“基本HTTP服务”、“高级HTTP服务”和“邮件服务”等三大类。
Nginx提供邮件代理服务也是其基本开发需求之一,主要包含以下特性:
Nginx的核心组成:
Nginx的官方网站为:http://nginx.org
准备一个内核为2.6及以上版本的操作系统,因为linux2.6及以上内核才支持epoll,而Nginx需要解决高并发压力问题是需要用到epoll,所以我们需要有这样的版本要求。
我们可以使用uname -a命令来查询linux内核版本。
ping www.baidu.com
这一项的要求仅针对于那些对linux系统的防火墙设置规则不太清楚的,建议把防火墙都关闭掉,可以省掉后续Nginx学习过程中遇到的诸多问题。
关闭的方式有如下两种:
-关闭运行的防火墙,系统重新启动后,防火墙将重新打开
systemctl stop firewalld
-永久关闭防火墙,系统重新启动后,防火墙依然关闭
systemctl disable firewalld
-查看防火墙状态
systemctl status firewalld
selinux(security-enhanced linux),美国安全局对于强制访问控制的实现,在linux2.6内核以后的版本中,selinux已经成为内核中的一部分。可以说selinux是linux史上最杰出的新安全子系统之一。虽然有了selinux,我们的系统更安全,但是对于我们学习Nginx的历程中,会多很多设置,因此建议将selinux进行关闭。
-sestatus查看状态
sestatus
-如果查看不是disabled状态,我们可以通过修改配置文件来进行设置,修改SELINUX=disabled,然后重启系统即可生效
vim /etc/selinux/config
在使用Nginx之前,我们对安装好的Nginx目录文件进行一个分析。
CGI(Common Gateway Interface,通用网关接口),主要解决的问题是从客户端发送一个请求和数据,服务端获取到请求和数据后可以调用CGI程序处理及响应结果给客户端的一种标准规范。
conf:nginx所有配置文件目录
fastcgi.conf:fastcgi相关配置文件
fastcgi.conf.default:fastcgi.conf的备份文件
fastcgi_params:fastcgi的参数文件
fastcgi_params.default:fastcgi的参数备份文件
scgi_params:scgi的参数文件
scgi_params.default:scgi的参数备份文件
uwsgi_params:uwsgi的参数文件
uwsgi_params.default:uwsgi的参数备份文件
koi-utf
koi-win
win-utf
mime.types
mime.types.default
nginx.conf
nginx.conf.default
html:
50x.html:访问失败后的失败页面
index.html:成功访问的默认首页
logs:记录入门的文件
access.log:访问日志
error.log:错误日志
nginx.pid:nginx进程的PID
proxy_temp:
sbin:存放执行程序文件nginx
nginx:用来控制Nginx的启动和停止等相关的命令
scgi_temp:
uwsgi_temp:
Nginx安装完成后,接下来我们要学习的是如何启动、重启和停止Nginx的服务。
Nginx默认采用的是多进程的方式来工作的。Nginx后台进程中包含一个master和多个worker进程,master进程主要是用来管理worker进程,包含接收外界的信息,并将接收到的信号发送给各个worker进程,监控worker进程的状态,当worker进程出现异常退出后,会自动重新启动新的worker进程。而worker进程则是专门用来处理用户请求的,各个worker进程之间是平等的并且相互独立,处理请求的机会也是一样的。
作为管理员,只需要通过给master进程发送信号就可以来控制Nginx,这个时候我们需要有两个前提条件,一个是要操作的master进程,一个是信号。
-方式1
ps -ef | grep nginx
-方式2
在讲解nginx的./configure的配置参数的时候,有一个参数是--pid-path=PATH
默认是/usr/local/nginx/logs/nginx.pid,所以可以通过查看该文件来获取nginx
的master进程ID。
信号 | 作用 |
---|---|
TERM / INT | 立即关闭整个服务 |
QUIT | “优雅”地关闭整个服务 |
HUP | 重读配置文件并使用服务队新配置项生效 |
USR1 | 重新打开日志文件,可以用来进行日志切割 |
USR2 | 平滑升级到最新版的Nginx |
WINCH | 所有子进程不再接收处理新连接,相当于给worker进程发送QUIT命令 |
调用命令为 kill -signal PID。signal即为信号,PID即为获取到的master线程ID。
-发送TREM/INT信号给master进程,会将Nginx服务立即关闭
kill -TERM PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
kill -INT PID / kill -INT /usr/local/nginx/logs/nginx.pid
-发送USR1信号给master进程,告诉Nginx重新开启日志文件
kill -USR1 PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
-发送USR2信号给master进程,告诉master进程要平滑升级,这个时候,会重新开启对应的master进程
-和worker进程,整个系统中将会有两个master进程,并且新的master进程的PID会被记录在
-/usr/local/nginx/logs/nginx.pid,而之前的旧的master进程PID会被记录在
-/usr/local/nginx/logs/nginx.pid.oldbin文件中,接着再次发送QUIT信号给旧的master进程,
-让其处理完请求后再进行关闭。
kill -USR2 PID / kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
kill -QUIT PID / kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
-发送WINCH信号给master进程,让master进程控制不让所有的worker进程再接收新的请求了,
-请求处理完后会关闭worker进程。注意master进程不会被关闭掉。
kill -WINCH PID / kill -WINCH `cat /usr/local/nginx/logs/nginx.pid`
此方式是通过Nginx安装目录下的sbin下的可执行文件nginx来进行Nginx状态的控制,我们可以通过nginx -h来查看都有哪些参数可以用。
-?或-h:显示帮助信息
-v:打印版本号信息并退出
-V:打印版本号信息和配置信息并退出
-t:测试nginx的配置文件语法是否正确并退出
-T:测试nginx的配置文件语法是否正确并列出用到的配置文件信息然后退出
-q:在配置测试期间禁止显示非错误消息
-s:signal信号,后面可以跟:
stop:快速关闭,类似于TERM / INT信号的作用
quit:优雅地关闭,类似于QUIT信号的作用
reopen:重新打开日志文件,类似于USR1信号的作用
reload:类似于HUP信号的作用
-p:prefix,指定Nginx的prefix路径,默认为:/usr/local/nginx
-c:filename,指定Nginx的配置文件路径,默认为:/conf/nginx/nginx.conf
-g:用来补充Nginx配置文件,向Nginx服务指定启动时应用全局的配置。
如果想对Nginx的版本进行更新,或者应用一些新的模块,最简单的做法就是停止当前的Nginx服务,然后开启新的Nginx服务,但是这样会导致在一段时间内,用户是无法访问服务器。为了解决这个问题,我们就需要用到Nginx服务器提供的平滑升级功能。这个也是Nginx的一大特点,使用这种方式,就可以使Nginx在24小时不间断地提供服务了。
需求:Nginx的版本最开始是Nginx-1.14.2,由于服务升级,需要将Nginx的版本升级到Nginx-1.16.1,要求Nginx不能中断提供服务。
为了应对上述的需求,有以下两种解决方案:
环境准备:
进入安装目录
./configure
make & make install
进入安装目录
./configure
make
cd /usr/local/nginx/sbin
mv nginx nginxold
cd ~/nginx/core/nginx-1.16.1/objs
cp nginx /usr/local/nginx/sbin
kill -USR2 `more /usr/local/logs/nginx.pid`
kill -QUIT `more /usr/local/logs/nginx/pid.oldbin`
cd /usr/local/nginx/sbin
mv nginx nginxold
cd ~/nginx/core/nginx-1.16.1/objs
cp nginx /usr/local/nginx/sbin
./nginx -v
在整个过程中,其实Nginx一直是对外提供服务的,并且当Nginx的服务器启动成功后,我们是可以通过浏览器进行直接访问的,同时我们可以通过更改html目录下的页面来修改我们在页面上所看到的的内容。
Nginx 的核心配置文件默认是放在/usr/local/nginx/conf/nginx.conf。
读取Nginx自带的Nginx配置文件,我们将其中的注释部分删除掉后,就剩下下面内容:
# 全局块,主要设置Nginx服务器整体运行的配置指令
# 指令名 指令值
worker_processes 1;
# events块,主要设置Nginx服务器与用户的网络连接,该部分对Nginx服务器的性能影响较大
events {
# 指令名 指令值
worker_connections 1024;
}
# http块,是Nginx服务器配置中的重要部分,代理、缓存、日志记录、第三方模块配置、...
http {
# 指令名 指令值
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# server块,是Nginx配置和虚拟主机相关的内容
server {
# 指令名 指令值
listen 80;
server_name localhost;
# location块,基于Nginx服务器接收请求字符串与location后面的值进行匹配,
# 对特定请求进行处理
location / {
# 指令名 指令值
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
简单小结:nginx.conf配置文件中默认有三大块:全局块、events块、http块。http块中可以设置多个server块,每个server块又可以配置多个location块。
user:用于配置运行Nginx服务器的worker进程的用户和用户组。
语法 | user user[group] |
默认值 | nobody |
位置 | 全局块 |
该属性也可以在编译的时候指定,语法如下./configure --user=user --group=group。如果两个地方都进行了设置,最终生效的是配置文件中的配置。
该指令的使用步骤:
-设置一个用户信息“www”
user www
-创建一个用户
useradd www
-修改user属性
user www
-创建/root/html/index.html
Welcome to nginx!
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
I am www
-修改nginx.conf
location / {
root /root/html;
index index.html index.htm;
}
-测试 启动访问
页面会报403拒绝访问的错误。
-分析原因
因为当前用户没有访问/root/html的权限。
-将文件创建到/home/www/html/index/html,修改配置
location / {
root /home/www/html;
index index.html index.htm;
}
-再次测试启动访问
能正常访问。
综上所述,使用user指令可以指定启动运行工作进程的用户及用户组,这样对于系统的权限访问控制地更加精细,也更加安全。
master_process:用来指定是否开启工作进程。
语法 | master_process on | off; |
默认值 | master_process on; |
位置 | 全局块 |
worker_processes:用于配置Nginx生成工作进程的数量,这个是Nginx服务器实现并发处理服务的关键所在。理论上来说worke_processes的值越大,可以支持的并发处理量也越多,但事实上这个值的设定是需要受到来自服务器自身的限制,建议将该值和服务器CPU的内核数保持一致。
语法 | worker_processes num/auto; |
默认值 | 1 |
位置 | 全局块 |
1、daemon:设定Nginx是否以守护进程的方式启动。
守护式进程是linux后台执行的一种服务进程,特点是独立于控制终端,不会随着终端关闭而停止。
语法 | daemon on | off; |
默认值 | daemon on; |
位置 | 全局块 |
2、pid:用来配置Nginx当前master进程的进程号ID存储的文件路径。
语法 | pid file; |
默认值 | 默认为:/usr/local/nginx/logs/nginx.pid |
位置 | 全局块 |
该属性可以通过./configure --pid-path=PATH来指定。
3、error_log:用来配置Nginx的错误日志存放路径。
语法 | error_log file[日志级别]; |
默认值 | error_log logs/error.log error; |
位置 | 全局块、http、server、location |
该属性可以通过./configure --error-log-path=PATH来指定。
其中日志级别的值有:debug|info|notice|warn|error|crit|alert|emerg,翻译过来为试|信息|通知|警告|错误|临界|警报|紧急,建议设置的时候不要设置成info以下的等级,因为会带来大量的磁盘I/O消耗,影响Nginx的性能。
4、include:用来引入其他配置文件,使Nginx的配置更加灵活。
语法 | include file; |
默认值 | 无 |
位置 | any |
accept_mutex:用来设置Nginx网络连接序列化。
语法 | accept_mutex on|off; |
默认值 | accept_mutex on; |
位置 | events |
这个配置主要可以用来解决常说的“惊群”问题。大致意思是在某一个时刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性能。如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接进行序列化,一个个来唤醒接收,就防止了多个进程对连接的争抢。
multi_accept:用来设置是否允许同时接收多个网络连接。
语法 | multi_accept on|off; |
默认值 | multi_accept off; |
位置 | events |
如果multi_accept被禁止了,nginx一个工作进程只能同时接收一个新的连接,否则,一个工作进程可以同时接收所有的新连接。
worker_connections:用来配置单个worker进程最大的连接数。
语法 | worker_connections number; |
默认值 | worker_connections 512; |
位置 | events |
这里的连接数不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数。另外,number值不能大于操作系统支持打开的最大文件句柄数量。
user:用来设置Nginx服务器选择哪种事件驱动来处理网络消息。
语法 | use method; |
默认值 | 根据操作系统定 |
位置 | events |
注意:此处所选择事件处理模型是Nginx优化部分的一个重要内容,method的可选值有select/poll/epoll/kqueue等,之前在准备centos环境的时候,我们强调过要使用linux内核在2.6以上,就是为了能使用epoll函数来优化Nginx。
另外这些值的选择,我们也可以在编译的时候使用:--with-select_module 、--without-select_module、-with-poll_module、-without-poll_module来设置是否需要将对应的事件驱动模块编译到Nginx的内核。
使用events指令配置实例:
-打开Nginx的配置文件nginx.conf,添加如下配置:
events {
accept_mutex on;
multi_accept on;
worker_commections 1024;
use epoll;
}
-启动测试
./nginx -t
./nginx -s reload
浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIME Type。所以MIME Type是网络资源的媒体类型。Nginx作为Web服务器,也需要能够识别前端请求的资源类型。
在Nginx的配置文件中,默认有两行配置:
include mime.types;
default_type application/octet-stream;
1、default_type:用来配置Nginx响应前端请求默认的MIME类型。
语法 | default_type mime-type; |
默认值 | default_type text/plain; |
位置 | http、server、location |
在default_type之前还有一句include mime.types,include之前我们已经介绍过,相当于把mime.types文件中MIMT类型与相关类型文件的文件后缀名的对应关系加入到当前的配置文件中。
举例说明:有些时候请求某些接口的时候需要返回指定的文本字符串或者json字符串,如果逻辑非常简单或者干脆是固定的字符串,那么可以使用nginx快速实现,这样就不用编写程序响应请求了,可以减少服务器资源占用并且响应性能非常快。
如何实现:
location /get_text {
# 这里也可以设置成text/plain
default_type text/html;
# 状态码200代表成功响应
return 200 "This is nginx's text";
}
location /get_json {
default_type application/json;
return 200 '{"name":"TOM","age":18}';
}
Nginx中日志的类型分为access.log、error.log。
access.log用来记录nginx本身运行时的错误信息,不会记录用户的访问请求。
Nginx服务器支持对服务日志的格式、大小、输出等进行设置,需要使用到两个指令,分别是access_log和log_format指令。
1、access_log:用来设置用户访问日志的相关属性。
语法 | access_log path[format[buffer=size]]; |
默认值 | access_log logs/access.log combined; |
位置 | http,server,location |
2、log_format:用来指定日志的输出格式。
语法 | log_format name[escape=default|json|none] string...; |
默认值 | log_format combined "..."; |
位置 | http |
1、sendfile:用来设置Nginx服务器是否使用sendfile传输文件,该属性可以大大提高Nginx处理静态资源的性能。
语法 | sendfile on|off; |
默认值 | sendfile off; |
位置 | http、server、location |
2、keepalive_timeout:用来设置长连接的超时时间。
为什么要使用keepalive?
语法 | keepalive_timeout time; |
默认值 | keepalive_timeout 75s; |
位置 | http、server、location |
3、keepalive_requests:用来设置一个keep-alive连接使用的次数。
语法 | keepalive_requests number; |
默认值 | keepalive_requests 100; |
位置 | http、server、location |
server {
# server_name与listen构成访问请求的前半部分
listen 80;
# 服务名称
server_name localhost;
# 访问 / 时会进入该location
location / {
# root为资源所对应的目录
root html;
# index为首页(需要放在对应的目录)
index index.html index.htm;
}
# 对应的错误码,会返回错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
# root为资源所对应的目录
root html;
}
}