我已经从 LAMP 堆栈迁移到 nodejs + nginx,并且对在不同的端口上运行不同的应用程序感到惊讶。目前我的 nginx 包含:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /srv/www/html;
index index.php index.html index.htm;
server_name domain.com www.domain.com;
rewrite ^/(.*) https://nulll.me/$1 permanent;
}
server {
listen 443;
server_name domain.com www.domain.com;
root /srv/www/html;
index index.html index.htm;
ssl on;
ssl_certificate /home/---------------.crt;
ssl_certificate_key /home/--------------.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
location / {
try_files $uri $uri/ =404;
}
location /app1 {
proxy_pass http://SERVER_IP_ADDR:8888;
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 /app2 {
proxy_pass http://SERVER_IP_ADDR:5555;
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;
}
}
现在,从这个 conf 中,我想要引入已经在运行的不同应用程序,没有不同的端口,例如 8888、5555 等,我正在通过 来实现proxy_pass http://SERVER_IP_ADDR:8888;
。我有一些应用程序需要通过将它们绑定到本地主机端口来进行内部通信eg. 127.0.0.1:6666
,我不希望它们在我的计算机之外可用。
所以我的问题是,Nginx 是否会在端口 80 / 或 SSL 端口上获取请求并将该请求路由到我已代理传递的 /app1 或 /app2 并返回响应,同时保护这些端口?或者任何人都可以访问我已绑定到 localhost:someport 的那些端口吗?或者,如果它们是可见的,我该如何保护它们,以便即使访问这些端口(http://我的 IP 地址:8070)nginx或者什么东西阻止了它们,只有在路由请求的时候才能被nginx访问。
我很困惑,因为我必须指定:proxy_pass http://SERVER_IP_ADDR:8888;
我的机器的 IP 地址。我不能这样做吗proxy_pass http://127.0.0.1:8888;
,因为 nginx 可以立即在 localhost 上监听这些应用程序,而它们位于同一台机器上?
TLDR;我想要的是阻止其他人直接访问我机器上的不同端口,并且只有机器进程才能与这些端口通信。因此,nginx 应该在普通 http/s 端口上获取请求,并将其转发到在 8888 端口上运行的其他节点应用程序并返回请求。但人们不应该能够像这样访问:http://我的服务器IP:8080/。 谢谢
编辑:如果有什么方法可以让我配置 Nginx 来监听除 80/443 之外的所有端口,并单独监听 80/443,这样所有其他端口对外部来说都是不可见的,但可以通过进程进行通信和连接,那么也可以这样做。
答案1
- 将您的服务绑定到环回地址。这样,就没有人能够从计算机外部访问它们。
- 使用防火墙阻止所有不应该从外部看到的端口的传入连接
- 不要尝试让 nginx 监听所有端口。这样会给你带来更多麻烦。
坚持所有这三点将会获得最佳结果。