静态和动态资源
- 静态资源: 一般客户端发送请求到 web 服务器, web 服务器 从内存取到相应的文件,返回给客户端,客户端解析并渲染显示出来
- 动态资源: 客户端请求的动态资源,先将请求交于 web 容器, web 容器连接数据库,数据库处理数据之后,将内容交给 web 服务器, web 服务器返回给客户端解析渲染处理
nginx 做代理
- cd /usr/local/etc/nginx
- vi nginx.conf
http {
server {
listen 8081;
server_name localhost;
location / {
root html;
index index.html index.htm;
# 使用外面的 req_zone 来限定当前的请求
limit_req zone=req_zone;
limit_conn conn_zone 1;
}
# 如果访问的是以 api 开头的,则代理到 http://localhost:8000;
# 即如果访问了 http://localhost:8081/api/xxx
# 则回被代理到 http://localhost:8000 并将其返回的内容 返回给 api/xxx
location ~ ^/api {
proxy_pass http://localhost:8000;
}
}
}
- sudo brew services start/restart nginx [开启或重启nginx]
- 新建一个服务, 比如 app.js
const http = require("http");
http
.createServer((req, res) => {
res.writeHead(200, { "Content-Type": "application/json" });
res.end(
JSON.stringify({
data: "Hello World",
})
);
})
.listen(8000, () => {
console.log("node server running at: http://localhost:8000");
});
- node app.js 开启8000服务
- 访问 http://localhost:8081/api/user 将会得到 {data: "Hello World"} 字符化的内容,说明代理成功
tcp_nopush (适合下载)
在 sendfile 开启的情况下,合并多个数据包,提供网络包的传输效率
Syntax: tcp_nopush on/off;
Default: tcp_nopush off;
Context: http, server, location;
tcp_nodelay (适合实时性高的情况)
在 keepalive 连接下,提高网络包的传输实时性, 只要有数据包,就进行数据传输(不会进行多个数据包进行传输)
Syntax: tcp_nodelay on/off;
Default: tcp_nopush off;
Context: http, server, location;
gizp
压缩文件可以节约宽带和提高网络传输效率
Syntax: gzip on/off;
Default: gzip off;
Context: http, server, location;
gizp_comp_level
压缩比率高,文件被压缩的体积越小
Syntax: gzip_comp_level level; # level 是 number 类型
Default: gzip_comp_level 1;
Context: http, server, location;
gzip_static
先去找磁盘上同名的 .gz 文件,如果找到直接 返回给 请求者,节约 CPU 的压缩时间和性能损耗
简单demo
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
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;
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
#gzip on;
server {
listen 8081;
server_name localhost;
# ~ 表示精准匹配,如果是jpg,png,gif 类型的图片则不需要压缩,因为他们已经是高压缩过的,再压缩意义不大
location ~ .*.(jpg|png|gif) {
gzip off;
root html;
}
location ~ .*.(html|js|css) {
gzip on;
gzip_min_length 1k;
gzip_http_version 1.1; # 满足 http 版本的约束
gzip_comp_level 9;
gzip_types text/css application/javascript;
root html; # 静态服务根目录
}
location ~ ^/download {
gzip_static on; # 如果后端有压缩的文件则直接返回 压缩的文件,避免服务器再去将文件压缩后发给客户端
tcp_nopush on; # 延迟推送
root html;
}
location / {
root html;
index index.html index.htm;
# 使用外面的 req_zone 来限定当前的请求
limit_req zone=req_zone;
limit_conn conn_zone 1;
}
location ~ ^/admin.html {
deny 192.168.1.7;
allow all;
}
# 如果访问的是以 api 开头的,则代理到 http://localhost:8000; 服务
location ~ ^/api {
proxy_pass http://localhost:8000;
}
#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;
}
}
include servers/*;
}