【问题标题】:Can I use nginx as reverse proxy in this particular case?在这种特殊情况下,我可以使用 nginx 作为反向代理吗?
【发布时间】:2019-02-02 12:10:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: web-services nginx reverse-proxy raspberry-pi3 router


    【解决方案1】:

    我认为,这是可能的,但有一些要求:

    • 分配给调制解调器的静态外部 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;
    }
    

    port 替换为 port,该端口在适当的 RPi 上进行侦听。 网站配置如下:

    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
    

    【讨论】:

    • 谢谢,Artem,我会试一试,让你知道它是否有效,它们都是使用 Django 和 Uwsgi 的动态网站。另一个问题:我在哪里可以找到 ssl 证书?我将使用 Letsencrypt
    • 爱德华多,请检查编辑 1。我提供了配置示例。如果您想让网站在两个版本(HTTP 和 HTTPS)中都可用,请在 listen 80; 上创建相同的配置,而不使用 ssl 参数。
    • 谢谢,@Artem_Budaev 没有您的帮助,我无法做到,这就是为什么我选择您的答案作为解决方案。在使用您的建议后,这两个 nginx conf 文件是如何出现的,请参阅下面发布的答案,这对任何遇到同样问题的人都会很有用。
    【解决方案2】:

    这是头节点一侧的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/ /;
        }
    }
    

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

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 1970-01-01
      • 2016-09-12
      • 2016-11-07
      • 2022-08-05
      • 2018-05-05
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      相关资源
      最近更新 更多