如何配置 Nginx 反向代理

Posted on Wed, 25 Dec 2024 16:15:23 +0800 by LiangMingJian


概述

Nginx (engine x) 是一个高性能的 HTTP 和反向代理 Web 服务器,同时支持 IMAP/POP3/SMTP 服务。

Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,其源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。

Nginx 占有内存少,并发能力强,能经受高负载的考验。有报告表明能支持高达 50,000 个并发连接数。同时 Nginx 支持热部署,启动简单,可以做到 7 * 24 不间断运行。

Nginx 的配置文件

Nginx 的配置文件分为全局,Event,Http,Server 和 Location 这几个模块。

全局块

该部分配置 Nginx 全局内容,包括下面几个部分:

  • 配置运行 Nginx 服务器用户(组)
  • worker process 数
  • Nginx 进程 PID 存放路径
  • 错误日志的存放路径
  • 外部配置文件的引入
user user [group];
# 指定运行 Nginx 的用户,如果不配置或配置为 user nobody nobody;,则默认所有用户都可以启动 Nginx 进程
worker_processes number;
# Nginx 最多可以产生的 worker process 数,配置为 auto,Nginx 进程将自动检测
error_log file;
# 日志输出到某个文件,配置为 stderr,日志输出到标准错误输出
error_log logs/error.log; 
# 将日志输出到 logs/error.log
pid file;
# 指定 pid 的存放路径和文件名称,不指定,则置于路径 logs/nginx.pid
#--------------------------------------------------------------
include file;
# 该指令主要用于将其他的 Nginx 配置或者第三方模块的配置引用到当前的主配置文件中
accept_mutex on;
# 默认为 on 状态,表示会对多个 Nginx 进程接收连接进行序列化,防止多个进程对连接的争抢
multi_accept off;
# 默认为 off 状态, 意指每个 worker process 一次只能接收一个新到达的网络连接。若想让每个 Nginx 的 worker process 都有能力同时接收多个网络连接, 则需要开启此配置

Events 块

该部分配置 Nginx 服务器与用户的网络连接事件,包括:

  • 设置网络连接的序列化
  • 是否允许同时接收多个网络连接
  • 事件驱动模型的选择
  • 最大连接数的配置
use model;
# 事件驱动模型的选择,可选择项包括:select、poll、kqueue、epoll、rtsig
worker_connections number;
# 最大连接数的配置, number 默认值为 512, 表示允许每一个 worker process 可以同时开启的最大连接数

Http 块

这部分是负责网页相关的配置,包括:

  • 定义 MIMI-Type
  • 自定义服务日志
  • 允许 sendfile 方式传输文件
  • 连接超时时间
  • 单连接请求数上限
include mime.types;
default_type mime-type;
# 定义网络资源的媒体类型,即前端支持请求的资源类型
# mime.types 是一个 types 结构文件,里面包含了各种浏览器能够识别的 MIME 类型以及对应类型的文件后缀名字
access_log path [format];
# path:自定义服务日志的路径 + 名称
# format:可选项,自定义服务日志的字符串格式,其也可以使用 log_format 定义的格式
sendfile on;
sendfile_max_chunk size;
# 前者用于开启或关闭使用 sendfile() 传输文件,默认 off
# 后者指令若 size>0,则 Nginx 进程的每个 worker process 每次调用 sendfile() 传输的数据了最大不能超出此值;若 size=0 则表示不限制。默认值为 0
keepalive_timeout timeout [header_timeout];
# 连接超时时间配置,timeout 表示 server 端对连接的保持时间,默认75秒
# header_timeout 为可选项,表示在应答报文头部的 Keep-Alive 域设置超时时间:"Keep-Alive : timeout = header_timeout"
keepalive_requests number;
# 单连接请求数上限, 用于限制用户通过某一个连接向Nginx服务器发起请求的次数

Server 块

这部分是负责服务器相关的配置,包括:

  • 配置网络监听
  • 基于名称的虚拟主机配置
  • 基于IP的虚拟主机配置
listen IP[:PORT];
listen PORT;                  # 配置监听的IP地址或配置监听的端口
listen 192.168.31.177:8080;   # 监听具体IP和具体端口上的连接
listen 192.168.31.177;        # 监听IP上所有端口上的连接
listen 8080;                  # 监听具体端口上的所有IP的连接

Location 块

本地文件配置,包括

  • 请求根目录配置
  • 更改 location 的 URI
  • 网站默认首页配置
location [ = | ~ | ~* | ^~ ] uri {...};
# 这里的 uri 分为标准 uri 和正则 uri
# "=":用于标准 uri 前,要求请求字符串与 uri 严格匹配,一旦匹配成功则停止
# "~":用于正则 uri 前,并且区分大小写
# "~*":用于正则 uri 前,但不区分大小写
# "^~":用于标准 uri 前,要求 Nginx 找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配
# 示例:location = /404.html{...};
root path;
# Nginx 接收到请求以后查找资源的根目录路径
index file;
# 设置网站的默认首页
# file:可以包含多个用空格隔开的文件名,首先找到哪个页面,就使用哪个页面响应请求

如何配置 SSL 与 HTTPS

# Nginx 配置 SSL 并把 Http 跳转到 Https,需修改 Nginx.conf 配置文件如下
server {

  listen 80;
  server_name www.example.com;
  return 301 https://www.example.com$request_uri;

  # 把 http 重定向到 https 使用了nginx 的重定向命令
  # return 301 https://www.example.com$request_uri;
}

server {

  listen 443;
  server_name www.example.com;
  root /data/release/weapp/uploadFiles;

  # 开启 ssl 功能
  ssl on;

  # 配置 ssl 证书,直接用 .pem 和 .key 文件的绝对路径
  ssl_certificate/data/release/nginx/ssl_file.pem;
  ssl_certificate_key/data/release/nginx/ssl_file.key;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE - RSA - AES128 - GCM - SHA256: ECDHE: ECDH: AES: HIGH: !NULL: !aNULL: !MD5: !ADH: !RC4;
  ssl_prefer_server_ciphers on;

  location / {

     proxy_pass http://app_weapp;
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection 'upgrade';
     proxy_set_header Host $host;
     proxy_cache_bypass $http_upgrade;

  }

  location /images/ {
    autoindex on;
  }

  # 配置 uri, ~ 用于正则 uri 前,其中 .(png|jpg) 为正则表达式
  # root 用于配置接收到请求以后查找资源的根目录路径

  location ~ \.(png|jpg) {
     root /data/release/weapp/uploadFiles;
  }

  error_page 404 /404.html;

  location = /40x.html {
  }

  error_page 500 502 503 504 /50x.html;

  location = /50x.html {
  }
}