最近浏览各种大神的网站,发现一个非常有趣的观点,国内的大神普遍喜欢深挖源码,然后长篇大论,国外的大神虽然也会这样,不乏一些大神喜欢总结,哈哈。
闲着无事,尝试做一个 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.1
和 TLSv1.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
,否则你会发现参数丢了
目前尚无回复