爬坑过程,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;
        }
}
  1. location / 是默认域名访问地址
  2. location /tools 是指定地址跳转到对应服务,tools 服务
  3. location /data-front 同域名下指定地址跳转到对应的服务,data-front服务

假设tools 是个后端服务,data-front 是个前端服务,那么我们这里后端接口请求需要默认带上/tools/***地址去访问,同理前端就需要让资源路径以及URL 加上data-front 去访问。例如:

  1. http://www.baodu.com/data-front 是可以访问到服务的,
  2. 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