就是皮一下,靠这些去恰运维的饭,被打你也不能顺着网线找我啊!!!
前言: 作为一名程序员,基础的Nginx还是需要会一些,无论是项目部署,还是性能优化,Nginx总能在你需要的时候给你帮上忙,本文我们就搞一下常用的基础配置,本文主要以怎么用为主,不会涉及太多为什么这么用。
安装
基本配置(前端项目部署:单页面应用)
server {
listen 80;
server_name notes.jindll.com; # 这里是你的域名
location / {
root /notes; # 你的项目路径或者说要给客户端返回的资源在那个路径下 “/notes”表示根目录下notes文件夹下
index index.html; # 网站的默认初始页,用户直接访问域名无路径返回那个页面,及用户访问 http://notes.jindll.com 给用户返回那个文件
try_files $uri $uri/ /index.html; # 单文件应用必须有此配置
}
}
复制代码
详细说明
- listen: 监听的端口,浏览器通过域名进入的,要监听的端口都是80,https是443端口
- server_name: 服务别名,浏览器通过域名请求,服务器收到域名和server_name进行匹配,匹配到就往下走,匹配不到(那就看看浏览器什么反应)
- location: 匹配域名后面的路径,
/
表示匹配根路径 - root: 根路径配置,例如用户访问
http://notes.jindll.com/assets/css
,服务器就会到/notes/assets/css
这个位置找资源返回 - index: 网站的默认初始页,例如用户访问
http://notes.jindll.com
没有路径,就会默认返回/notes/index.html
资源 - try_files: 当用户访问
http://notes.jindll.com/abc
时,这里的$uri
就是/abc
。 try_files 会到服务器里(/notes/abc
)找这个文件。如果存在就直接把这个文件的内容发送给用户。 如果不存在然后就看$uri/
,增加了一个/
,也就是看有没有名为/notes/abc/
的目录。 如果还不存在就看下一个选项,将/notes/index.html
返回
同域名不同路径指向不同项目
server {
listen 80;
server_name notes.jindll.com; # 这里是你的域名
location / {
root /notes; # 你的项目路径或者说要给客户端返回的资源在那个路径下 “/notes”表示根目录下notes文件夹下
index index.html; # 网站的默认初始页,用户直接访问域名无路径返回那个页面,及用户访问 http://notes.jindll.com 给用户返回那个文件
try_files $uri $uri/ /index.html; # 单文件应用必须有此配置
}
location /dev {
root /docs;
index index.html;
}
}
复制代码
详细说明
相比于上面的代码我们加了一个location
块,即表明当服务器收到 http://notes.jindll.com/dev
访问时会走/dev
块,然后从/docs/dev
去查找资源返回
https配置
server {
listen 443 ssl;
server_name notes.jindll.com; # 这里是你的域名
#证书文件名称
ssl_certificate /ssl/notes/3048277_notes.jindll.com.pem;
#私钥文件名称
ssl_certificate_key /ssl/notes/3048277_notes.jindll.com.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /notes; # 你的项目路径或者说要给客户端返回的资源在那个路径下 “/notes”表示根目录下notes文件夹下
index index.html; # 网站的默认初始页,用户直接访问域名无路径返回那个页面,及用户访问http://notes.jindll.com 给用户返回那个文件
try_files $uri $uri/ /index.html; # 单文件应用必须有此配置
}
location /dev {
root /docs;
index index.html;
}
}
复制代码
详细说明
https的配置其实是最简单的,无论是你在腾讯云还是阿里云申请的https证书,他们都有详细的https配置说明。
在上面的代码中主要加了ssl
开头的配置属性,另外监听的端口由80变为了443,因为https访问的端口就是443,我们需要改的就是证书文件和私约文件的位置,这两个文件在你证书申请成功之后,将相关文件下载下来就可以了。
socket配置
server {
listen 443 ssl;
server_name notes.jindll.com; # 这里是你的域名
#证书文件名称
ssl_certificate /ssl/notes/3048277_notes.jindll.com.pem;
#私钥文件名称
ssl_certificate_key /ssl/notes/3048277_notes.jindll.com.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass_header Server;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X_Forward_For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_pass http://127.0.0.1:3939; # 配置转发;将https://notes.jindll.com转发到本机http://127.0.0.1:3939
}
}
复制代码
详细说明
websocket
的所有配置都在在location
块中(除proxy_pass),如果你需要配置websocket
可以直接将以上代码复制过去。核心代码其实是proxy_set_header Upgrade $http_upgrade;
和proxy_set_header Connection 'upgrade';
,这两行的作用就是将http
协议升级为websocket
协议。
协商缓存
server {
listen 80;
server_name notes.jindll.com; # 这里是你的域名
location / {
root /notes; # 你的项目路径或者说要给客户端返回的资源在那个路径下 “/notes”表示根目录下notes文件夹下
index index.html; # 网站的默认初始页,用户直接访问域名无路径返回那个页面,及用户访问 http://notes.jindll.com 给用户返回那个文件
try_files $uri $uri/ /index.html; # 单文件应用必须有此配置
}
location /dev {
root /docs;
index index.html;
add_header Cache-Control no-cache;
}
}
复制代码
详细说明
协商缓存是一个与前端性能优化有关的东西,当用户在浏览器输入地址后,服务器需要将对应文件返回给浏览器,这是需要时间的。
如果用户第一次在浏览器输入一个地址后,服务器将文件返回给浏览器,此时浏览器将文件缓存起来,下次用户再进这个地址,浏览器直接从缓存中取对应文件,那速度就比请求服务器快,这是强缓存。
强缓存的缺点就是服务器文件更新,但浏览器并不会及时更新,而是继续读本地缓存,当然可以设置缓存时间,但终究不是非常及时的。
协商缓存就是地址输入后,浏览器将上次缓存文件的MD5
和文件更新时间发给服务器,服务器来确认这个文件有没有更新,有更新,服务器就去找文件,返回给浏览器,没更新就返回302状态码,浏览器直接读缓存。
低版本的nginx
配置协商缓存还需要做其他配置,如果你是根据我的nginx
安装教程来的,那就只需要在location
块中再添加一行add_header Cache-Control no-cache;
就可以。
另外,协商缓存或者强缓存其实更多的是针对静态资源文件,例如图片、音频、字体等,这些资源不会经常改变,所以采用缓存,让浏览器直接读本地缓存会有非常明显的性能提升。
启用GZIP压缩
server {
listen 80;
server_name notes.jindll.com; # 这里是你的域名
location / {
root /notes; # 你的项目路径或者说要给客户端返回的资源在那个路径下 “/notes”表示根目录下notes文件夹下
index index.html; # 网站的默认初始页,用户直接访问域名无路径返回那个页面,及用户访问 http://notes.jindll.com 给用户返回那个文件
try_files $uri $uri/ /index.html; # 单文件应用必须有此配置
}
location /dev {
root /docs;
index index.html;
add_header Cache-Control no-cache;
# 以下代码是开启GZip的
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 4;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
gzip_disable "MSIE [1-6]\.";
}
}
复制代码
详细说明
-
gzip on;
开启GZip压缩 -
gzip_min_length 1k;
小于1k的文件不进行压缩 -
gzip_buffers 4 16k;
4 16k 代表以16k为单位,按照原始数据大小以16k为单位的4倍申请内存; 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。 -
gzip_comp_level 4;
压缩级别 1-9; 1 压缩比最小处理速度最快,9 压缩比最大但处理最慢 -
gzip_types
对那些类型进行压缩; 我这里只压缩了 JS CSS XML , 如果没有 XML 类型文件,完全可以去掉text/xml
; 我这里压缩类型没有写 HTML ,是因为无论是否指定"text/html"类型总是会被压缩; 另外不建议对图片,音乐等资源压缩,因为压缩效果不明显,并且对这些类型文件进行压缩,会消耗服务器大量资源, 得不偿失。 -
gzip_disable "MSIE [1-6]\.";
对IE6以下的浏览器不进行压缩,IE6不支持,会乱码;(现在还用IE6的也是神仙) -
更多的关于GZip的介绍,可以看这个中文文档,地址:www.nginx.cn/doc/standar…
开启GZip与未开速度对比
未开启
开启后