注意:我之前在 StackOverflow 上问过这个问题,但没有得到任何答复。
是的,这个问题已经被问过多次了,是的,我已经尝试了所有的解决方案,不管是否接受。但仍然面临一个问题。
我可以访问网站https://example.in但 Nginx 没有重定向http://example.in到https://example.in
我在 docker 中运行 NGINX。
Nginx 配置
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.in www.example.in;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name example.in www.example.in;
ssl_certificate /etc/nginx/certs/example.in.crt;
ssl_certificate_key /etc/nginx/certs/example.in.key;
location /static {
alias /vol/web/;
}
location / {
uwsgi_pass ${APP_HOST}:${APP_PORT};
include /etc/nginx/uwsgi_params;
client_max_body_size 10M;
}
}
Nginx 的 Dockerfile 是
FROM nginx:1.21.3
LABEL maintainer="example.in"
COPY ./default.conf.tpl /etc/nginx/default.conf.tpl
COPY ./uwsgi_params /etc/nginx/uwsgi_params
COPY ./data/certs/example.in.crt /etc/nginx/certs/
COPY ./data/certs/example.in.key /etc/nginx/certs/
COPY ./run.sh /run.sh
ENV LISTEN_PORT=8000
ENV APP_HOST=app
ENV APP_PORT=9000
RUN mkdir -p /vol/static && \
chmod 755 /vol/static && \
touch /etc/nginx/conf.d/default.conf && \
chown nginx:nginx /etc/nginx/conf.d/default.conf && \
chmod +x /run.sh && \
chmod +r /etc/nginx/certs/example.in.crt && \
chmod +r /etc/nginx/certs/example.in.key
VOLUME /vol/static
CMD ["/run.sh"]
docker-compose.yml
version: '3.9'
services:
app:
build:
context: .
restart: always
volumes:
- static-data:/vol/web
environment:
- ... (some environment variables)
proxy:
build:
context: ./proxy
restart: always
depends_on:
- app
ports:
- "80:8000"
- "443:443"
volumes:
- static-data:/vol/web
- ./data/certs:/etc/nginx/certs
volumes:
static-data:
这里提到的应用程序是一个通过 Nginx 提供静态文件的 Django Web 应用程序。
在此之前我从未使用过 Nginx。
一些可能对调试有用的信息 -
docker container logs <nginx-container-id>
不要显示任何尝试访问 http 的日志。- 用linux防火墙检查,80端口可以访问。
PS:几天前,我遇到了另一个与此完全相反的 Nginx 配置问题。如果你需要参考,请参阅这个问题。尽管我自己能够找到解决方案并将其分享在那里。
答案1
您正在将 docker-compose.yml 中的端口 80 映射到端口 8000。您的请求永远不会到达 nginx。
ports:
- "80:80"
- "443:443"