有一台服务器,上面有nginx作为服务器。有一个docker在这台服务器上运行,并保持应用程序在内网,例如:http: //192.167.117.1 :8080 。
任务是使用 https 从主 nginx 代理到内部网络。
我这样解决了问题:
server {
server_name www.example.com;
rewrite ^(.*) https://example.com$1 permanent;
}
server {
server_name www.example.com;
rewrite ^(.*) https://example.com$1 permanent;
}
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
server {
server_name *.example.com example.com;
listen 443;
ssl on;
ssl_certificate /var/www/example.com/ssl/ssl-bundle.crt;
ssl_certificate_key /var/www/example.com/ssl/example.com.key;
# side note: only use TLS since SSLv2 and SSLv3 have had recent vulnerabilities
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 301 редирект со страниц со слешем на страницы без слеша в конце URL
rewrite ^/(.*)/$ /$1 permanent;
charset utf-8;
client_max_body_size 128M;
gzip on;
# Минимальная длина ответа, при которой модуль будет жать, в байтах
gzip_min_length 1000;
# Разрешить сжатие для всех проксированных запросов
gzip_proxied any;
# MIME-типы которые необходимо жать
gzip_disable "msie6";
# Compress all output labeled with one of the following MIME-types.
gzip_types
application/atom+xml
application/javascript
application/json
application/rss+xml
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/opentype
image/svg+xml
image/x-icon
text/xml
text/css
text/plain
text/javascript
text/x-component;
# Запрещает сжатие ответа методом gzip для IE6 (старый вариант gzip_di$
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
# Уровень gzip-компрессии
gzip_comp_level 6;
location / {
proxy_pass http://192.167.117.1:8080;
proxy_set_header Host 192.167.117.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_redirect off;
proxy_buffering off;
break;
}
location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|txt|rtf|css|js)$ {
expires max;
add_header Pragma public;
#add_header Cache-Control "public, must-revalidate, proxy-revalidate";
proxy_pass http://192.167.117.1:8080;
}
}
但是,docker 中的应用程序不理解它是通过 https 工作的,你能告诉我如何配置吗?
不是关于nginx,而是关于应用程序,需要说明的是它是在代理后面。您不能仅通过更改 nginx 配置来解决此问题。
也许应用程序本身需要为此完成。更改设置可能就足够了。例如,phpMyAdmin 有一个
PmaAbsoluteUri
指定绝对路径的选项,在这个路径中,在开头写上带有 https 的 URL 就足以让一切正常工作。如果您的应用程序运行在 Apache 下,那么只需两行即可解决问题。虚拟主机的 Apache 配置中的一个:
在 nginx 配置中有一个:
总的来说,我在应用程序级别找出问题并将尝试描述解决方案。
该应用程序是在 docker 上运行的 laravel 站点。运行在 https 上的主 nginx 服务器代理所有请求到运行在 http 上的 docker 的 nginx。因此,当我们进入应用程序本身时,它认为它可以在 http 上运行。
我们有几种选择来解决这个问题:
碰巧前两个选项不适合我,因为切换环境时会有额外的困难(以及从没有 https 的本地位置进行测试)。
因此,一切都是通过应用程序大致按照以下方式决定的:
AppServiceProvider.php