持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
简介
Nginx是一款轻量级的web服务器、反向代理服务器。
Nginx的Master-Worker模式
Nginx启动后其实就是在80端口启动了socket服务进行监听。 Master负责读取并按照配置文件、管理一个或多个Worker。 每一个Worker进程的维护一个线程,处理连接和请求;其中Worker进程个数由配置文件决定 ,一般和CPU个数相关。
思考:Nginx挂了怎么办?
Keepalived+Nginx实现高可用。
第一:请求不要直接打到Nginx上,应该先通过Keepalived(这就是所谓虚拟IP,VIP)
第二:Keepalived应该能监控Nginx的生命状态(提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换)
##动静分离
静态文件放在Nginx,
反向代理和正向代理
例子:使用vpn代理访问外网。叫村里的小盆友帮忙买辣条,在这里小盆友就充当代理,商店就充当服务端,而“你”充当客户端。
反向代理:
总结:
正向代理:代理的是客户端;这个时候服务端是不知道真正的客户端。 反向代理:代理的是服务端;这个时候客户端是不知道真正的服务端。 反向代理demo
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
events {
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
sendfile on;
#连接超时时间
keepalive_timeout 65;
server {
listen 80;
server_name 127.0.0.01;
location / { #location / 表示处理所有请求
proxy_pass http://192.168.20.1:8080; #代理的服务端
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
正则表达式说明:
- =:用于不含正则表达式的url前,要求字符串与url严格匹配,匹配成功就停止向下搜索并处理请求
- ~:用于表示url包含正则表达式,并且区分大小写。
- ~*:用于表示url包含正则表达式,并且不区分大小写
- ^~:用于不含正则表达式的url前,要求ngin服务器找到表示url和字符串匹配度最高的location后,立即使用此location处理请求,而不再匹配
- 如果有url包含正则表达式,不需要有~开头标识
server {
listen 8080; # 监听的端口 server_name 192.168.1.1; # 配置访问域名 root /data/root; # 站点根目录 error_page 502 404 /page/404.html; # 错误页面 location ^~ /api/ { # 使用 /api/ 代理 proxy_pass 的值 proxy_pass http://192.168.20.1:8080; # 被代理的应用服务器 HTTP 地址
}
}
Docker中使用nginx
1. 下载最新的nginx的docker image
$ docker pull nginx:latest
2. 启动nginx容器
docker run -d --name nginx -p 80:80 -v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /docker/nginx/log:/var/log/nginx -v /docker/nginx/html:/usr/share/nginx/html -v /docker/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf nginx
思考:Nginx如何做到高并发下的高效处理?
Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。