Nginx学习笔记
-
Nginx
("engine x")是一个高性能的HTTP
和反向代理web服务器
,特点是占有内存少,并发能力强。 -
正向代理
:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。 -
反向代理
:将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后再返回给客户端,暴露的是代理服务器地址,隐藏了真实服务器的IP地址。 -
负载均衡
:将原先请求集中到单个服务器上的流量改为分发到多个服务器上。 -
动静分离
:把动态页面和静态页面分别由不同的服务器来解析,以加快网站的解析速度,降低原来单个服务器的压力。 - 查看
Nginx
版本号:./nginx -v
- 查看
Nginx
安装路径:whereis nginx
:/usr/local/nginx
- 启动
Nginx
:./nginx
- 停止
Nginx
:./nginx -s stop
- 重新加载
Nginx
:./nginx -s reload
- 查看
Nginx
进程状态:ps -ef | grep nginx
- docker 拉取 Nginx 镜像并运行一个容器实例:
docker search nginx
docker pull nginx
docker images nginx
docker run -d --name mynginx -p 80:80 nginx
docker ps
docker exec -it mynginx /bin/bash
- 配置文件:
nginx.conf
:/usr/local/nginx/conf/nginx.conf
,其内容包含3部分:
①
全局块
:从首行到events块
之间的内容,主要设置一些影响 nginx 服务器整体运行的配置指令,包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
②events块
:主要影响 Nginx 服务器与用户的网络连接。常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
③http块
:包括http全局块
和server块
。每个http 块
可以包括多个server 块
,而每个server 块
就相当于一个虚拟主机
。
(3.1)、http全局块
配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
(3.2)、server块
:这块和虚拟主机有密切关系,从用户的角度看,虚拟主机相当于一台独立的硬件主机,该技术的产生是为了节省互联网服务器硬件成本。每个server块
分为全局server块
和多个location块
。
(3.2.1)、全局server块
:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
(3.2.2)、location块
:一个server块
可以配置多个location块
。基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
- 修改Nginx 配置文件:nginx.conf
# ================ 1、全局块开始 ==================
#user nobody;
# worker_processes 值越大,可以支持的并发处理量也就越多,但会受到硬件、软件等设备的制约
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
# ================ 1、全局块结束 ==================
# ================ 2、events 块开始 ===============
events {
# 每个 work process 支持的最大连接数为 1024
worker_connections 1024;
}
# ================ 2、events 块结束 ===============
# ================ 3、http 块开始 =================
http {
# ================ 3.1、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;
# ================ 3.1、http 全局块结束 =================
# ================ 3.2、server 块开始 ===================
# 负载均衡服务列表配置,服务名为 myserver,weight 为权重
upstream myserver {
server 192.168.211.143:8080;
server 192.168.211.143:8081;
}
server {
# ================ 3.2.1、server 全局块开始 ===================
listen 80;
server_name 192.168.211.143;
#charset koi8-r;
#access_log logs/host.access.log main;
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
# ================ 3.2.2、server 全局块结束 ===================
# ================ 3.2.3、location 块开始 =====================
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
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;
#}
# ================ 3.2.3、location 块结束 =====================
}
# another virtual host using mix of IP-, name-, and port-based configuration
# 配置虚拟主机访问映射规则
server {
listen 9001;
server_name 192.168.211.143;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
# 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.htm;
# }
#}
# ================ 3.2、server 块结束 ===================
}
# ================ 3、http 块结束 =================
-
location
指令说明:用于匹配URL
。
location [ = | ~ | ~* | ^~] uri {
}
1、
=
:用于不含正则表达式的URI前,要求请求字符串与URI严格匹配,若匹配成功,则停止继续向下搜索并立即处理该请求。
2、~
:用于表示URI包含正则表达式,且区分大小写
。
3、~*
:用于表示URI包含正则表达式,且不区分大小写
。
4、^~
:用于不含正则表达式的URI前,要求Nginx服务器找到标识URI和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
- 注意: 若uri包含正则表达式,则必须要有
~
或者~*
标识。 -
Nginx
分配服务器策略:
1、
轮询
(默认):每个请求按时间顺序逐一分配到不同的后端服务器,若后端服务器宕机,则会自动剔除。
2、权重
(weight
):代表权重默认为1,权重越高被分配的客户端越多。
# 负载均衡服务列表配置,服务名为 myserver,weight 为权重
upstream myserver {
server 192.168.211.143:8080 weight=5;
server 192.168.211.143:8081 weight=10;
}
3、
ip_hash
:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题。
upstream myserver {
ip_hash;
server 192.168.211.143:8080;
server 192.168.211.143:8081;
}
-
动静分离
:把动态跟静态请求分开,可以理解成使用 Nginx处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:一种是纯粹把静态文件放在独立的服务器上,也是目前主流推崇的方案;另外一种就是动态跟静态文件混合在一起发布,通过 nginx 来分开。具体实现:通过location
指定不同的后缀名
实现不同的请求转发:
通过
expires
参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体expires
定义:给一个资源设定一个过期时间,无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源
。若是经常更新的文件,则不建议使用expires
来缓存。假设设置某个url的expires
值为3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,就不会从服务器抓取,返回状态码304
;若有修改,则直接从服务器重新下载,返回状态码200
。(304状态码
:当你发出一个GET请求时服务器会从缓存中调用你要访问的内容,这个时候服务器就可以判断这个页面是不是更新过了,如果未更新过那么它会给你返回一个304状态码。)
# 访问 url:ip/www/index.html
location /www/ {
root /data/;
index index.html index.htm;
}
# 访问 url:ip/image/01.jpg
location /image/ {
root /data/;
# 列出当前文件夹下的所有文件及文件夹
autoindex on;
}
动静分离1
动静分离2.1
动静分离2.2
-
Nginx高可用
:两台业务系统启动着相同的服务,若有一台出现故障,则另一台自动接管。通过keekpalived
软件来实现。作用是检测服务器的状态
,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作。当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
- 安装命令:
yum install keepalived
。查看是否安装成功:rpm -q -a keepalived
。 -
keepalived
软件主要是通过VRRP协议
实现高可用的功能。VRRP
是Virtual Router RedundancyProtocol
(虚拟路由器冗余协议)的缩写,其目的为了解决静态路由出现的单点故障
问题,能够保证当个别节点宕机时,整个网络可以不间断地运行。
- 修改
keepalived
的配置文件:keepalived.conf
# 全局定义
global_defs {
# 设置报警邮件地址,可以设置多个,每行一个,需要开启 sendmail服务
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
# 设置邮件的发送地址
notification_email_from Alexandre.Cassen@firewall.loc
# 设置 SMTP Server 地址
smtp_ server 192.168.17.129
# 设置 SMTP Server 超时时间
smtp_connect_timeout 30
# 表示运行 keeplived 服务器的一个标识,发邮件时显示大邮件主题中的信息
# LVS_DEVEL这字段在/etc/hosts文件中设置;通过它访问到主机:127.0.0.1 LVS_DEVEL
router_id LVS_DEVEL
}
vrrp_script chk_http_ port {
script "/usr/local/src/nginx_check.sh"
interval 2 # 检测脚本执行的间隔:2s
weight 2 # 权重:若这个脚本检测为真,则服务器权重+2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens32 # 网卡名称,通过 ifconfig 命令查看
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 每隔1s发送一次心跳
authentication { # 校验方式:类型是密码,密码1111
auth type PASS
auth pass 1111
}
virtual_ipaddress { # 虛拟ip
192.168.211.50 # VRRP H虛拟ip地址
}
}
- 在路径
/usr/local/src/
下新建检测脚本nginx_check.sh
:
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];
then /usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];
then killall keepalived
fi
fi
- 给脚本
nginx_check.sh
加个执行权限:chmod u+x nginx_check.sh
- 启动keepalived:
systemctl start keepalived.service
- 停止keepalived:
systemctl stop keepalived.service
- 查看keepalived进程状态:
ps -ef | grep keepalived
查看nginx进程状态 master与worker的关系 worker抢占式工作原理
- 1个 master 和多个 woker 的好处:①可以使用
nginx –s reload
进行热部署操作;②每个 woker 都是独立的进程,若其中1个 woker 出现问题,则其他 woker 不受影响,继续进行争抢,实现请求过程,不会造成服务中断。 - 设置多少个 woker 合适:Nginx同redis类似都采用了
IO多路复用机制
,每个worker都是1个独立的进程, 但每个进程里只有1个主线程,通过异步非阻塞
的方式来处理请求。即使是千上万个请求也不在话下。每个worker的线程可以把1个cpu的性能发挥到极致。因此,worker数和服务器的cpu数相等是最为适宜的选择。设置少了会浪费cpu,多了会造成cpu频繁切换上下文带来的损耗。
# 设置worker数量
worker.processes 4
# work绑定cpu(4work绑定4cpu)
worker_cpu_affinity 0001 0010 0100 1000
# work绑定cpu (4work绑定8cpu中的4个)
worker_cpu_affinity 0000001 00000010 00000100 00001000
- 连接数
worker_connection
:①发送请求,占用了woker 2个或4个连接数。②nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?
a、普通的静态访问最大并发数是: worker_connections * worker_processes /2;
b、若是HTTP 作为反向代理,则最大并发数量为worker_connections * worker_processes/4。