Bootstrap 在 my_site.com:8000 上格式化渲染,而不是在 my_site.com 上渲染
Bootstrap Formatting Rendering on my_site.com:8000, not on my_site.com
我有一个利用 Flask、NginX、Gunicorn 和 MySQL 的个人网站。它运行得非常好,但是,我正在将它移植到一组 Docker 容器中(主要是为了学习 Docker)。
我目前面临一个我认为源于我的 NginX 配置的问题,因为我试图将流量转发到 my_site 到 my_site:8000 [下面的代码块 1]。
我的问题是:我终于让转发工作了,因为当我转到 my_site.com 时,它会呈现我的 HTML(大概是通过转发到 Gunicorn 的公开端口 8000)。但是,它不会使用 bootstrap4 格式对其进行格式化。但是,我的终端确实显示了 200 的响应,用于查找我的 main.css 文件。奇怪的是,当我转到 my_site:8000 时,它确实正确地格式化了我的页面!
你们中有人知道我搞错了什么吗?我已经仔细检查了我的端口公开、我的 docker 服务引用等,但在我认为 proxy_pass 成功实施之后无法弄清楚指定端口 8000 的区别是什么我的 NginX 配置中的端口 8000。
我的docker-compose.yml文件内容如下代码块2
NginX 容器来自 Docker hub
上的官方 NginX 镜像
MySQL 容器来自 Docker hub
上的官方 MariaDB 镜像
其他容器基于 Ubuntu 18.10 映像构建。我只是在这些上下载了Python、nano、requirements.txt等
块 1 -- conf.d NginX 文件
events { }
http {
upstream upstream-web {
server jonathanolson.us;
}
server {
listen 80;
server_name gunicornservice;
location /static {
alias /NHL-Project/flasksite/static;
}
location / {
proxy_pass http://gunicornservice:8000;
# include /etc/nginx/proxy_params;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
}
区块 2 -- docker-compose.yml
version: '3.7'
networks:
default:
external:
name: nhlflasknetwork
services:
db:
restart: always
image: jonathanguy/mymariadb
ports:
- "3306:3306"
volumes:
- type: bind
source: /home/jonathan/NHL-Project
target: /NHL-Project
- type: volume
source: mynhldb
target: /var/lib/mysql
- type: volume
source: myConfig
target: /etc/mySecrets # Here, we will have the file /etc/mySecrets/config.py
environment:
- MYSQL_USER_FILE=/etc/mySecrets/mysql_user_file
- MYSQL_PASSWORD_FILE=/etc/mySecrets/mysql_user_password_file
web:
restart: always
image: jonathanguy/myflask
ports:
- "5000:5000"
volumes:
- type: bind
source: /home/jonathan/NHL-Project
target: /NHL-Project
- type: volume
source: myConfig
target: /etc/mySecrets # Here, we will have the file /etc/mySecrets/config.py
environment:
- MYSQL_ROOT_PASSWORD_FILE=/etc/mySecrets/mysql_root_password_file
- MYSQL_USER_FILE=/etc/mySecrets/mysql_user_file
- MYSQL_PASSWORD_FILE=/etc/mySecrets/mysql_user_password_file
depends_on:
- db # Tells docker that "web" can start once "db" is started and running
command: bash -c "python3 NHL-Project/flaskrun.py"
server:
build: ./myNginx
depends_on:
- web
volumes:
- type: bind # TODO -- Make this a volume mount for production
source: /home/jonathan/NHL-Project/flasksite/templates
target: /usr/share/nginx/html
- type: bind # TODO -- Make this a volume mount for production
source: /home/jonathan/NHL-Project/flasksite/static/favicon.ico
target: /usr/share/nginx/html/favicon.ico
- type: bind
source: /home/jonathan/NHL-Project/conf/conf.d
target: /etc/nginx/nginx.conf
ports:
- "80:80"
environment:
- NGINX_PORT=80
command: /bin/bash -c "chown -R nginx /usr/share/nginx/html && exec nginx -g 'daemon off;'"
gunicornservice:
image: jonathanguy/mygunicorn
depends_on:
- server
volumes:
- type: bind
source: /home/jonathan/NHL-Project
target: /NHL-Project
- type: volume
source: myConfig
target: /etc/mySecrets
ports:
- "8000:8000"
command: /bin/bash -c "gunicorn -w 5 flaskrun:app -b 0.0.0.0:8000"
working_dir: /NHL-Project
volumes:
mynhldb:
external: true
myConfig:
external: true
myCode:
external: true
我希望我的整个网站在访问时能够正确呈现和格式化 my_site.com
鉴于我(成功?)在 NginX 配置中实现了 proxy_pass,我得到了所有 HTML 并成功找到了 main.css 文件。
我仍然需要访问 my_site.com:8000 才能使用指定的 bootstrap 格式对 html 进行格式化。
假设形成这个片段
location /static {
alias /NHL-Project/flasksite/static;
}
您的 css 文件已被放置。
我猜这个块是造成问题的原因,因为 nginx 服务将尝试在其容器目录中查找该文件,但这是从您的 Web 容器提供的。
尝试从 nginx conf 文件中删除该块。
另外,如果可能的话,避免在不需要的地方绑定代码量,比如 nginx 和 MySQL.
我有一个利用 Flask、NginX、Gunicorn 和 MySQL 的个人网站。它运行得非常好,但是,我正在将它移植到一组 Docker 容器中(主要是为了学习 Docker)。
我目前面临一个我认为源于我的 NginX 配置的问题,因为我试图将流量转发到 my_site 到 my_site:8000 [下面的代码块 1]。
我的问题是:我终于让转发工作了,因为当我转到 my_site.com 时,它会呈现我的 HTML(大概是通过转发到 Gunicorn 的公开端口 8000)。但是,它不会使用 bootstrap4 格式对其进行格式化。但是,我的终端确实显示了 200 的响应,用于查找我的 main.css 文件。奇怪的是,当我转到 my_site:8000 时,它确实正确地格式化了我的页面!
你们中有人知道我搞错了什么吗?我已经仔细检查了我的端口公开、我的 docker 服务引用等,但在我认为 proxy_pass 成功实施之后无法弄清楚指定端口 8000 的区别是什么我的 NginX 配置中的端口 8000。
我的docker-compose.yml文件内容如下代码块2
NginX 容器来自 Docker hub
上的官方 NginX 镜像MySQL 容器来自 Docker hub
上的官方 MariaDB 镜像其他容器基于 Ubuntu 18.10 映像构建。我只是在这些上下载了Python、nano、requirements.txt等
块 1 -- conf.d NginX 文件
events { }
http {
upstream upstream-web {
server jonathanolson.us;
}
server {
listen 80;
server_name gunicornservice;
location /static {
alias /NHL-Project/flasksite/static;
}
location / {
proxy_pass http://gunicornservice:8000;
# include /etc/nginx/proxy_params;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
}
区块 2 -- docker-compose.yml
version: '3.7'
networks:
default:
external:
name: nhlflasknetwork
services:
db:
restart: always
image: jonathanguy/mymariadb
ports:
- "3306:3306"
volumes:
- type: bind
source: /home/jonathan/NHL-Project
target: /NHL-Project
- type: volume
source: mynhldb
target: /var/lib/mysql
- type: volume
source: myConfig
target: /etc/mySecrets # Here, we will have the file /etc/mySecrets/config.py
environment:
- MYSQL_USER_FILE=/etc/mySecrets/mysql_user_file
- MYSQL_PASSWORD_FILE=/etc/mySecrets/mysql_user_password_file
web:
restart: always
image: jonathanguy/myflask
ports:
- "5000:5000"
volumes:
- type: bind
source: /home/jonathan/NHL-Project
target: /NHL-Project
- type: volume
source: myConfig
target: /etc/mySecrets # Here, we will have the file /etc/mySecrets/config.py
environment:
- MYSQL_ROOT_PASSWORD_FILE=/etc/mySecrets/mysql_root_password_file
- MYSQL_USER_FILE=/etc/mySecrets/mysql_user_file
- MYSQL_PASSWORD_FILE=/etc/mySecrets/mysql_user_password_file
depends_on:
- db # Tells docker that "web" can start once "db" is started and running
command: bash -c "python3 NHL-Project/flaskrun.py"
server:
build: ./myNginx
depends_on:
- web
volumes:
- type: bind # TODO -- Make this a volume mount for production
source: /home/jonathan/NHL-Project/flasksite/templates
target: /usr/share/nginx/html
- type: bind # TODO -- Make this a volume mount for production
source: /home/jonathan/NHL-Project/flasksite/static/favicon.ico
target: /usr/share/nginx/html/favicon.ico
- type: bind
source: /home/jonathan/NHL-Project/conf/conf.d
target: /etc/nginx/nginx.conf
ports:
- "80:80"
environment:
- NGINX_PORT=80
command: /bin/bash -c "chown -R nginx /usr/share/nginx/html && exec nginx -g 'daemon off;'"
gunicornservice:
image: jonathanguy/mygunicorn
depends_on:
- server
volumes:
- type: bind
source: /home/jonathan/NHL-Project
target: /NHL-Project
- type: volume
source: myConfig
target: /etc/mySecrets
ports:
- "8000:8000"
command: /bin/bash -c "gunicorn -w 5 flaskrun:app -b 0.0.0.0:8000"
working_dir: /NHL-Project
volumes:
mynhldb:
external: true
myConfig:
external: true
myCode:
external: true
我希望我的整个网站在访问时能够正确呈现和格式化 my_site.com
鉴于我(成功?)在 NginX 配置中实现了 proxy_pass,我得到了所有 HTML 并成功找到了 main.css 文件。
我仍然需要访问 my_site.com:8000 才能使用指定的 bootstrap 格式对 html 进行格式化。
假设形成这个片段
location /static {
alias /NHL-Project/flasksite/static;
}
您的 css 文件已被放置。 我猜这个块是造成问题的原因,因为 nginx 服务将尝试在其容器目录中查找该文件,但这是从您的 Web 容器提供的。 尝试从 nginx conf 文件中删除该块。 另外,如果可能的话,避免在不需要的地方绑定代码量,比如 nginx 和 MySQL.