Web Server - nginx
官网 http://nginx.org/
中文官网 https://nginx.p2hp.com/
1.1 Nginx介绍
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2022年01月25日,nginx 1.21.6发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
1.2 Nginx主要功能
1.2.1 反向代理
这是 Nginx 服务器作为 WEB 服务器的主要功能之一,客户端向服务器发送请求时,会首先经过 Nginx 服务器,由服务器将请求分发到相应的 WEB 服务器。正向代理是代理客户端,而反向代理则是代理服务器,Nginx 在提供反向代理服务方面,通过使用正则表达式进行相关配置,采取不同的转发策略,配置相当灵活,而且在配置后端转发请求时,完全不用关心网络环境如何,可以指定任意的IP地址和端口号,或其他类型的连接、请求等。
正向代理示意图--------------------------------------------------------------------反向代理示意图
正向代理的作用一般是用来隐藏真实客户端的,通过代理服务器为客户端收发请求,使真实客户端对服务器不可见。
反向代理的作用是用来隐藏真实服务器的,为服务器收发请求,使真实服务器对客户端不可见。一般在处理跨域请求的时候比较常用。现在基本上所有的大型网站都设置了反向代理。
反向代理总结:
- 可以起到保护网站安全的作用,任何来自Internet的请求都必须先经过代理服务器。
- 通过缓存静态资源,加速Web请求。
- 实现负载均衡。
代理:代替我们处理,两次请求,两次响应
1.2.2 负载均衡
这也是 Nginx 最常用的功能之一,负载均衡,一方面是将单一的重负载分担到多个网络节点上做并行处理,每个节点处理结束后将结果汇总返回给用户,这样可以大幅度提高网络系统的处理能力;另一方面将大量的前端并发请求或数据流量分担到多个后端网络节点分别处理,这样可以有效减少前端用户等待相应的时间。而 Nginx 负载均衡都是属于后一方面,主要是对大量前端访问或流量进行分流,已保证前端用户访问效率,并可以减少后端服务器处理压力。
负载均衡实际是转发,一次请求,一次响应。
- nginx工作在7层,而lvs工作在4层。
- LVS在内核级别实现负载均衡,适用于大规模的网络流量,而Nginx则更常用于Web应用和中小型规模的负载均衡场景。此外,LVS通常用于TCP协议的负载均衡
- Nginx则既可以处理HTTP协议的流量,也可以处理其他类型的流量。
- 选择使用哪种负载均衡工具取决于您的具体需求和环境。如果您需要处理大规模的网络流量,并且对性能要求较高,可以考虑使用LVS。如果您需要一个功能丰富、易于配置的负载均衡工具,并且需要处理HTTP协议的流量,那么Nginx可能是一个更好的选择。
1.2.3 动静分离
是指在web服务器架构中,将静态页面与动态页面,或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。
nginx 的动静分离,指的是由 nginx 将客户端请求进行分类转发,静态资源请求(如html、css、图片等)由静态资源服务器处理,动态资源请求(如 jsp页面、servlet程序等)由 tomcat 服务器处理,tomcat 本身是用来处理动态资源的,同时 tomcat 也能处理静态资源,但是 tomcat 本身处理静态资源的效率并不高,而且还会带来额外的资源开销。利用 nginx 实现动静分离的架构,能够让 tomcat 专注于处理动态资源,静态资源统一由静态资源服务器处理,从而提升整个服务系统的性能 。
1.2.4 Web 缓存
在很多优秀的网站中,Nginx 可以作为前置缓存服务器,它被用于缓存前端请求,从而提高 Web服务器的性能。Nginx 会对用户已经访问过的内容在服务器本地建立副本,这样在一段时间内再次访问该数据,就不需要通过 Nginx 服务器向后端发出请求。减轻网络拥堵,减小数据传输延时,提高用户访问速度。
1.3 安装Nginx
1.3.1 yum安装
#添加CentOS 7 Nginx yum资源库
[root@zabbix-svr-2 ~]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
#安装
[root@zabbix-svr-2 ~]# yum install -y nginx
[root@zabbix-svr-2 ~]# systemctl start nginx
[root@zabbix-svr-2 ~]# systemctl status nginx
...
[root@zabbix-svr-2 ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@zabbix-svr-2 ~]# nginx -v
nginx version: nginx/1.22.1
1.3.2 编译安装
]# yum install -y gcc gcc-c++ make libtool wget pcre pcre-devel zlib zlib-devel openssl openssl-devel
]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
]# tar -zxvf nginx-1.18.0.tar.gz
]# cd nginx-1.18.0
]# ./configure
]# make && make install
安装完成后的路径为:/usr/local/nginx
1.3.3 访问主页
访问搭建主机的IP即可直达主页,默认端口80
1.4 Nginx命令
通过yum安装的nginx,可以通过systemd管理,而编译安装则可以通过nginx文件启动管理,也可以把nginx配置为systemd管理
可以参考前几章的apache安装
- 普通启动服务:/usr/local/nginx/sbin/nginx
- 配置文件启动:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
- 暴力停止服务:/usr/local/nginx/sbin/nginx -s stop
- 优雅停止服务:/usr/local/nginx/sbin/nginx -s quit
- 检查配置文件:/usr/local/nginx/sbin/nginx -t
- 重新加载配置:/usr/local/nginx/sbin/nginx -s reload
- 查看相关进程:ps -ef | grep nginx
1.5 配置文件详解
1. 配置文件nginx.conf
[root@zabbix-svr-2 ~]# tree /etc/nginx/
/etc/nginx/
├── conf.d
│ └── default.conf
├── fastcgi_params
├── mime.types
├── modules -> ../../usr/lib64/nginx/modules
├── nginx.conf
├── scgi_params
└── uwsgi_params
2 directories, 6 files
- fastcgi_params:fastcgi 相关参数文件
- mime.types:存放媒体资源的类型,例如:xml、html、css
- nginx.conf:
nginx 默认主配置文件
- scgi_params:与fastcgi_params一样,传递哪些服务器的变量
- uwsgi_params:服务器和服务端应用程序的通信协议,规定了怎么把请求转发给应用程序和返回
主配置文件nginx.conf模块
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
主配置文件nginx.conf
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
- log_format
1.
$remote_addr
与$http_x_forwarded_for
用以记录客户端的ip地址;
2.$remote_user
:用来记录客户端用户名称;
3.$time_local
: 用来记录访问时间与时区;
4.$request
: 用来记录请求的url与http协议;
5.$status
: 用来记录请求状态;成功是200,
6.$body_bytes_s ent
:记录发送给客户端文件主体内容大小;
7.$http_referer
:用来记录从那个页面链接访问过来的;
8.$http_user_agent
:记录客户端浏览器的相关信息;
9.惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。
10.每个指令必须有分号结束。
- location
localtion [ = | ~ | ~* | ^~ ] [URL]
~:区分大小写
~*:不区分大小写
!~:取反
^~:不使用正则表达式(nginx 使用的是perl 正则)
location ~\.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.ph p;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
localtion 字段含义:" ~ " 区分大小写," .php$ " 转义字符含义," . " 在正则里面表示任意所有,通过 \ 转义含义," $ " 以 " .php " 结尾,如果匹配到以" .php " 结尾的文件,进入到 " html " 目录去找它,这个请求通过 " fastcgi_pass " 转交给本地的9000 端口,fastcgi默认的首页是 index.php
2. 页面文件目录
[root@zabbix-svr-2 ~]# tree /usr/share/nginx/
/usr/share/nginx/
└── html
├── 50x.html
└── index.html
1 directory, 2 files
html:网站的根目录,访问的网站页面信息都存放在这个目录下
50x.html:网站的错误页面,所以500的错误页面
index.html:默认首页
HTTP响应状态码
100-199:指客户端的响应动作
200-299:响应成功
300-399:文件或者目录发生了移动
400-499:客户端的错误
500-599:服务端的错误
常见的响应状态码
200:OK,访问成功
301:Moved,永久跳转,请求的页面已经被重新定义到其他位置
403:Forbidden,禁止访问,权限不够,检测网站根目录的权限
404:Not Found,未找到页面,路径不对、文件名不对、服务器上没有这个路径或者文件
500:Iternal server error,开启selinux 可能会导致
502:Bad Gateway,代理服务器有问题,nginx+php 转发的时候可能会出,转发的后端服务器没有找到,或者转发不对都可能导致这个问题
504:Gateway timeout,网关代理服务器请求后端服务器的时候,没有在指定的范围内完成解析,就会报错504
3. 关于root和alias
nginx指定文件路径有两种方式root和alias,指令的使用方法和作用域:
[root]
语法:root path
默认值:root html
配置段:http、server、location、if
[alias]
语法:alias path
配置段:location
root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
- root的处理结果是:root路径+location路径
- alias的处理结果是:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的定义。
还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件,而root则可有可无。
root实例:
location ^~ /t/ {
root /www/root/html/;
}
如果一个请求的URI是/t/a.html
时,web服务器将会返回服务器上的/www/root/html/t/a.html
的文件。
alias实例:
location ^~ /t/ {
alias /www/root/html/new_t/;
}
如果一个请求的URI是/t/a.html
时,web服务器将会返回服务器上的/www/root/html/new_t/a.html
的文件。注意这里是new_t,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用
alias只能位于location块中。(root可以不放在location中)