मैं 2 डोकर कंटेनर डोकर लिखें का उपयोग कर तैनात किया है।

एक nginx है और दूसरा मेरा फ्लास्क एप्लिकेशन है। प्रमाणीकरण एन्क्रिप्ट करने के लिए मैं केवल एक स्थिर सर्वर के रूप में nginx का उपयोग कर रहा हूं।

अगर मैं अपने फ्लास्क ऐप को nginx के बिना तैनात करता हूं, तो मैं अपने सर्वर को सफलतापूर्वक कर्ल/पिंग कर सकता हूं। हालांकि, जिस क्षण nginx पेश किया गया है, मैं कनेक्ट करने में सक्षम नहीं हूं।

मैं जो करना चाहता हूं वह कम से कम मेरे सर्वर को संख्यात्मक बाहरी आईपी के माध्यम से एक्सेस करना है उदा। xx.xx.xx.xx और फिर मेरा डोमेन जो उसी आईपी को इंगित करता है। (मेरा डोमेन वास्तव में एक उपडोमेन है जैसे api.domain.com)

मेरा डोकर रचना है:

services:
  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
      args:
        DOMAIN: ${DOMAIN}
        FLASK: application
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
    depends_on:
      - application

  application:
    build:
      context: ./flask_app
      dockerfile: Dockerfile
    ports:
      - 5000:5000

nginx.conf

user nginx;

worker_processes auto;
worker_rlimit_nofile 8192;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    charset utf-8;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;
    log_not_found off;
    types_hash_max_size 2048;
    client_max_body_size 16M;

    include mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ecdh_curve X25519:sect571r1:secp521r1:secp384r1;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_ciphers 'TLS13+AESGCM+AES128:TLS13+AESGCM+AES256:TLS13+CHACHA20:EECDH+AESGCM:EECDH+CHACHA20';
    ssl_stapling on;
    ssl_stapling_verify on;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    include conf.d/*.conf;
}

flask_app.conf

server {
    listen 80;
    listen [::]:80;
    server_name www.${DOMAIN} ${DOMAIN};

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/_letsencrypt;
    }

    location / {
        return 301 https://${DOMAIN}${DOLLAR}request_uri;
    }
}

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name www.${DOMAIN} ${DOMAIN};

    ssl_certificate /etc/letsencrypt/live/${DOMAIN}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/${DOMAIN}/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/${DOMAIN}/chain.pem;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;

    # You might want to change the CSP policy to fit your needs - see https://content-security-policy.com/
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';";

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header Allow "GET, POST, HEAD" always;

    access_log /var/log/nginx/${DOMAIN}.access.log;
    error_log /var/log/nginx/${DOMAIN}.error.log warn;

    location / {
        proxy_http_version 1.1;
        proxy_cache_bypass ${DOLLAR}http_upgrade;

        proxy_hide_header X-Powered-By;
        proxy_hide_header Server;
        proxy_hide_header X-AspNetMvc-Version;
        proxy_hide_header X-AspNet-Version;

        proxy_set_header Proxy "";
        proxy_set_header Upgrade ${DOLLAR}http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host ${DOLLAR}host;
        proxy_set_header X-Real-IP ${DOLLAR}remote_addr;
        proxy_set_header X-Forwarded-For ${DOLLAR}proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto ${DOLLAR}scheme;
        proxy_set_header X-Forwarded-Host ${DOLLAR}host;
        proxy_set_header X-Forwarded-Port ${DOLLAR}server_port;

        proxy_pass http://application:5000;
    }

    location ~* \.(?:css|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|woff2|svg)${DOLLAR} {
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control public;

        proxy_pass http://application:5000;
    }

    if ( ${DOLLAR}request_method !~ ^(GET|POST|HEAD)${DOLLAR} ) {
        return 405;
    }

    if (${DOLLAR}http_user_agent ~* LWP::Simple|BBBike|wget) {
        return 403;
    }

    location ~ /\.(?!well-known) {
        deny all;
    }

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
}
0
GRS 19 जिंदा 2020, 20:00

1 उत्तर

सबसे बढ़िया उत्तर

मुझे यकीन नहीं है कि आपके nginx कॉन्फिगर में ${DOLLAR} कई जगहों पर क्यों है। मुझे नहीं लगता कि यह वैध वाक्यविन्यास है, और इससे संबंधित कोई दस्तावेज नहीं मिल रहा है। पंक्तियाँ जैसे:

proxy_set_header Host ${DOLLAR}host;

वास्तव में होना चाहिए:

proxy_set_header Host $host;

जहां तक ​​nginx conf में ${DOMAIN} का उपयोग करने की बात है, तो मैं इससे बचूंगा और अधिक सरल कॉन्फ़िगरेशन का विकल्प चुनूंगा। बस nginx कॉन्फ़िग फ़ाइल में डोमेन निर्दिष्ट करें:

server_name www.example.com example.com;

मैं "कॉम्प्लेक्स कॉन्फ़िगरेशन" के अंतर्गत आधिकारिक nginx image docs से परिचित होऊंगा, यह आपको दिखाता है कि कैसे एक चल रहे कंटेनर से एक कार्यशील कॉन्फ़िगरेशन की प्रतिलिपि बनाने के लिए, फिर इसे अपनी आवश्यकताओं के अनुसार संशोधित करें।

एक बार जब आप यह काम कर लेते हैं, यदि आप वास्तव में अपनी docker-compose फ़ाइल में डोमेन निर्दिष्ट करना चाहते हैं, और अपने nginx कॉन्फिगर को एक टेम्प्लेट के रूप में मानते हैं, जिसे कंटेनर-स्टार्ट टाइम पर संशोधित किया गया है, तो आप "पर्यावरण चर का उपयोग करना" अनुभाग को पढ़ने के लिए आगे बढ़ सकते हैं। nginx कॉन्फ़िगरेशन" जो इसे प्राप्त करने के लिए envsubst का उपयोग करने के लिए वर्कअराउंड दिखाता है। हालांकि यह शायद एकल साइट परिनियोजन के लिए आवश्यक नहीं है।

1
v25 20 जिंदा 2020, 02:25