配置解析
如下为nginx的配置文件,做了解释以及部分补充配置
初学可以先简单过一下
#定义Nginx运行的用户和用户组(权限)
#user nobody;
#进程数,建议设置为等于CPU总核心数。worker_processes 1;
#全局错误日志
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#进程文件,记录当前启动的nginx的进程ID
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#单个后台worker_process进程的最大并发链接数
worker_connections 1024;
#补充,参考事件模型,
#use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
#epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。#use epoll;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型(邮件支持类型),类型由mime.types文件定义
#mime.types文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#补充
#默认编码
charset utf-8;
#上传文件大小限制
client_header_buffer_size 32k;
#设定日志
#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;
#在linux/Unix系统中优化tcp数据传输,仅在sendfile开启时有效
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip压缩开关
#gzip on;
#HTTP服务器
server {
#监听80端口,80端口是知名端口号,用于HTTP协议
listen 80;
#域名可以有多个,用空格隔开
server_name localhost;
#编码集
#charset koi8-r;
#日志相关
#access_log logs/host.access.log main;
location / {
#主目录
root html;
#首页(默认页)
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
下面再抽出几个详细介绍,有的很多配置我也还没玩明白,以后会再出详细的文章,目前捡着能用到的看就可以,大概知道可以这么做就可以,我们需要多关注的是虚拟主机和负载均衡
虚拟主机
虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供服务,这样就可以实现一台主机对外提供多个web服务,达到一个反向代理的目的,每个虚拟主机之间是独立的,互不影响的
通过nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置
-
基于ip的虚拟主机, (一块主机绑定多个ip地址)
-
基于域名的虚拟主机(servername)
-
基于端口的虚拟主机(listen如果不写ip端口模式)
如下一个Server就表示一个虚拟主机
http{
server{
#监听80端口,用于HTTP协议
listen 80;
#定义使用www.xx.com访问
server_name www.helloworld.com;
#location 后面设置映射的路径
location / {
#定义服务器的默认网站根目录位置
root /root;
#定义首页索引文件的名称
index index.html index.htm;
}
}
}
映射/虚拟目录
#location URI {} 对当前路径及子路径下的所有对象都生效
location / {
root /root; #定义服务器的默认网站根目录位置
index index.html index.htm; #定义首页索引文件的名称
}
#location URI {} 对当前路径的documents子路径下的所有对象都生效
location /documents/ {
root /root; #定义服务器的默认网站根目录位置
index index.html index.htm; #定义首页索引文件的名称
}
#location ^~ URI {} 禁用正则表达式
location ^~ /images/ {
root /root; #定义服务器的默认网站根目录位置
index index.html index.htm; #定义首页索引文件的名称
}
#location ~* URI {},此处的URI可使用正则表达式,*不区分字符大小写
location ~* \.(gif|jpg|jpeg)$ {
root /root; #定义服务器的默认网站根目录位置
index index.html index.htm; #定义首页索引文件的名称
}
#location ~ URI {},此处的URI可使用正则表达式,区分字符大小写
location ~ \.(gif|jpg|jpeg)$ {
root /root; #定义服务器的默认网站根目录位置
index index.html index.htm; #定义首页索引文件的名称
}
优先级:= > ^~ > |* > /|/dir/
location 的执行逻辑跟 location 的编辑顺序无关。
但是这句话不全对,如下
正则 location 的匹配规则是 顺序匹配,且只要匹配到第一个就停止后面的匹配
普通 location 的匹配规则是 最大前缀
普通location 与 正则 location 之间会先匹配普通 location ,再考虑匹配正则 location ,注意这里的考虑是可能的意思,也就是说匹配完 普通 location 后,有的时候需要继续匹配 正则 location ,有的时候则不需要继续匹配 正则 location 。
两种情况下,不需要继续匹配 正则 location :
-
当普通 location 前面指定了“ ^~ ”,特别告诉 Nginx 本条普通 location 一旦匹配上,则不需要继续正则匹配;
-
当普通location 恰好严格匹配上,不是最大前缀匹配,则不再继续匹配正则
负载均衡
上面说完了虚拟主机,可以做反向代理,反向代理配合upstream可以做负载均衡
upstream xxx{
server 192.168.43.152:80;
server 192.168.43.153:80;
}
location配合upstream转向实现负载
location / {
proxy_pass xxx;#请求转向xxx定义的服务器列表
}
可选参数
weight(权重):指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
down:表示当前的server暂时不参与负载
weight:默认为1.weight越大,负载的权重就越大。
backup:其它所有的非backup机器down或者忙的时候,请求backup机器。
upstream xxx{
server 127.0.0.1:8050 weight=10 down;
server 127.0.0.1:8060 weight=1;
server 127.0.0.1:8060 weight=1 backup;
}
max_conns:可以根据服务的好坏来设置最大连接数,防止挂掉,比如服务器能接收1000,我们可以设置800
upstream xxx{
server 127.0.0.1:8050 weight=5 max_conns=800;
server 127.0.0.1:8060 weight=1;
}
max_fails:失败多少次 认为主机已挂掉则,踢出,公司资源少的话一般设置2~3次,多的话设置1次
max_fails=3 fail_timeout=30s:代表在30秒内请求某一应用失败3次,认为该应用宕机,后等待30秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待30秒…以此循环,直到恢复。
upstream xxx{
server 127.0.0.1:8050 weight=1 max_fails=1 fail_timeout=20;
server 127.0.0.1:8060 weight=1;
}
Nginx 支持的负载均衡调度算法方式如下:
①weight 轮询(默认): 如果不做配置接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx 会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。
也可以给不同的后端服务器设置一个权重值,用于调整不同的服务器上请求的分配率。权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
②ip_hash: 每个请求按照发起客户端的 ip 的 hash 结果进行匹配,这样的算法下一个固定 ip 地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下 Session 共享的问题。
③fair: 智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配。
响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少,它是结合了前两者的优点的一种调度算法。但是需要注意的是 Nginx 默认不支持 fair 算法,如果要使用这种调度算法,请安装 upstream_fair 模块。
④url_hash: 按照访问的 URL 的 hash 结果分配请求,每个请求的 URL 会指向后端固定的某个服务器,可以在 Nginx 作为静态服务器的情况下提高缓存效率。同样要注意 Nginx 默认不支持这种调度算法,要使用的话需要安装 Nginx 的 hash 软件包。
关注公众号回复“资源”,可以免费领取架构师、大数据、AI等课程
回复“面试题”,可以获得大厂面试视频讲解