Nginx

nginx反向代理到mongodb rest介面

  • August 16, 2012

我正在嘗試使用代理 MongoDB 的 REST 介面的 HTTP 身份驗證設置反向代理。到目前為止,我有這個:

server {
       listen 80;
       server_name tld.example.com;
       charset utf-8;
       access_log /home/jill/logs/nginx.access.log main;

       # Redirect all HTTP traffic to HTTPS URL
       rewrite ^(.*) https://tld.example.com$1 permanent;
}

server {
       listen 443;
       server_name tld.example.com;

       ssl on;
       ssl_prefer_server_ciphers on;
       ssl_protocols           TLSv1 SSLv3;
       ssl_ciphers             HIGH:!ADH:!MD5:@STRENGTH;
       ssl_session_cache       shared:TLSSL:16m;
       ssl_session_timeout     10m;
       ssl_certificate /path/to/cert/tld.example.com.bundle.crt;
       ssl_certificate_key /path/to/cert/tld.example.com.key;

       gzip on;
       gzip_vary on;
       gzip_comp_level 6;

       keepalive_timeout 300;
       keepalive_requests 500;

       location / {
               proxy_pass https://127.0.0.1:28017;

               proxy_redirect     off;

               proxy_max_temp_file_size 0;

               proxy_connect_timeout      90;
               proxy_send_timeout         90;
               proxy_read_timeout         90;

               proxy_buffer_size          4k;
               proxy_buffers              4 32k;
               proxy_busy_buffers_size    64k;
               proxy_temp_file_write_size 64k;

               add_header Cache-Control no-cache;

       }

       auth_basic "Restricted area";
       auth_basic_user_file /path/to/password/file;
}

這不起作用(顯然),並導致網關超時。curl localhost:28017否則,我可以使用類似的方式從伺服器內部本地訪問 REST 介面。

我究竟做錯了什麼?

鑑於有效的事實curl localhost:28017,我假設 REST 介面使用 HTTP 而不是 HTTPS。

更改以下行

proxy_pass https://127.0.0.1:28017;

有了這個

proxy_pass http://127.0.0.1:28017;

要從 MongoDB 方面提供替代解決方案(如果您想端到端使用 HTTPS),您可以在 MongoDB 中啟用 SSL:

http://docs.mongodb.org/manual/administration/ssl/

您還可以在此處查看我之前關於將 SSL 與 MongoDB 結合使用的答案,了解更多詳細資訊:

https://serverfault.com/a/376598/108132

啟用 SSL 也會在 REST 介面上啟用它。只是為了確保我在預設埠上使用啟用 SSL 的建構對其進行了測試:

curl -I -k https://127.0.0.1:28017
HTTP/1.0 200 OK
Content-Type: text/html;charset=utf-8
Connection: close
Content-Length: 21343

-k 是必要的,因為我使用自簽名證書進行測試。

引用自:https://serverfault.com/questions/418212