一、背景知识
1、Nginx是什么?
&:Web服务器,静态文件保存、响应http请求。
同时可以提供代理、负载均衡的功能。
2、为什么使用?
&:主要是轻量级和高性能,在一般行业不明显,但在互联网行业极致性能压榨就凸显了。
另外,功能实用,玩的花样多,如负载均衡、代理等。
3、为什么Nginx性能这么高?
因为他的事件处理机制:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决
二、如何使用
1、参数配置
参数格式,块的形式,类似json但无冒号,注意结尾必须有分号。
参数类型:3类;
- 全局【nginx产品相关】、
- event块【网络】、
- http【功能】
以一个完整的配置为例。
Global: nginx 运行相关
Events: 与用户的网络连接相关
http
http Global: 代理,缓存,日志,以及第三方模块的配置
server
server Global: 虚拟主机相关
location: 地址定向,数据缓存,应答控制,以及第三方模块的配置
worker_processes 1; # worker进程的数量
events { # 事件区块开始
worker_connections 1024; # 每个worker进程支持的最大连接数
} # 事件区块结束
http { # HTTP区块开始
include mime.types; # Nginx支持的媒体类型库文件
default_type application/octet-stream; # 默认的媒体类型
sendfile on; # 开启高效传输模式
keepalive_timeout 65; # 连接超时
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; # 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
error_page 500502503504 /50x.html; # 出现对应的http状态码时,使用50x.html回应客户
location = /50x.html { # location区块开始,访问50x.html
root html; # 指定对应的站点目录为html
}
}
三、如何部署多个前端应用
有3种方式:端口区分、域名区分、url区分。
1、端口区分
关键:配置2个server,监听不同端口,root指向不同目录。
参考:
######通过端口区分应用 begin
server {
listen 9001;
server_name localhost;
location / {
root html;
index index.html index.htm abc.html;
if ( $request_method = OPTIONS ) { return 204; }
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 9002;
server_name localhost;
location / {
root html_kanban;
index index.html index.htm abc.html;
if ( $request_method = OPTIONS ) { return 204; }
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
######通过端口区分应用 end
2、域名区分
关键:配置2个server:端口相同,server_name不同,根据传入的http请求域名区分。
######通过域名区分应用 begin
server {
listen 80;
server_name aaa;
location / {
root html_ifis;
index index.html index.htm;
error_page 404 / ;
}
location /kanban/ {
alias D:/nginx-1.22.0/html_kanban;
index index.html index.htm;
error_page 404 / ;
}
}
server {
listen 80;
server_name bbb;
location / {
root html_kanban;
index index.html index.htm;
error_page 404 / ;
}
## 配置开发环境对应的proxy
location /api/ {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8095; #机器ip
expires 0;
}
}
######通过域名区分应用 end
3、url区分
没搞成。
总结:
- 参数server的配置是指虚拟的server;比如可以监听相同的端口。这点与后端的应用不同,后端如果监听相同端口,会报端口冲突。
- server.location参数:可以指定本地目录,做直接访问;也可以转发,也就是逆向代理。
- 逆向代理也是实现跨域的一种方式:老web中,直接暴露了后端,浏览器直接对后端请求,后端设置了允许跨域;新web中,webpack支持代理(部署时同样配置nginx的代理),前端访问的特定开头的url(/api)。
参考
Nginx面试题:https://www.nginx.org.cn/article/detail/451