Nginx 快速指南(Nginx Cheatsheet)

yufei       3 年, 7 月 前       672

最近浏览各种大神的网站,发现一个非常有趣的观点,国内的大神普遍喜欢深挖源码,然后长篇大论,国外的大神虽然也会这样,不乏一些大神喜欢总结,哈哈。

闲着无事,尝试做一个 Nginx 的快速指南。

监听端口 ( listen port)

server {
  # HTTP 标准协议端口号
  listen 80;

  # HTTPS 标准协议端口号
  listen 443 ssl;

  # http2 协议端口号
  listen 443 ssl http2;

  # 同时兼容 IP4 和 IP6 的 HTTP 标准协议端口号
  listen [::]:80;

  # 只使用 IP6 的 HTTP 标准协议端口号
  listen [::]:80 ipv6only=on;
}

记录访问日志 ( access log)

server {
  # 使用相对路径或者绝对路径
  # 注意,如果是相对路径,那么是相对 nginx.conf 的路径
  access_log /path/to/file.log;

  # 打开或关闭 nginx 日志,值为 `on` 或 `off`
  # 如果是 off 则关闭访问日志功能
  # 如果是 on 则表示打开日志,同时记录日志的文件路径为上一级的 `access_log` 的值
  access_log on;
}

域名

server {
  # 监听 yourdomain.com 域名
  server_name yourdomain.com;

  # 同时监听多个域名,比如 yourdomain.com www.yourdomain.com;
  # 需要注意的是,对于 nginx 来说顺序虽然不重要,但是后端收到的 server 值是第一个,所以顺序也是重要的
  server_name yourdomain.com www.yourdomain.com;

  # 监听某个域名下的泛域名
  # 也就是说 所有 yourdomain.com 二级三级域名都能监听
  # 大家猜猜,包不包括 yourdomain.com 本身呢?
  server_name *.yourdomain.com;

  # 监听所有域名中包含包含 `yourdomain` 的域名
  server_name yourdomain.*;

  # 如果要监听 IP 地址怎么办呢?
  # 就是下面这样的。
  # 这个就是只监听 IP 地址过来的
  server_name "";

  # 监听所有域名,所有 IP 地址
  # 常用来指定除我们指定的域名之外要怎么做
  server_name _;

}

特定的路径访问指定的目录

server {
  listen 80;
  root /path/to/website;
  server_name yourdomain.com;

  location / {
       # 这里不指定 root 所以使用 `server` 级别的 root,也就是 `/path/to/website`   
  }

  location /other {
      # 因为单独指定了 `root`,那么对 `/other` 开头的访问的根目录从 /path/to/other 开始
      root /path/to/other;
  }
}

301 永久重定向

如果是域名级别的重定向,比如 www 域名重定向到非 www 域名,则如下

server {
  listen 80;
  server_name www.yourdomain.com;
  return 301 http://yourdomain.com$request_uri;
}

是的,$request_uri 就可以了,不需要其他参数了

当然了,也可以目录级别的重定向

server {
  listen 80;
  server_name www.yourdomain.com;

  location /redirect-url {
     return 301 http://otherdomain.com$request_uri;
  }
}

反向代理

server {
  listen 80;
  server_name yourdomain.com;

  location / {
     # 0.0.0.0:3000 一般是你的应用程序后台的地址,比如使用 Node.js
     proxy_pass http://0.0.0.0:3000;
  }
}

反向代理最重要的是 proxy_pass 恩,还有其它参数,自己添加吧

负载均衡

upstream node_js {
  server 0.0.0.0:3000;
  server 0.0.0.0:4000;
  server 123.131.121.122;
}

server {
  listen 80;
  server_name yourdomain.com;

  location / {
     proxy_pass http://node_js;
  }
}

node_js 必须唯一,因为它是 server 级别的。注意注意

来个 ssl 的标配

server {
  listen 443 ssl;
  server_name yourdomain.com;

  ssl on;

  ssl_certificate /path/to/cert.pem;
  ssl_certificate_key /path/to/privatekey.pem;

  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_trusted_certificate /path/to/fullchain.pem;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_session_timeout 1h;
  ssl_session_cache shared:SSL:50m;
  add_header Strict-Transport-Security max-age=15768000;
}

需要注意的是:TLSv1.1TLSv1.2 两个参数 (1.1.13, 1.0.12) 需要 OpenSSL 的版本大于等于 1.0.1

TLSv1.3 参数 (1.13.0) 则需要 OpenSSL 的版本大于 1.1.1

简单来说,先填上,然后 nginx -t 一下,哪个不支持就删哪个

最后,来个 http 301 跳转到 https 的吧

server {
  listen 80;
  server_name yourdomain.com;
  return 301 https://$host$request_uri;
}

是的,千万别丢 $request_uri ,否则你会发现参数丢了

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.