♨️本篇文章记录的为nginx安装教程&&核心配置讲解相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。
♨️如果文章有什么需要改进的地方还请大佬不吝赐教❤️🧡💛
👨🔧个人主页 : 阿千弟
前言:
关于Nginx的相关的基本介绍就不多做解释了, 直奔主题,来为大家讲解nginx如何安装
以及安装之后如何配置
, 以及配置文件中的各个参数的作用
.这篇文章带领大家入门nginx, 不好的地方也请大佬多多指教🙏🙏🙏
@[TOC]
Nginx安装
Nginx环境准备
Nginx版本介绍
Nginx的官方网站为: http://nginx.org
打开源码可以看到如下的页面内容
Nginx的官方下载网站👉👉👉 传送门
点进去里面就是这个样子
准备服务器系统
环境准备
- VMware WorkStation
- Centos7
- MobaXterm
- 网络
(1) 确认centos的内核
准备一个内核为2.6及以上版本
的操作系统,因为linux2.6及以上内核才
支持epoll,而Nginx需要解决高并发压力问题是需要用到epoll,所以我们
需要有这样的版本要求。
我们可以使用uname -a
命令来查询linux的内核版本。
(2) 确保centos能联网
这里我们把网络设置为
NAT
模式 然后采用ping
的方式测试网络
ping www.baidu.com
出现这种情况说明我们的网络是没有问题的
(3) 确认关闭防火墙
这一项的要求仅针对于那些对linux系统的防火墙设置规则不太清楚的,
建议大家把防火墙都关闭掉,因为我们此次课程主要的内容是对Nginx
的学习,把防火墙关闭掉,可以省掉后续Nginx学习过程中遇到的诸多
问题。
关闭的方式有如下两种:
1 systemctl stop firewalld
关闭运行的防火墙,系统重新启 动后,防火墙将重新打开
2 systemctl disable firewalld
永久关闭防火墙,系统重新启 动后,防火墙依然关闭
3 systemctl status firewalld
查看防火墙状态
(4)确认停用selinux
selinux(security-enhanced linux),美国安全局对于强制访问控制的实
现,在linux2.6内核以后的版本中,selinux已经成功内核中的一部分。
可以说selinux是linux史上最杰出的新安全子系统之一。虽然有了
selinux,我们的系统会更安全,但是对于我们的学习Nginx的历程中,
会多很多设置,所以这块建议大家将selinux进行关闭。
sestatus
查看状态
如果查看不是disabled状态,我们可以通过修改配置文件来进行设置,修
改SELINUX=disabled
,然后重启下系统即可生效。
vim /etc/selinux/config
安装需要提前准备的编译环境
GCC编译器
Nginx是使用C语言编写的程序,因此想要运行Nginx就需要安装一个编
译工具。GCC就是一个开源的编译器集合,用于处理各种各样的语言,
其中就包含了C语言。
PCRE
Nginx在编译过程中需要使用到PCRE库(perl Compatible Regular
Expressoin 兼容正则表达式库),因为在Nginx的Rewrite模块和http核
心模块都会使用到PCRE正则表达式语法。
zlib
zlib库提供了开发人员的压缩算法,在Nginx的各个模块中需要使用gzip
压缩,所以我们也需要提前安装其库及源代码zlib和zlib-devel
OpenSSL
OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包进行
安全通信,并且避免被窃听。
重点来了:
上述命令,一个个来的话比较麻烦,我们也可以通过
一条命令来进行全部安装
yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
通过Nginx源码安装
第一步
第二步
- 打开你的
MobaXterm
软件 - 连接并登录你的
虚拟机
- 将你下载好的
nginx-1.22.1.tar.gz
文件拖至右侧的/usr/local/src/
目录, 并等待文件传输过去
- 然后发现打开我们的虚拟机进入
/usr/local/src/
查看, 发现里面有这个文件就说明成功了
- 进入
/usr/local/src/
目录并解压nginx-1.22.1.tar.gz
然后进入解压好的nginx-1.22.1
目录中
cd /usr/local/src/
tar -zxf nginx-1.22.1.tar.gz
cd nginx-1.22.1
- 然后输入 下面的这段代码 , 等待它配置完毕
./configure --prefix=/usr/local/nginx
--sbin-path=/usr/local/nginx/sbin/nginx
--modules-path=/usr/local/nginx/modules
--conf-path=/usr/local/nginx/conf/nginx.conf
--error-log-path=/usr/local/nginx/logs/error.log
--http-log-path=/usr/local/nginx/logs/access.log
--pid-path=/usr/local/nginx/logs/nginx.pid
--lock-path=/usr/local/nginx/logs/nginx.lock
我们对上面代码的参数进行一个详细的说明。
PATH
: 是和路径相关的配置信息with
: 是启动模块,默认是关闭的without
: 是关闭模块,默认是开启的
我们先来认识一些简单的路径配置已经通过这些配置来完成一个简单的
编译:
--prefix=PATH
指向Nginx的安装目录,默认值为/usr/local/nginx
--sbin-path=PATH
指向(执行)程序文件(nginx)的路径,默认值为/sbin/nginx
--modules-path=PATH
指向Nginx动态模块安装目录,默认值为/modules
--conf-path=PATH
指向配置文件(nginx.conf)的路径,默认值为 /conf/nginx.conf
--error-log-path=PATH
指向错误日志文件的路径,默认值为/logs/error.log
--http-log-path=PATH
指向访问日志文件的路径,默认值为/logs/access.log
--pid-path=PATH
指向Nginx启动后进行ID的文件路径,默认值为 /logs/nginx.pid
--lock-path=PATH
指向Nginx锁文件的存放路径,默认值为/logs/nginx.lock
- 编译并安装
make && make install //编译并安装
- 这时候我们的
nginx
就算是安装完成了, 它的默认安装位置是在/usr/local
目录下, 为了验证是否安装成功, 我们输入以下代码测试
cd /usr/local/nginx
cd sbin
. /nginx
- 在你的windos浏览器输入你虚拟机的地址
显示这个网页说明已经安装成功
Nginx服务器启停命令
Nginx安装完成后,接下来我们要学习的是如何启动、重启和停止Nginx
的服务
对于Nginx的启停在linux系统中也有很多种方式,介绍两种方式:
方式一:Nginx服务的信号控制
前面在提到Nginx的高性能,其实也和它的架构模式有关。Nginx默认采用的是多进程的方式来工作的,当将Nginx启动后,我们通过ps -ef | grep nginx命令可以查看到如下内容:
从上图中可以看到,Nginx后台进程中包含一个master进程和多个worker
进程,master进程主要用来管理worker进程,包含接收外界的信息,并
将接收到的信号发送给各个worker进程,监控worker进程的状态,当
worker进程出现异常退出后,会自动重新启动新的worker进程。而
worker进程则是专门用来处理用户请求的,各个worker进程之间是平等
的并且相互独立,处理请求的机会也是一样的。nginx的进程模型,我们
可以通过下图来说明下
我们现在作为管理员,只需要通过给master进程发送信号就可以来控制
Nginx,这个时候我们需要有两个前提条件,一个是要操作的master进
程,一个是信号。
(1)要想操作Nginx的master进程,就需要获取到master进程的进程
号ID。获取方式简单介绍两个 :
方式一:通过ps -ef | grep nginx;
方式二:在讲解nginx的./configure的配置参数的时候,有一个参数
是--pid-path=PATH默认是/usr/local/nginx/logs/nginx.pid ,所以
可以通过查看该文件来获取nginx的master进程ID.
(2)信号
| 信号|作用 |
|--|--|TERM/INT
|立即关闭整个服务QUIT
|"优雅"地关闭整个服务HUP
|重读配置文件并使用服务对新配置项生效USR1
| 重新打开日志文件,可以用来进行日志切割USR2
| 平滑升级到最新版的nginxWINCH
|所有子进程不在接收处理新连接,相当于给work进程发送QUIT指令
调用命令为kill -signal PID
signal:即为信号;PID即为获取到的master线程ID
- 发送
TERM/INT
信号给master
进程,会将Nginx服务立即关闭。
kill -TERM PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
kill -INT PID / kill -INT `cat /usr/local/nginx/logs/nginx.pid`
- 发送
QUIT信号
给master
进程,master进程会控制所有的work进程不
再接收新的请求,等所有请求处理完后,在把进程都关闭掉。
kill -QUIT PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
- 发送
HUP
信号给master
进程,master进程会把控制旧的work进程不
再接收新的请求,等处理完请求后将旧的work进程关闭掉,然后根
据nginx的配置文件重新启动新的work进程
kill -USR1 PID / kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
- 发送
USR2
信号给master
进程,告诉master进程要平滑升级,这个时
候,会重新开启对应的master进程和work进程,整个系统中将会有两个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进程控制不让所有的work
进程在接收新的请求了,请求处理完后关闭work进程。注意master
进程不会被关闭掉
kill -WINCH PID /kill -WINCH`cat /usr/local/nginx/logs/nginx.pid`
方式二:Nginx的命令行控制
此方式是通过Nginx安装目录下的sbin下的可执行文件nginx来进行
Nginx状态的控制,我们可以通过nginx -h来查看都有哪些参数可以
用:
| 命令行
| 作用
|
|--|--|
-?和-h|显示帮助信息
-v|打印版本号信息并退出
-V|打印版本号信息和配置信息并退出
-t|测试nginx的配置文件语法是否正确并退出
-T|测试nginx的配置文件语法是否正确并列出用到的配置文件信息然后退出
-q|在配置测试期间禁止显示非错误消息
-s|signal信号,后面可以跟 :
stop|[快速关闭,类似于TERM/INT信号的作用] kill -WINCH PID /kill -WINCHcat /usr/local/nginx/logs/nginx.pid
1
quit|[优雅的关闭,类似于QUIT信号的作用] reopen[重新打开日志文件类似于USR1信号的作用] reload[类似于HUP信号的作用]
-p:prefix|指定Nginx的prefix路径,(默认为: /usr/local/nginx/)
-c:filename|指定Nginx的配置文件路径,(默认为: conf/nginx.conf)
-g|用来补充Nginx配置文件,向Nginx服务指定启动时应用全局的配置
Nginx核心配置文件结构
Nginx的核心配置文件默认是放在/usr/local/nginx/conf/nginx.conf
读取Nginx自带的Nginx配置文件,我们将其中的注释部分【学习一个技
术点就是在Nginx的配置文件中可以使用#来注释】删除掉后,就剩下下
面内容:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
看不懂的话, 来为大家翻译一下这段配置
指令名 指令值; #全局块,主要设置Nginx服务器整体运行的配置指令
#events块,主要设置,Nginx服务器与用户的网络连接,这一部分对
Nginx服务器的性能影响较大
events {
指令名 指令值;
}
#http块,是Nginx服务器配置中的重要部分,代理、缓存、日志记录、
第三方模块配置...
http {
指令名 指令值;
server {
#server块,是Nginx配置和虚拟主机相关的内容
指令名 指令值;
location / {
#location块,基于Nginx服务器接收请求字符串与
location后面的值进行匹配,对特定请求进行处理
指令名 指令值;
}
}
...
}
测试配置文件是否正常
[root@localhost sbin]# ./nginx -t
nginx: the configuration file /data/nginx-1.22.1/conf/nginx.conf syntax is ok
nginx: configuration file /data/nginx-1.22.1/conf/nginx.conf test is successful
shell> curl -I http://localhost # -I代表只显示头信息
HTTP/1.1 200 OK
简单小结下:
nginx.conf配置文件中默认有三大块:全局块
、events块
、http块
http块中可以配置多个server块,每个server块又可以配置多个location 块。
全局块
user指令
(1)user
:用于配置运行Nginx服务器的worker进程的用户和用户组。
| 语法 | user user [group] |
|--|--|
默认值| nobody
位置 |全局块
该属性也可以在编译的时候指定,语法如下./configure --user=user--group=group
,如果两个地方都进行了设置,最终生效的是配置文件中
的配置。
该指令的使用步骤:
(1)设置一个用户信息"www"
(2) 创建一个用户
useradd www
(3)修改user属性
user www
(4)创建/root/html/index.html页面,添加如下内容
<!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>
<p><em>I am WWW</em></p>
</body>
</html>
(5)修改nginx.conf
location / {
root /root/html;
index index.html index.htm;
}
(5)测试启动访问
页面会报403拒绝访问的错误
(6)分析原因
因为当前用户没有访问/root/html目录的权限
(7)将文件创建到 /home/www/html/index.html ,修改配置
location / {
root /home/www/html;
index index.html index.htm;
}
(8)再次测试启动访问
能正常访问。
综上所述,使用user指令可以指定启动运行工作进程的用户及用户组,
这样对于系统的权限访问控制的更加精细,也更加安全。
work process指令
master_process
:用来指定是否开启工作进程。
events块
(1)accept_mutex
:用来设置Nginx网络连接序列化
语法 |
accept_mutex on /off |
---|---|
默认值 | accept_mutex on |
位置 | events |
这个配置主要可以用来解决常说的"惊群"问题。大致意思是在某一个时
刻,客户端发来一个请求连接,Nginx后台是以多进程的工作模式,也
就是说有多个worker进程会被同时唤醒,但是最终只会有一个进程可以
获取到连接,如果每次唤醒的进程数目太多,就会影响Nginx的整体性
能。如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接
进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。
(2)multi_accept
:用来设置是否允许同时接收多个网络连接
| 语法
| multi_accept on/off
|
|--|--|
默认值 |multi_accept off;
位置 |events
如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的
连接。否则,一个工作进程可以同时接受所有的新连接
(3)worker_connections
:用来配置单个worker进程最大的连接数
语法 |
worker_connections number |
---|---|
默认值 |worker_commections 512;
位置 |events
这里的连接数不仅仅包括和前端用户建立的连接数,而是包括所有可能
的连接数。另外,number值不能大于操作系统支持打开的最大文件句
柄数量。
(4)use
:用来设置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
http块
定义MIME-Type
浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIMEType。所以说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;
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
:用来记录用户所有的访问请求。
error.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?
- 我们都知道HTTP是一种无状态协议,客户端向服务端发送一个TCP请求,服务端响应完毕后断开连接。
- 如何客户端向服务端发送多个请求,每个请求都需要重新创建一次连接,
效率相对来说比较多,使用keepalive模式,可以告诉服务器端在处理完
一个请求后保持这个TCP连接的打开状态,若接收到来自这个客户端的其
他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新
连接,提升效率,但是这个连接也不能一直保持,这样的话,连接如果过
多,也会是服务端的性能下降,这个时候就需要我们进行设置其的超时时
间。
语法 |
keepalive_timeout time |
---|---|
默认值 | keepalive_timeout 75s |
位置 |http、server、location
(3)keepalive_requests:用来设置一个keep-alive连接使用的次数。
语法 |
keepalive_requests number |
---|---|
默认值 | keepalive_requests 100 |
位置 |http、server、location
如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对Java后端或者对
mybatis
感兴趣的朋友,请多多关注💖💖💖
👨🔧个人主页 : 阿千弟