在这种特殊情况下,我可以使用 nginx 作为反向代理吗?

Can I use nginx as reverse proxy in this particular case?

我想知道是否可以使用 Nginx 作为反向代理来服务多个托管在不同 Raspberry Pi 中的 Web 应用程序。

从图中可以看出,Raspberries 将全部连接到一个非托管交换机,这是我打算安装 nginx 的第一个交换机,因此它可以根据从互联网请求的网站作为反向代理。例如:www.site1.com、www.site2.www 等

这可能吗? 我能否从连接到调制解调器而不是交换机的计算机访问这些 RPis?

注意:调制解调器为wifi调制解调器,交换机为非托管有线交换机。

对于我拙劣的绘画技巧深表歉意,感谢您的帮助。在购买所有这些东西之前,我需要知道这个想法是否可行。

我觉得可以,但是有一些要求:

  • 分配给调制解调器的静态外部IP;

  • RPi 上的静态 IP;

  • 正确的调制解调器转发规则。

我的意思是,您需要像下面这样转发所有请求:

调制解调器:80 -> rp0:80

调制解调器:443 -> rp0:443

rp0 端口可能不同于 80 和 443,因此,请设置正确的规则并在 nginx 配置中注明。

之后设置上游或在网站配置中使用 rp1-3 的 IP:

upstream rp1 {
    server 192.168.1.11:port;
}
upstream rp2 {
    server 192.168.1.12:port;
}
upstream rp3 {
    server 192.168.1.13:port;
}

端口替换为在适当的树莓派上监听的端口。 网站配置如下:

server {
server_name site1.com www.site1.com ;
location / { proxy_pass http://rp1 ; }
}
server {
server_name site2.com www.site2.com ;
location / { proxy_pass http://rp2 ; }
}

添加您需要的任何参数。 此外,如果您要托管一些静态网站,最好的方法是将它们也放在 rp0 上。

编辑 1 工作配置示例:

server {
listen 80;
server_name site1.com www.site1.com ;
location / { rewrite ^ https://$host$request_uri permanent;}
}

server {
listen              443 ssl;
server_name         site1.com www.site1.com;

ssl_certificate     /etc/letsencrypt/live/site1/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site1/key.pem;
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         HIGH:!aNULL:!MD5;
location / {
    proxy_pass              http://rp1;
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-for $remote_addr;
    port_in_redirect        off;
    proxy_redirect          http://rp1/ /;
}

请注意,如果您要使用 Letsencrypt,最好的方法是在 rp0 上设置 certbot(或其他)。自动更新证书会更容易。另外,使用 /etc/letsencrypt/live/site1/fullchain.pem 。 为了使用多个 SSL 域,请确保安装 nginx 支持 SNI:

# nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled

这是头节点一侧的 nginx conf:

server {
  listen 80;
  server_name www.codingindfw.com codingindfw.com;
  location / { rewrite ^ https://$host$request_uri permanent;}
}

server{
  listen 443 ssl;
  server_name www.codingindfw.www codingindfw.com;

  client_max_body_size 4G;

  ssl_certificate /etc/letsencrypt/live/www.koohack.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/www.koohack.com/privkey.pem;

  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  location / {
    proxy_pass              http://192.168.0.8;
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-for $remote_addr;
    port_in_redirect        off;
    proxy_redirect          http://192.168.0.8/ /;
    }
}

这是客户端上的 nginx conf 文件 运行 实际的 Django 应用程序:

server {
    listen 80 default_server;
    server_name www.codingindfw.com;

    client_max_body_size 4G;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
        root /home/pi/coding-in-dfw;
    }

    location /media/ {
        root  /home/pi/coding-in-dfw;
    }

    location / {
            include proxy_params;
            proxy_pass http://unix:/home/pi/coding-in-dfw/mysocket.sock;
    }
}