爬坑过程,Django服务端部署nginx代理过程各种资源文件找不到问题的处理和总结。
一、Nginx配置
首先我们要讲下Nginx 代理部署服务的几种方式,我知道的方式。。
1.一个域名对应一个服务配置
通过一级域名可以配置多个多个子域名,每个子域名可以视为独立可访问的地址,比如一个公司域名叫:baidu.com,那么他的二级域名可以是给内部用的test.baodu.com,也可以是部署服务用的jenkins.baidu.com,以此类推都是相互独立的服务
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name test.baidu.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server{
listen 443 ssl;
server_name test.baidu.com;
ssl_certificate /data/nginx/nginx.conf/6575153_mock.metaversed.top.pem;
ssl_certificate_key /data/nginx/nginx.conf/6575153_mock.metaversed.top.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
server_tokens off;
fastcgi_param HTTPS on;
fastcgi_param HTTP_SCHEME https;
access_log /data/nginx/log/httpaccess.logs;
if ($host ~ "\d+\.\d+\.\d+\.\d") {
return 404;
}
location / {
proxy_pass http://localhsot:8099/;
proxy_redirect default;
proxy_http_version 1.1;
}
}
一个域名一个服务就加一个server配置,该配置下的服务环境配置几乎和本地是完全一致的,无需做过多修改,这里不谈。
2.一个域名对应多个服务
通常用来部署同域的前后端服务,通过path 路由的方式来实现,nginx配置如下:
upstream tools {
server 192.168.172.255:8088;
}
upstream data-front {
server 192.168.172.1:8099;
}
server {
listen 80;
#listen 443 ssl;
server_name baidu.com ;
location / {
root /data/admin/index.html;
index index.html;
}
location /tools {
proxy_pass http://tools;
proxy_set_header Host baidu.com;
proxy_set_header X-Real-IP $remote_addr;
}
location /data-front {
proxy_pass http://data-front;
proxy_set_header Host baidu.com;
proxy_set_header X-Real-IP $remote_addr;
}
}
- location / 是默认域名访问地址
- location /tools 是指定地址跳转到对应服务,tools 服务
- location /data-front 同域名下指定地址跳转到对应的服务,data-front服务
假设tools 是个后端服务,data-front 是个前端服务,那么我们这里后端接口请求需要默认带上/tools/***地址去访问,同理前端就需要让资源路径以及URL 加上data-front 去访问。例如:
- http://www.baodu.com/data-front 是可以访问到服务的,
- http://www.baodu.com/ 就会提示报错,这里就是问题,404 提示地址异常
同样的问题,在页面加载一些静态资源文件时也许要配置文件地址从http://www.baodu.com/data-front开始,而不是http://www.baodu.com/ ,
二、Django 代码配置
1.一个域名对应一个服务nignx 配置时的URLS和setting 配置
app.urls
from django.conf import settings
from django.urls import path
from django.views import static
from datafactory import views
app_name = 'datafactory'
urlpatterns = [
path('<int:tool_id>/', views.detail, name="detail"),
path('', views.IndexView.as_view(), name='index'),
path('<int:tool_id>/tool', views.create_data, name="tool"),
# setting debug 设置false时服务端部署会出现资源文件404时配置处理
path(r'^static/(?P<path>.*)$', static.serve,{'document_root':settings.STATIC_ROOT},name='static'),
project.urls
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('datafactory/', include('datafactory.urls')),
path('', include('datafactory.urls')),
]
settings需要增加如下配置
STATIC_URL = '/static/'
STATIC_ROOT = 'static'
STATICFILES_DIRS = (
os.path.join(STATIC_ROOT, 'static'),
os.path.join(STATIC_URL, 'static'),
)
2.一个域名对应多个服务nignx 配置时的URLS和setting 配置
我们需要手动创建一个资源文件包,然后把工程需要的资源文件复制到该路径下,静态资源文件的路径就变成 project/data-front/static
同时需要配置urls 和setting
app.urls
rom django.conf import settings
from django.urls import path
from django.views import static
from datafactory import views
app_name = 'datafactory'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('data-front/', views.IndexView.as_view(), name='index'),
path('<int:tool_id>/', views.detail, name="detail"),
path('<int:tool_id>/tool', views.create_data, name="tool"),
path(r'^data-front/static/(?P<path>.*)$', static.serve, {'document_root': settings.STATIC_ROOT},
name='data-front/static'),
]
project.urls
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('data-front/admin/', admin.site.urls),
path('data-front/', include('datafactory.urls')),
path('', include('datafactory.urls')),
]
settings 需要将新增的资源路径配置修改如下
# 因为服务端是通过data-front/路由到当前服务器
# 因此需要创建data-front文件并加入到资源配置中,否则会出现404
STATIC_URL = '/data-front/static/'
STATIC_ROOT = 'data-front/static'
STATICFILES_DIRS = (
os.path.join(STATIC_URL, '/data-front/static/'),
os.path.join(STATIC_ROOT, 'data-front/static'),
)
这样我们就解决了同域名多个服务部署时前端Django 资源文件访问404 的问题
这里也给上docker 配置,仅供参考
三、docker容器化部署
1.docker配置文件
FROM python:3.6.8
WORKDIR /root
COPY requirements.txt ./
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
2.docek-compose.yml 配置
version: '3'
services:
master:
image: ddf
tty: true
container_name: ddf
volumes:
- /django_front/:/django_front/
ports:
- "8099:8099"
command:
- /bin/bash
- -c
- |
cd /django_front/
python manage.py runserver 0.0.0.0:8099