web服务器:web服务器也叫网页服务器,英文名叫做 Web Server
,主要功能是为用户提供网上信息浏览服务
HTTP:HTTP是超文本传输协议的缩写,是用于从web服务器传输超文本到本地浏览器的传输协议,也是互联网上应用最为广泛的一种网络协议。HTTP是一个客户端和服务端请求和应答的标准,客户端是终端用户,服务端是网站,通过使用web浏览器、网络爬虫或者其他工具,,客户端发起一个请求到服务器指定端口的HTTP请求
POP3:邮局协议的第三个版本
SMTP:简单邮件传输协议
IMAP:交互式邮件存取协议
CGI:通用网关接口
正向代理
反向代理
运行速度更快,并发速度更高
单次请求或高并发请求的环境下,Nginx都会比其他Web服务器响应速度更快
配置简单,扩展性强
Nginx的设计极具扩展性,它本身是由很多模块组成,这些模块的使用可以通过配置文件的配置来添加。
高可靠性
Nginx采用的是多进程模式运行,其中有一个master主进程和N多个worker进程,worker进程的数量我们可以手动设置
热部署
Nginx可以在不停止的情况下,对Nginx进行文件升级、更新配置和更换日志文件等功能
成本低,BSD许可证
Nginx可以提供基本HTTP服务,可以作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL等。
Nginx提供邮件代理服务也是基本开发需求之一,主要包括以下特性:
Nginx的核心组成:
nginx.conf
配置文件error.log
错误的日志记录access.log
访问日志记录Nginx的官方网站为:https://nginx.org/en/
获取Nginx源码:https://nginx.org/download/
打开上述网站,就可以查看到Nginx的所有版本,选中自己需要的版本进行下载。我们可以现在Windows中下载,然后上传到服务器中;也可以直接从服务器下载。
环境准备:
准备内核为2.6以上版本的操作系统
确保能上网
关闭系统防火墙
systemctl stop firewalld # 停止防火墙
systemctl disable firewalld # 进行防火墙自动启动
Linux基础
关闭SELinux
安装依赖:
首先需要准备gcc编译器
yum install -y gcc
PCRE:解析正则表达式
yum install -y pcre pcre-devel
zlib:压缩算法
yum install -y zlib zlib-devel
OpenSSL:进行安全通信
yum install -y openssl openssl-devel
Nginx安装,有两种方式安装:
通过源码安装
mkdir -p nginx/core # 工作目录
cd nginx/core # 进入目录
curl https://nginx.org/download/nginx-1.22.0.tar.gz -o nginx-1.22.0.tar.gz # 将压缩包下载到服务器上
tar -zxvf nginx-1.22.0.tar.gz # 解压缩
cd nginx-1.22.0 # 进入文件
./configure # 编译运行
./configure --help # 获取编译运行的安装参数
make && make install # 安装
# 安装成功后,进入到二进制文件目录。开启Nginx
/usr/local/nginx/sbin/nginx # 注意需要关闭防火墙才可以成功访问
我们可以传入不同的安装参数,编译自定义较强的Nginx
推荐使用这种方式安装
这种方式安装的卸载方式为:
/usr/local/nginx/sbin/nginx -s stop # 强行停止正在运行的进程
rm -rf /usr/local/nginx # 直接移除文件
cd ~/nginx/core # 进入编译目录
make clean # 清空编译的文件残留
通过yum安装
在官方文档上面有安装文档:https://nginx.org/en/linux_packages.html#RHEL
# 安装yum工具
sudo yum install -y yum-utils
# 将Nginx配置文件写入yum中,这里安装的是稳定版
cat << EOF > /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
# Nginx
sudo yum install -y nginx
这种方式安装的卸载方式为:
/usr/sbin/nginx -s stop # 停止Nginx进程
# 先删除文件,在移除残留
rm -rf /usr/sbin/nginx
rm -rf /etc/nginx
rm -rf /etc/init.d/nginx
yum remove -y nginx # 删除卸载残留
对于Nginx的启动和停止在linux系统中也有很多方式,这里介绍两种方式:
Nginx的信号控制
Nginx的命令行控制
在此之前,我们还需要学习一下配置目录的相关信息
这里的安装方式是使用源码安装的,Nginx的目录比较集中
(base) [root@MyCentOS nginx]# tree
.
├── conf
│ ├── fastcgi.conf # 相关配置文件
│ ├── 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 的参数备份文件
│ ├── mime.types # 记录的是mine类型与文件后缀名的关系
│ ├── mime.types.default # 副本
│ ├── nginx.conf # Nginx配置文件
│ ├── nginx.conf.default # Nginx配置备份文件
│ ├── koi-utf # 这三个都与编码有关
│ ├── koi-win
│ └── win-utf
├── html # html 页面
│ ├── 50x.html # 访问失败后的页面
│ └── index.html # 成功访问的默认页面
├── logs # 访问日志
| ├── access.log # 访问日志
| ├── error.log # 错误日志
| ├── nginx.pid # Nginx进程的pid
└── sbin
└── nginx # Nginx二进制文件,可以进行停止等操作
我们现在作为管理员,只需要通过master进程发送信号就可以来控制Nginx,这个时候末尾需要两个前提条件,一个是要操作的master进程,一个是信号。
查看Nginx的进程ID:
ps -ef | grep nginx
:通过Linux命令获取cat logs/nginx.pid
:通过访问Nginx进程的pid我们获取到Nginx的pid之后,就可以对根据pid,对Nginx进行操作了:
信号 | 作用 |
---|---|
TERM/INT |
立即关闭整个服务 |
QUIT |
“优雅”地关闭整个服务 |
HUB |
重读配置文件并使用服务对新配置生效 |
USER1 |
重新打开日志文件,可以用来进行日志分割 |
USER2 |
平滑升级到最新版的Nginx |
WINCH |
所有子进程不在接收处理新连接,相当于给work进程发送QUIT指令 |
调用命令为:kill -signal PID
signal
:即为信号
PID
:即为Nginx中master的进程id
kill -TERM $(cat /usr/local/nginx/logs/nginx.pid) # 使用$ 标明为变量,获取到进程pid
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid)
kill -HUB $(cat /usr/local/nginx/logs/nginx.pid)
kill -USER1 $(cat /usr/local/nginx/logs/nginx.pid) # 实现日志分割
kill -USER2 $(cat /usr/local/nginx/logs/nginx.pid) # 如果有新增的master进程,先把原来的事件处理完,再启动新的master进程
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid) # 关闭所有的woker进程,注意不会关闭master进程
平滑升级:
如果升级Nginx程序,先用新程序替换旧程序文件,编译安装的话新程序直接编译到Nginx安装目录中。
此时旧的Nginx主进程将会把自己的进程文件改名为.
oldbin
,然后执行新版 Nginx。新旧Nginx会同时运行,共同处理请求。
这时要逐步停止旧版 Nginx,输入命令:
kill -WINCH 旧版主进程号
慢慢旧的工作进程就都会随着任务执行完毕而退出,新版的Nginx的工作进程会逐渐取代旧版 工作进程。此 时,我们可以决定使用新版还是恢复到旧版。
不重载配置启动新/旧工作进程 kill -HUP 旧/新版主进程号 从容关闭旧/新进程 kill -QUIT 旧/新主进程号 如果此时报错,提示还有进程没有结束就用下面命令先关闭旧/新工作进程,再关闭主进程号: kill -TERM 旧/新工作进程号
(base) [root@MyCentOS nginx]# sbin/nginx -h
nginx version: nginx/1.22.0
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
[-e filename] [-c filename] [-g directives]
Options:
-?,-h : 显示帮助信息
-v : 显示版本信息
-V : 显示版本信息,同时显示configure时的配置信息
-t : 检测Nginx配置语法是否正确
-T : 检测Nginx配置语法是否正确,同时显示所有的配置信息
-q : 在测试期间,只输出报错信息,如果测试成功,则不输出内容
-s signal : 给master进程发送信号: stop, quit, reopen, reload
-p prefix : 指定Nginx的prefix路径 (default: /usr/local/nginx/)
-e filename : 指定错误日志输出路径(default: logs/error.log)
-c filename : 指定nginx.conf配置文件路径 (default: conf/nginx.conf)
-g directives : 用来补充Nginx配置文件,在Nginx服务启动时应用全局的配置
signal
:
stop
:快速关闭,类似于TERM/INT
信号的作用quit
:优雅的关闭,类似于QUIT
的作用reopen
:重新打开日志文件,类似于USER1
的作用reload
:重新读取配置文件,类似于HUP
的作用
Nginx的核心配置文件默认是放在/usr/local/nginx/conf/nginx.conf
中
读取Nginx自带的Nginx配置文件,我们将其中的注释部分删除后,提取出以下内容:
worker_processes 1; # 指定工人工作的数量
events {
worker_connections 1024; # 工人最大连接数
}
http {
include mime.types; # 导入mime.ty文件
default_type application/octet-stream; # 默认文件类型为文件流
sendfile on; # 是否使用sendfile()传输文件
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; # 50x访问错误的处理
location = /50x.html { # 错误后的路由
root html; # 存放资源的目录
}
}
}
Nginx基本的结构语法:
;
)结尾,指令与参数间以空格符号分割{}
)将多条指令组织在一起#
符号添加注释$
符号使用变量user:用于配置运行Nginx服务器的worker进程的用户和用户组
语法 | user user [group]; |
---|---|
默认值 | nobody |
位置 | 全局块 |
该属性也可以在编译的时候指定,语法:./configure --user=user --group=group
如果两个地方都进行了设置,最终生效的是配置文件中的配置
使用步骤:
user www # 设置一个用户信息,控制工人的用户的信息为www
# 如果没有这个用户,则需要创建一个用户
useradd www # 创建一个用户,再在配置文件中添加 user www
那修改用户有什么作用呢?
首先,我们在root用户以及www用户下创建一个文件html/index.html
:
修改配置文件nginx.conf
:
location / {
root /root/html;
index index.html index.htm;
}
测试启动访问:
返回403拒绝访问的错误
分析原因:因为当前用户没有访问
/root/html
目录的权限
再次修改配置文件nginx.conf
:
location / {
root /home/www/html;
index index.html index.htm;
}
测试启动访问:
能够正常访问
综上所述,使用user
指令可以指定启动运行工作进程的用户及用户组,这样对于行的权限访问控制的更加精细,也更加安全。
master_process
:用来指定是否开启工作进程
语法 | master_process on | off; |
---|---|
默认值 | master_process on; |
位置 | 全局块 |
worker_processes
:用于配置Nginx生成工作进程的数量,这个是Nginx服务器实现并发处理服务的关键所在。理论上来说,值越大,可以支持的并发处理量也越多,但事实上,这个值的设定是需要受到来自服务器自身的限制,建议将该值和服务器CPU内核数保持一致。
语法 | worker_processes num | auto; |
---|---|
默认值 | worker_processes 1; |
位置 | 全局块 |
如果将worker_processes
设置为2,则会有两个工人工作。
daemon
:设定Nginx是否以守护进程的方式启动
守护式进程是linux后台执行的一种服务进程,特点是独立于控制终端,不会随着终端关闭而停止。
语法 | daemon on | off; |
---|---|
默认值 | daemon on; |
位置 | 全局块 |
pid
:用来配置Nginx当前master进程的进程号ID存储的文件路径
语法 | pid file; |
---|---|
默认值 | 默认为:/usr/local/nginx/logs/nginx.pid |
位置 | 全局块 |
该属性可以通过./.configure --pid-path=PATH
来指定
error_log
:用来配置Nginx的错误日志存放路径
语法 | error_log file [日志级别]; |
---|---|
默认值 | error_log logs/error.log error; |
位置 | 全局块、http、server、location |
该属性可以通过:./config --error-log-path=PATH
来指定
其中日志级别的值有:debug|info|notice|warn|error|crit|alert|emerg
include
:用来引入其他的配置文件,使Nginx的配置更加灵活
语法 | include file; |
---|---|
默认值 | 无 |
位置 | 任意位置 |
accept_mutex:用来设置Nginx网络连接序列化
语法 | accept_mutex on | off; |
---|---|
默认值 | accept_mutex on; |
位置 | events |
当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是「惊群问题」
multi_accept:用来设置是否允许同时接收多个网络连接
语法 | multi_accept on | off; |
---|---|
默认值 | multi_accept off; |
位置 | events |
如果multi_accept被禁止了,Nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接。
worker_connections:用来配置单个worker进程最大的连接数
语法 | worker_connections number; |
---|---|
默认值 | worker_connections 512; |
位置 | events |
这个连接数,不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数。。另外,number值不能大于操作系统支持打开的最大文件句柄数量。
use:用来设置Nginx服务器选择哪种事件驱动来处理网络消息
语法 | use method; |
---|---|
默认值 | 根据操作系统而定 |
位置 | events |
注意:此处所选择的事件处理器是Nginx优化部分的一个重要内容。method的可选值有select/poll/epoll/kqueu
等,之前准备centos环境的时候,我们强调过要使用linux内核在2.6以上,就是为了使用epoll函数来优化Nginx
我们也可以在编译的时候指定事件处理器:
--with-select_module --without-select_module --with-poll_module --without-poll_module
来设置是否需要将对应的事件驱动模块编译到Nginx
我们都知道浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的文件、媒体等资源,浏览器为了区分这些资源,就需要使用MIME-TYPE。所以说,MIME-TYPE 是网络资源的媒体类型。Nginx作为web服务器,也需要能够识别前端请求的资源类型。
在Nginx的配置文件中,默认有两行配置:
include mime.types;
default_type application/octet-stream;
default_type
:用来配置Nginx响应前端请求默认的MIME类型
语法 默认值 位置 dafult_type mime-type;
default_type text/plain;
http、server、location
include mimetypes
:把mime.types
文件中MIME类型与相关类型文件的文件后缀名的对应关系加入到当前的配置文件中
实例:直接返回json字符串或者文本字符串
location /get_text {
default_type text/html;
return 200 "This is text from nginx";
}
location /get_json {
default_type application/json;
return 200 '{"name": "TOM", "age": 18}';
}
Nginx中,日志的类型分access.log
,error.log
Nginx服务器支持对服务日志的格式、大小、输出等进行设置,需要用到两个指令。
分别是access_log
和log_format
指令
access_log:用来设置用户访问日志的相关属性。
语法 | access_log path [format [buffer=size]]; |
---|---|
默认值 | access_log logs/access.log combined; |
位置 | http、server、location |
format:其为
log_format
里面指定的name
log_format:用来指定日志的输出格式。
语法 | log_format name [escape=default|json|none] string ....; |
---|---|
默认值 | log_format combined "..."; |
位置 | http |
sendfile
:用来设置Nginx服务器是否使用sendfile()
传输文件,该属性可以大大提高Nginx处理静态资源的性能。
语法 | sendfile on | off |
---|---|
默认值 | sendfile off |
位置 | http、server、location |
keepalive_timeout
:用来设置长连接的超时时间
为什么要使用keepalive
?
- 我们都知道HTTP是一种无状态协议,客户端向服务端发送一个TCP请求,服务端响应完毕后断开连接
- 如果客户端向服务端发送多个请求,每个请求都需要重新创建一次连接,效率相对来说比较低,使用
keepalive
模式。可以告诉服务器,在处理完一个请求后,保持这个TCP连接的打开状态。若接收到来自这个客户端的其他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新连接,提升效率。但是,这个连接也不能一直保持,否则,会使服务端的性能下降,这个时候就需要我们进行设置其的超时时间
语法 | keepalive_timeout time; |
---|---|
默认值 | keepalive_timeout 75; |
位置 | http、server、location |
本节,我们主要来认识一下Nginx默认给的nginx.conf
中的相关内容,以及server块与location块在使用的时候需要注意的一些内容。
server {
listen 80; # 监听的服务器的端口 listen port;
server_name localhost; # 服务名称,可以指定域名、ip等 server_name ip;
location / { # 根目录
root html; # 资源所对应的目录 root path;
index index.html index.htm; # 返回的静态资源页面
}
error_page 500 502 503 504 /50x.html; # 错误码,出现50x后,跳转到 /50x.html
location = /50x.html { # 设置路由
root html; # 资源所对应的目录
}
这里面的变量设置,其有就近原则,优先选择离自己进的变量配置
前面,我们已经对Nginx服务器默认配置文件的结构和涉及的基本指令做了详细的阐述。通过这些指令的合理配置,我们可以让一台nginx服务器正常工作,并且提供基本的web服务器功能
接下来,我们通过一个比较完整和最简单的基础配置实例,来巩固前面所学习的指令及其配置:
有如下访问:
http://192.168.56.101:8081/server1/location1
访问的资源是:index_str1_location1.html
http://192.168.56.101:8081/server1/location2
访问的资源是:index_str1_location2.html
http://192.168.56.101:8082/server2/location1
访问的资源是:index_str2_location1.html
http://192.168.56.101:8082/server1/location2
访问的资源是:index_str2_location2.html
如果访问的资源不存在:
返回自定义的404页面
将/server1
和/server2
的配置使用不同的配置文件分割
为/server1
和/server2
各自创建一个访问日志文件
准备相关文档,目录如下:
(base) [root@MyCentOS home]# tree
.
└── www
├── conf.d
└── myweb
├── 404.html
├── server1
│ ├── loction1
│ │ ├── index_str1_location1.html
│ ├── loction2
│ │ └── index_str1_location2.html
│ └── logs
└── server2
├── loction1
│ └── index_str2_location1.html
├── loction2
│ └── index_str2_location2.html
└── logs
10 directories, 7 files
基础的配置文件
user www; # 使用的用户名
worker_processes 2; # 创建的工人数量
error_log logs/error.log; # 错误日志输出路径
pid logs/nginx.pid; # 进程pid存储路径
daemon on; # 开启守护进程
events {
worker_connections 1024; # 一个工人最大连接数
accept_mutex on; # 网络连接序列化
multi_accept on; # 同时接收多个网络连接
use epoll; # 使用的事件处理器
}
http {
include mime.types; # 导入mime.type 文件
default_type application/octet-stream; # 默认传输类型
sendfile on; # 使用sendfile()发送文件
keepalive_timeout 65; # 保持连接的最大时长65s
include /home/www/conf.d/*.conf; # 包含我们自定义的配置文件
server {
listen 80; # 监听的端口
server_name localhost; # 服务名称
location / { # 更路由配置
root html; # 资源路径
index index.html index.htm; # 需要传输的文件名
}
error_page 500 502 503 504 /50x.html; # 50x错误返回的路由
location = /50x.html { # 配置路由
root html; # 资源路径
}
}
}
server1配置文件:
server {
listen 8081; # 监听8081端口
server_name localhost; # 设置服务名称
access_log /home/www/myweb/server1/logs/access.log; # 指定access日志路径
location /server1/loction1 { # 设置路由
root /home/www/myweb; # 资源路径
index index_str1_location1.html; # 资源名称
}
location /server1/loction2 { # 设置路由
root /home/www/myweb; # 资源路径
index index_str1_location2.html; # 资源名称
}
error_page 404 /404.html; # 404错误重定向
location = /404.html { # 配置404重定向路由
root /home/www/myweb; # 资源根路径
index 404.html; # 指定返回需要渲染的文件
}
}
server2 配置文件:
server {
listen 8082;
server_name localhost;
access_log /home/www/myweb/server2/logs/access.log;
location /server2/loction1 {
root /home/www/myweb;
index index_str2_location1.html;
}
location /server2/loction2 {
root /home/www/myweb;
index index_str2_location2.html;
}
error_page 404 /404.html;
location = /404.html {
root /home/www/myweb;
index 404.html;
}
}
最后,启动我们的nginx服务:
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx