Nginx를 사용하여 관리되는 어플리케이션에 대한 제어 사용자 정의

개원 응용 프로그램의 다양성은 자유와 개원 소프트웨어 운동(FOSS) 운동)의 가장 큰 장점이자 채택의 가장 큰 장애물이다. 당신은 항상 당신이 소비하고 있는 응용 프로그램을 가지고 있지 않다. 소프트웨어 작가가 의도적이거나 무의식적으로 가하는 의견과 제한을 수반한다.
역방향 에이전트는 이 제품들에 대한 세부적인 통제를 회수하는 방법이다. Layer 7 (또는 응용 프로그램 수준) 을 지원하는 프로세서에 데이터를 필터링하여 서비스에 전송되는 데이터의 흐름과 행동을 조작, 암호화, 복호화, 리디렉션, 기타 방식으로 제어할 수 있습니다.

Nginx가 뭐예요? 왜 필요해요?


이 데이터를 제어하는 좋은 예는 Nginx입니다.Nginx은 오픈소스 웹 서버로 부하 균형과 데이터 에이전트 분야에서 세계에서 선두를 차지하고 있다.그것은 경량급이고 이해하기 쉬운 패키지 사용자 정의 응용 프로그램의 행동을 사용할 수 있는 대량의 플러그인과 기능을 갖추고 있다. Netcraft W3Techs,에 따르면 Nginx는 약 31-36%의 활동 사이트에서 아파치와 어깨를 나란히 하여 세계에서 가장 선호하는 웹 서버가 되었다.이것은 좋은 존중과 신뢰를 받을 뿐만 아니라 대부분의 생산 시스템의 수요를 충족시킬 수 있을 뿐만 아니라 거의 모든 구조와 호환될 뿐만 아니라 이 프로젝트를 지원하는 엔지니어와 개발자의 충실한 추종자도 가지고 있다는 것을 의미한다.이것은 응용 프로그램의 수명, 이식 가능성과 위탁 관리 위치를 고려하는 관건적인 요소이다.

Heroku 및 Nginx


Nginx가 필요할 수 있는 상황을 살펴보겠습니다.우리의 예시에서 당신은 응용 프로그램을 만들고 플랫폼 즉 서비스(PaaS)에 배치했습니다. 우리의 예시에서 PaaS의 Heroku.을 사용하면 생활이 더욱 가벼워집니다. 인프라 시설, 모니터링과 지원 가능성에 대한 결정을 내렸기 때문에 응용 프로그램을 쉽게 실행할 수 있는 깨끗한 환경을 제공할 수 있습니다.그러나 이러한 이점을 얻기 위해서는 애플리케이션이 공급업체의 제약에 부합해야 합니다.
사용자 정의 코드를 직접 작성할 때 문제가 아닙니다.인프라 시설에 필요한 연결만 추가하면 경기를 시작할 수 있습니다.그러나 이 인프라 모델에 부합되지 않는 제3자 서비스나 제품을 사용해야 할 때, 아래의 예시인 BookStack과 같이 이 통합을 설계하는 유일한 방법은 Nginx와 같은 중간층 유량 조종기를 사용하는 것이다.
Nginx를 사용하여 Heroku에서 응용 프로그램 동작을 사용자 정의하는 세 가지 방법을 살펴보겠습니다.
  • 컨테이너 실행 시 동적 할당 서버 포트
  • 응용 프로그램에 기본 인증
  • 추가
  • 운영 서비스에 영향을 주지 않고 애플리케이션 변경을 테스트하는 미러링 트래픽
  • 중간 레벨 동적 포트 바인딩


    우선 동적 포트 연결을 봅시다.Heroku의 웹 dynos에 데이터를 제공하기 위해서는'PORT'라는 환경 변수에 접근해야 합니다.이 변수는 매번 배치에 따라 변화하며 응용 프로그램이 시작되기 전에 발표되지 않습니다.이런 동적 포트에 연결되지 않은 어떤 서비스도 명확한 차단기입니다.
    Heroku는 이러한 중간층을 자동으로 배치하고 설정할 수 있는 구축 패키지를 제공했지만 동적 변수의 해결 방안은 항상 쉽지 않을 것이다.때때로 우리는 공급업체의 도움 없이 이 문제나 유사한 문제를 해결해야 할 수도 있다.정적 구성의 응용 프로그램을 동적 구성의 응용 프로그램으로 변환하기 위해 BookStack을 사용하여 수동으로 솔루션을 구축하는 방법을 살펴보겠습니다.
    BookStack은 자칭 자신의 의견을 고집하는wiki시스템으로 Laravel에 내장되어 있으며 MySQL 백엔드가 있습니다.BookStack은 응용 프로그램 배치자의 손에서 전체적인 지원 구조를 간소화하고 위키 페이지가 가장 필요할 때 영원히 찾을 수 없도록 설계를 고려했다.
    준비를 위해서, 우리는 BookStack & Nginx의 공식 문서에서 일부 부분을 수집하여, Dockerfile과 기본적인 비계 파일을 함께 놓아야 한다.너는 이곳에서 전체 항목을 볼 수 있다: https://github.com/Tokugero/bookstack-demo.
    Dockerfile을 살펴보겠습니다.
        FROM debian:stable-slim
        ENV PORT="80"
        ENV APP_URL="http://localhost/"
        ADD https://github.com/BookStackApp/BookStack/archive/release.zip /bookstack/
        ADD https://getcomposer.org/installer /root/composer-setup.php
        RUN apt-get update && \
                apt-get install -y \
                unzip \
                php-cli \
                php-mbstring \
                php7.3-curl \
                php7.3-dom \
                php7.3-gd \
                php7.3-mysql \
                php7.3-tidy \
                php7.3-xml \
                php-fpm \
                nginx && \
                apt-get clean && \
                rm -rf /var/lib/apt/lists/*
        RUN unzip /bookstack/release.zip -d / && \
                rm /bookstack/release.zip && \
                php /root/composer-setup.php --install-dir=/usr/local/bin --filename=composer && \
                mkdir -p /var/lib/nginx && \
                touch /run/nginx.pid && \
                touch /var/log/php7.3-fpm.log
        COPY config/bookstack.env /BookStack-release/.env
        COPY config/nginx.conf /etc/nginx/nginx.conf
        COPY scripts/run.sh /BookStack-release/run.sh
        COPY config/nginx.htpasswd /BookStack-release/.htpasswd
        RUN cd /BookStack-release && \
                composer install --no-dev && \
                chown -R www-data:www-data /BookStack-release/ && \
                chown -R www-data:www-data /etc/nginx/ && \
                chown -R www-data:www-data /var/lib/nginx/ && \
                chown -R www-data:www-data /etc/php/7.3/fpm/ && \
                chown www-data:www-data /run/nginx.pid && \
                chown www-data:www-data /var/log/php7.3-fpm.log && \
                chmod 600 .htpasswd
        USER www-data
        WORKDIR /BookStack-release/
        ENTRYPOINT ["./run.sh"]
    

    스크립트 / 실행상해


        #!/bin/bash
        sed -i -e 's/$PORT/'"$PORT"'/g' /etc/nginx/nginx.conf
        sed -i -e 's,APPURL,'${APP_URL}',g' /BookStack-release/.env
        sed -i -e 's,listen = /run/php/php7.3-fpm.sock,listen = 127.0.0.1:9000,g' /etc/php/7.3/fpm/pool.d/www.conf
        sed -i -e 's,pid = /run/php/php7.3-fpm.pid,pid = php7.3-fpm.pid,g' /etc/php/7.3/fpm/php-fpm.conf
        cd /BookStack-release/ && \
                echo yes | php artisan key:generate && \
                echo yes | php artisan migrate
        php-fpm7.3 & \
               nginx -g 'daemon off;'
    

    /nginx를 구성합니다.형태


        worker_processes  4;
        error_log  /dev/stderr;
        user www-data;
        include /etc/nginx/modules/*.conf;
        events {
          worker_connections  4096;  ## Default: 1024
        }
        http {
          include    /etc/nginx/fastcgi.conf;
          include    /etc/nginx/mime.types;
          index    index.html index.htm index.php;
          default_type application/octet-stream;
          access_log   /dev/stdout;
          sendfile     on;
          tcp_nopush   on;
          server {
            #This is updated via sed in ./scripts/run.sh at runtime
            listen       $PORT;
            server_name  _;
            root         /BookStack-release/public;
            client_max_body_size 0;
            location / {
                index index.php;
                try_files $uri $uri/ /index.php?$query_string;
            }
            location ~ \.php$ {
                fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                if (!-f $document_root$fastcgi_script_name) {
                    return 404;
                }
                # Mitigate https://httpoxy.org/ vulnerabilities
                fastcgi_param HTTP_PROXY "";
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                # include the fastcgi_param setting
                include fastcgi_params;
                # SCRIPT_FILENAME parameter is used for PHP FPM determining
                #  the script name. If it is not set in fastcgi_params file,
                # i.e. /etc/nginx/fastcgi_params or in the parent contexts,
                # please comment off following line:
                fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
            }
          }
        }
    
    #### config/bookstack.env
        APP_KEY=replaceme
        APP_URL=APPURL
    
    지금은 많은 것 같지만 핵심 기능을 구성하는 더 중요한 부분을 분해해 봅시다.
    Dockerfile에는 주로 응용 프로그램 자체를 설치하는 데 사용되는 행이 많습니다.공식 BookStack 문서에서 찾을 수 있으며 서비스 및 추가 패키지를 수동으로 설치할 수 있습니다.목표는 환경을 응용 프로그램에 적합하게 하는 것이다.다음과 같은 세 가지 특정 회선을 포함하여 보다 동적인 서비스 구현을 지원합니다.
        ...
        ENV PORT="80"
        ENV APP_URL="[http://localhost/](http://localhost/)"
        ...
        ENTRYPOINT ["./run.sh"]
    
    기본 환경 변수를 설정하고 실행할 때 Nginx 프로필 값을 환경 값으로 대체하기 위해 셸 스크립트를 호출합니다.그것이 있으면 우리는 마음대로 이 응용 프로그램을 맞춤형으로 만들 수 있다.이제 하드 인코딩 변수를 사용하지 않고 로컬 인스턴스 서비스를 실행할 수 있습니다.
    docker run -it -d -e APP_URL=http://localhost:9876 -e PORT=8080 -p 9876:8080 bookstack-demo
    
    응용 프로그램 자체에 대한 특별한 설정 없이 실행 시 포트를 설명할 수 있습니다. 이것은 Heroku의 웹dynos에서 서비스를 공개하는 핵심 요구입니다.이러한 정보를 전달하기 위해서, 우리는 sed를 사용하여 실행할 때 환경 변수를 하드 인코딩 값으로 대체하기만 하면 된다.
        sed -i -e 's/$PORT/'"$PORT"'/g' /etc/nginx/nginx.conf;
        sed -i -e 's,APPURL,'${APP_URL}',g' /BookStack-release/.env;
    
    우리의 달리는 중.용기 메인 명령의sh 스크립트를 시작합니다. 흐름 편집기/sed를 사용하여nginx 프로필과 응용 프로그램 전용 환경 파일의 미리 정의된 변수를 대체할 수 있습니다.nginx가 초기화되기 전에 이렇게 할 때, 응용 프로그램은 용기가 시작된 후 Heroku가 정의한 포트에서 시작됩니다.
    마지막 배포 명령:
    heroku container:push web -a bookstack-demo && heroku container:release web -a bookstack-demo
    

    간단한 기본 인증


    만약 특수한 플러그인이 없다면, 일부 기능은 우리의 새로운 인프라 시설 환경에서 사용할 수 없다.그러나 프로젝트 구축의 초기 단계에서 임의로 저희 포털에 접근을 요청하는 것을 방지하기 위해 간단한 비밀번호가 필요할 수도 있습니다.Nginx는 자동으로 하나의 큰 기능을 포함하는데, 그 중 하나는 각 서버나 위치의 기본 인증을 바탕으로 하는 것이다.이렇게 하면 Heroku나 BookStack 쪽에서 아무런 조작도 하지 않고 FOSS 프로그램을 암호로 보호할 수 있습니다.
    앞의 모든 작업이 있기 때문에 우리는 프로젝트에 몇 줄의 코드를 추가하기만 하면 응용 프로그램에서 기본적인 신분 검증을 강제할 수 있다. auth_basic module 및 Apache의 htpasswd 도구를 사용하여 다음을 추가할 수 있습니다.

    /nginx를 구성합니다.형태


            ...
            location / {
                auth_basic "Under Construction";
                auth_basic_user_file /BookStack-release/.htpasswd;
                index index.php;
                try_files $uri $uri/ /index.php?$query_string;
            }
            ...
    
    암호를 생성하여 Dockerfile에 포함해야 합니다.
        bookstack-demo$ htpasswd config/nginx.htpasswd myuser
        New password: mypass
        Re-type new password: mypass
        Updating password for user myuser
    
    

    Dockerfile 파일


        ...
         COPY config/nginx.htpasswd /BookStack-release/.htpasswd
        ...
        RUN cd /BookStack-release && \
        ...
                chmod 600 .htpasswd
        ...
    
    
    다음은 응용 프로그램에 액세스하려고 할 때 본 내용입니다.

    고급 교통 음영


    우리의 마지막 예는 mirrors 유량을 선택한 위치로 전송할 수 있는 특수한 Nginx 모듈입니다. (원본 요청의 목적지에는 영향을 주지 않습니다.)이것은 코드 재구성, 레이아웃 변경과 실제 생산 유량을 가진 다른 변경을 테스트하는 데 매우 좋은 도구이다.

    /nginx를 구성합니다.형태


            server {   
            mirror /mirror;
            mirror_request_body on;
            ...
            location = /mirror {
                resolver 1.1.1.1 valid=30s;
                internal;
                proxy_pass https://bookstack-mirror-demo.herokuapp.com$request_uri;
            }
            ...
    
    

    Heroku 로컬 도구


    저희가 전에 Heroku의 Nginx buildpack을 언급했습니다.이 기능은 일부 포트 관리 기능을 자동화하여 Nginx의 전문적인 관리 기능 없이 실행할 수 있도록 합니다.우리의 예는 직접 이런 방법과 비교를 했지만, 이 도구는 더 적은 문서 자원 사이를 왕복할 수 있게 한다.
    이미지 사이트를 생성하기 위해서, 우리는 Heroku의 원생buildpack을 이용하여 Nginx 기능을 임의의 프로젝트에 추가할 것입니다. 상기 예시의 모든 사용자 정의 dockerization이 필요하지 않습니다.
    새 저장소만 생성하면 됩니다.
    mkdir bookstack-mirror-demo; cd bookstack-mirror-demo; git init; 
    
    템플릿 파일을 추가하려면 다음과 같이 하십시오.

    /nginx를 구성합니다.설정


        daemon off;
        # Heroku dynos have at least 4 cores.
        worker_processes <%= ENV['NGINX_WORKERS'] || 4 %>;
        events {
          use epoll;
          accept_mutex on;
          worker_connections <%= ENV['NGINX_WORKER_CONNECTIONS'] || 1024 %>;
        }
        http {
          gzip on;
          gzip_comp_level 2;
          gzip_min_length 512;
          server_tokens off;
          log_format l2met 'measure#nginx.service=$request_time request_id=$http_x_request_id';
          access_log <%= ENV['NGINX_ACCESS_LOG_PATH'] || 'logs/nginx/access.log' %> l2met;
          error_log <%= ENV['NGINX_ERROR_LOG_PATH'] || 'logs/nginx/error.log' %>;
          include mime.types;
          default_type application/octet-stream;
          sendfile on;
          # Must read the body in 5 seconds.
          client_body_timeout <%= ENV['NGINX_CLIENT_BODY_TIMEOUT'] || 5 %>;
          server {
            listen <%= ENV["PORT"] %>;
            server_name _;
            keepalive_timeout 5;
            client_max_body_size <%= ENV['NGINX_CLIENT_MAX_BODY_SIZE'] || 1 %>M;
            root /app/public; # path to your app
          }
        }
    

    프로그램 파일


    web: bin/start-nginx-solo
    
    Heroku Git에 파일 추가:
    heroku git:remote -a bookstack-mirror-demo
    
    git add *; git commit -am “Initial commit”
    
    heroku buildpacks:add https://github.com/heroku/heroku-buildpack-nginx -a bookstack-mirror-demo
    
    git push heroku master
    
    너는 이제 너의 데이터를 거울로 삼아 너의 서비스를 복제할 수 있다.

    결론


    무료 소스 오픈 소프트웨어는 사용자 정의 응용 프로그램 세트의 우수한 구축 블록이다.그것이 어떻게 사용하든지 간에 어떤 고유한 제한이 있든지 간에 그것을 사용자 정의하여 당신의 환경 범위 내에서 일하게 할 수 있습니다.응용 프로그램을 그 어떠한 프레임워크에서 추상화하는 방법과 Nginx와 같은 중간층의 커다란 유연성을 이용하여 응용 프로그램의 능력을 강화하는 방법에 대해 생각해 보십시오.

    좋은 웹페이지 즐겨찾기