前言
为什么要懂nginx?
- 首先,提高自己的服务器部署能力
- 其次,有助于理解后端接口链路
ngix能干什么?
- 解决跨域问题
- 负载均衡
- 静态服务器
- 多/单页面网站
- gzip
正文
安装 & 常见命令 & nginx配置文件结构
安装(以ubuntu 为例):
$ sudo apt-get install nginx
更多:安装NGINX
查看版本:
$ sudo nginx -v
# 出现版本信息表示安装成功
nginx version: nginx/1.6.2
常见命令
启动服务:
$ nginx
其他命令:
$ nginx -s <SIGNAL>
SIGNAL:
- quit – 正常关闭服务
- reload – 重新加载配置文件运行
- reopen – 打开日志文件
- stop – 立刻关闭服务
配置文件
文件结构
nginx的主配置文件是nginx.conf。 可以在主配置文件中去include 其他位置的配置文件。
通过上述方式安装的来看:
- 默认配置文件路径
/etc/nginx/nginx.conf
- 这个文件里可能会有引用,比如
include /etc/nginx/conf.d/*.conf;
那么实际上你的项目配置文件就是在/etc/nginx/conf.d/这个文件夹下的所有.conf文件; - 一般一个项目(域名)配一个文件,比如你的域名是www.baidu.com,那么你的配置文件就可以叫
/etc/nginx/conf.d/www.baidu.com.conf
-
配置说明
- main:nginx的全局配置,对全局生效。
- events:配置影响nginx服务器或与用户的网络连接。
- http:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
- mail: 邮箱服务配置
- stream:TCP 和 UDP 配置
- server:配置虚拟主机的相关参数,一个http中可以有多个server。
- location:配置请求的路由,以及各种页面的处理情况。
- upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
解决跨域
如果fe.server.com 访问 be.server.com的接口存在跨域,则可以:
http{
server {
server_name fe.server.com;
listen 80;
location /api {
proxy_pass fe.server.com/api;
}
}
}
Http负载均衡
负载均衡策略: https://zhuanlan.zhihu.com/p/...
- 轮询(默认):时间顺序逐一分配到不同的后端服务器
- 指定权重:weight和访问比率成正比
- fair: 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
- IP Hash: 按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器
- Url Hash: 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
配置upstream:
http{
upstream balanceServer {
server 10.1.22.33:12345;
server 10.1.22.34:12345;
server 10.1.22.35:12345;
}
}
配置server:
http{
server {
server_name fe.server.com;
listen 80;
location /api {
proxy_pass http://balanceServer;
}
}
}
更多:
静态服务器
/data/static/
提供目录浏览:
server{
listen 80 default_server;
server_name www.example.com;
location ^~ /static {
root /data/static/; # 设置访问服务器下的文件目录
autoindex on; # 开启目录浏览
access_log off; # 关闭访问日志
charset utf-8,gbk; #防止中文目录出现乱码
expires 10h;# 设置过期时间为10小时
}
}
主要使用 autoindex on;
开启目录浏览
查看更多:nginx 开启目录浏览功能及主题美化
单页面网站
server {
server_name fe.server.com;
listen 80;
location / {
root /data/www;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
- root:服务器要返回的文件/目录地址
- index:如果路径是'/'结束,按照index 指定的顺序索引 root 目录下的文件
- try_files: 对 root 的解析顺序,先是作为文件,然后作为文件夹,如果都不存在则返回
/index.html
文件
location url匹配规则
location [=|~|~*|^~|@] /uri/ {
...
}
- = : 表示精确匹配后面的url
- ~ : 表示正则匹配,但是区分大小写
- ~* : 正则匹配,不区分大小写
- ^~ : 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
- @ : "@" 定义一个命名的 location,使用在内部定向时,例如 error_page
上述匹配规则的优先匹配顺序:
=
前缀的指令严格匹配这个查询。如果找到,停止搜索;^~
前缀的指令严格匹配这个查询。如果找到,搜索停止;- 正则表达式,与在配置文件中定义的顺序有关,取第一个匹配到的内容;
- 所有剩下的常规字符串,最长的匹配。
更多:url匹配规则
多页面网站
server {
server_name fe.server.com;
listen 80;
location ^~ /app {
root /data/www/app;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location ^~ /pc {
root /data/www/pc;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location ^~ /api {
# 指向 端口8080的 api 服务
proxy_pass: https://fe.server.com:8080/api
}
location / {
root /data/www/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
注意事项:
- location / 要写在最后,作为兜底的选项
- root 要写在每个location 里面
- api 应用到本地其他端口,亲测使用负载均衡( server IP + port)可用【2022.01.27新增】
Gzip
gzip on;
gzip_http_version 1.1;
gzip_comp_level 5;
gzip_min_length 1000;
gzip_types text/csv text/xml text/css text/plain text/javascript application/javascript application/x-javascript application/json application/xml;
- gzip: 决定是否开启gzip模块,on表示开启,off表示关闭;
- gzip_http_version: 识别http协议的版本,早起浏览器可能不支持gzip自解压,用户会看到乱码
- gzip_comp_level: 设置gzip压缩等级,等级越底压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大;等级1-9,最小的压缩最快 但是消耗cpu
- gzip_min_length: 设置允许压缩的页面最小字节(从header头的Content-Length中获取) ,当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩。建议大于1k
- gzip_types: 设置需要压缩的MIME类型,非设置值不进行压缩,即匹配压缩类型
部署https
https://cloud.tencent.com/doc...
https 在443端口
需要1.ssl_certificate: crt证书文件;2.ssl_certificate_key: key 私钥文件。放在nginx 文件夹下
在 conf.d 文件夹下新建一个ssl.conf 文件
# 以部署 cloud.tencent.com 为例子
# 证书: 1_cloud.tencent.com_bundle.crt
# 私钥: 2_cloud.tencent.com.key
server {
#SSL 访问端口号为 443
listen 443 ssl;
#填写绑定证书的域名
server_name cloud.tencent.com;
#证书文件名称
ssl_certificate 1_cloud.tencent.com_bundle.crt;
#私钥文件名称
ssl_certificate_key 2_cloud.tencent.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 / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
#例如,您的网站运行目录在/etc/www下,则填写/etc/www。
root html;
# 此处不用修改
index index.html index.htm;
}
}
http 重定向到 https
http在80端口
http:// cloud.tencent.com -> https:cloud.tencent.com
server {
listen 80;
#填写绑定证书的域名
server_name cloud.tencent.com;
#把http的域名请求转成https
return 301 https://$host$request_uri;
}
- nginx 内置变量
$host: 域名
$request_uri: 完整url中刨去最前面$host剩下的部分 - 301 跳转
开启 http2
更多信息可以参考:怎样把网站升级到http/2
要求:
- nginx的最低版本是1.10.0
- openssl的最低版本是1.0.2
修改nginx配置,原本https的listen为:
listen 443 ssl;
现在在后面加上http2:
listen 443 ssl http2;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。