前言

为什么要懂nginx?

  • 首先,提高自己的服务器部署能力
  • 其次,有助于理解后端接口链路

ngix能干什么?

  1. 解决跨域问题
  2. 负载均衡
  3. 静态服务器
  4. 多/单页面网站
  5. 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-
配置说明

image.png

  • 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

上述匹配规则的优先匹配顺序:

  1. = 前缀的指令严格匹配这个查询。如果找到,停止搜索
  2. ^~ 前缀的指令严格匹配这个查询。如果找到,搜索停止
  3. 正则表达式,与在配置文件中定义的顺序有关,取第一个匹配到的内容;
  4. 所有剩下的常规字符串,最长的匹配。

更多: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实现HTTP压缩,能改进传输速度和带宽利用率。

    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; 
}
  1. nginx 内置变量
    $host: 域名
    $request_uri: 完整url中刨去最前面$host剩下的部分
  2. 301 跳转

开启 http2

更多信息可以参考:怎样把网站升级到http/2
要求:

  • nginx的最低版本是1.10.0
  • openssl的最低版本是1.0.2

修改nginx配置,原本https的listen为:

listen 443 ssl;

现在在后面加上http2:

listen 443 ssl http2;

参考文章


specialcoder
2.2k 声望170 粉丝

前端 设计 摄影 文学