초 상세 Nginx 미니 강좌, 바보 도 딱 봐 도!

13889 단어
저자: 침묵 허공 www. cnblogs. com / jingmoxukong / p / 5945200. htm
Nginx 가 뭐 예요?
Nginx (engine x) 는 경량급 웹 서버, 역방향 프 록 시 및 이메일 (IMAP / POP 3) 프 록 시 서버 다.
역방향 대리 란 무엇 입 니까?
역방향 프 록 시 (Reverse Proxy) 방식 은 프 록 시 서버 로 인터넷 의 연결 요청 을 받 은 다음 내부 네트워크 에 있 는 서버 에 전송 요청 을 하고 서버 에서 얻 은 결 과 를 인터넷 에서 연결 을 요청 하 는 클 라 이언 트 에 게 되 돌려 주 는 것 을 말한다. 이때 프 록 시 서 비 스 는 대외 적 으로 역방향 프 록 시 서버 로 나타난다.
설치 및 사용
설치 하 다.
nginx 홈 페이지 다운로드 주소:http://nginx.org발표 버 전 은 리 눅 스 와 windows 버 전 으로 나 뉜 다.
원본 코드 를 다운로드 해서 컴 파일 해서 실행 할 수도 있 습 니 다.
소스 코드 에서 Nginx 컴 파일
원본 코드 를 압축 해제 한 후 터미널 에서 다음 명령 을 실행 합 니 다.
$ ./configure
$ make
$ sudo make install

기본적으로 Nginx 는 / usr / local / nginx 에 설 치 됩 니 다.컴 파일 옵션 을 설정 하면 이 설정 을 변경 할 수 있 습 니 다.
Windows 설치
Nginx / Win 32 를 설치 하기 위해 서 는 먼저 다운로드 해 야 합 니 다.그리고 압력 을 풀 고 운행 하면 된다.다음은 CD 루트 디 렉 터 리 를 예 로 들 어 설명 하 겠 습 니 다.
cd C:
cd C: ginx-0.8.54   start nginx

Nginx / Win 32 는 windows 서비스 방식 이 아 닌 콘 솔 프로그램 에서 실 행 됩 니 다.서버 방식 은 아직 개발 시도 중 입 니 다.
쓰다
nginx 의 사용 은 비교적 간단 하 다. 바로 몇 가지 명령 이다.
자주 사용 하 는 명령 은 다음 과 같 습 니 다.
  • nginx - s stop: Nginx 를 빠르게 닫 으 면 관련 정 보 를 저장 하지 않 고 웹 서 비 스 를 신속하게 종료 할 수 있 습 니 다.
  • nginx - s quit: Nginx 를 안정 적 으로 닫 고 관련 정 보 를 저장 하 며 안 정 된 종료 웹 서 비 스 를 제공 합 니 다.
  • nginx - s reload: Nginx 관련 설정 이 바 뀌 었 기 때문에 설정 을 다시 불 러 와 야 하기 때문에 다시 불 러 옵 니 다.
  • nginx - s reopen: 로그 파일 을 다시 엽 니 다.
  • nginx - c filename: 부족 한 것 대신 Nginx 에 프로필 을 지정 합 니 다.
  • nginx - t: 실행 되 지 않 고 설정 파일 만 테스트 합 니 다.nginx 는 프로필 의 문법 적 정확성 을 검사 하고 프로필 에 사 용 된 파일 을 열 려 고 합 니 다.
  • nginx - v: nginx 버 전 을 표시 합 니 다.
  • nginx - V: nginx 버 전, 컴 파일 러 버 전과 설정 파 라미 터 를 표시 합 니 다.

  • 매번 명령 을 두 드 리 지 않 으 려 면 nginx 설치 디 렉 터 리 에 일괄 처리 파일 startup. bat 를 추가 하고 두 번 누 르 면 실행 할 수 있 습 니 다.내용 은 다음 과 같다.
    @echo off
    rem          nginx    pid  , kill    
    nginx.exe -s stop
    
    rem            
    nginx.exe -t -c conf/nginx.conf
    
    rem       
    nginx.exe -v
    
    rem          nginx
    nginx.exe -c conf/nginx.conf
    

    리 눅 스에 서 실행 된다 면 셸 스 크 립 트 를 쓰 는 것 은 대동소이 하 다.
    nginx 실전 설정
    각종 개발 도구 의 배 치 는 실전 과 결합 해 이야기 하 는 것 이 더 이해 하기 쉽다 고 생각 합 니 다.
    http 역방향 에이전트 설정
    우 리 는 먼저 작은 목 표를 실현 합 니 다. 복잡 한 설정 을 고려 하지 않 고 http 역방향 대 리 를 완성 하 는 것 입 니 다.
    nginx. conf 설정 파일 은 다음 과 같 습 니 다.
    주: conf / nginx. conf 는 nginx 의 기본 설정 파일 입 니 다.nginx - c 를 사용 하여 설정 파일 을 지정 할 수 있 습 니 다.
    #    
    #user somebody;
    
    #    ,      cpu     
    worker_processes  1;
    
    #      
    error_log  D:/Tools/nginx-1.10.1/logs/error.log;
    error_log  D:/Tools/nginx-1.10.1/logs/notice.log  notice;
    error_log  D:/Tools/nginx-1.10.1/logs/info.log  info;
    
    #PID  ,       nginx   ID
    pid        D:/Tools/nginx-1.10.1/logs/nginx.pid;
    
    #          
    events {
       worker_connections 1024;    #    worker process          
    }
    
    #  http   ,                  
    http {
       #  mime  (      ),   mime.types    
       include       D:/Tools/nginx-1.10.1/conf/mime.types;
       default_type  application/octet-stream;
    
       #    
       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    D:/Tools/nginx-1.10.1/logs/access.log main;
       rewrite_log     on;
    
       #sendfile      nginx      sendfile   (zero copy   )     ,      ,
       #     on,             IO     ,     off,        I/O    ,     uptime.
       sendfile        on;
       #tcp_nopush     on;
    
       #      
       keepalive_timeout  120;
       tcp_nodelay        on;
    
       #gzip    
       #gzip  on;
    
       #          
       upstream zp_server1{
           server 127.0.0.1:8089;
       }
    
       #HTTP   
       server {
           #  80  ,80        ,  HTTP  
           listen       80;
    
           #    www.xx.com  
           server_name  www.javastack.cn;
    
           #  
           index index.html
    
           #  webapp   
           root D:_WorkspaceProjectgithubzpSpringNotesspring-securityspring-shirosrcmainwebapp;
    
           #    
           charset utf-8;
    
           #      
           proxy\_connect\_timeout 180;
           proxy\_send\_timeout 180;
           proxy\_read\_timeout 180;
           proxy\_set\_header Host $host;
           proxy\_set\_header X-Forwarder-For $remote_addr;
    
           #       ( upstream  ),location          
           location / {
               proxy_pass http://zp_server1;
           }
    
           #    ,nginx    
           location ~ ^/(images|javascript|js|css|flash|media|static)/ {
               root D:_WorkspaceProjectgithubzpSpringNotesspring-securityspring-shirosrcmainwebappiews;
               #  30 ,         ,        ,      ,         。
               expires 30d;
           }
    
           #    Nginx     
           location /NginxStatus {
               stub_status           on;
               access_log            on;
               auth_basic            "NginxStatus";
               auth\_basic\_user_file  conf/htpasswd;
           }
    
           #     .htxxx   
           location ~ /.ht {
               deny all;
           }
    
           #      (      )
           #error_page   404              /404.html;
           #error_page   500 502 503 504  /50x.html;
           #location = /50x.html {
           \#    root   html;
           #}
       }
    }
    

    자, 우리 한번 해 봅 시다.
    웹 앱 을 시작 합 니 다. 연 결 된 포트 를 시작 하려 면 nginx 의 upstream 설정 포트 와 일치 해 야 합 니 다.
    호스트 변경:
    C: Windows \ System 32 \ drivers \ etc 디 렉 터 리 에 있 는 host 파일 에 DNS 기록 127.0.0.1 www. javastack. cn 시작 전문 에서 startup. bat 명령 을 추가 합 니 다.
    브 라 우 저 에서 www. javastack. cn 을 방문 하면 의외 의 사고 가 발생 하지 않 고 이미 방문 할 수 있 습 니 다.
    부하 균형 설정
    이전 예 에서 프 록 시 는 서버 만 가리 키 고 있 습 니 다.
    그러나 사 이 트 는 실제 운영 과정 에서 대부분 여러 대의 서버 가 같은 앱 을 실행 하고 있 기 때문에 부하 균형 을 사용 하여 분류 해 야 한다.
    nginx 도 간단 한 부하 균형 기능 을 실현 할 수 있다.
    이러한 응용 장면 을 가정 하면 192.168.1.11: 80, 192.168.1.12: 80, 192.168.1.13: 80 세 대의 Liux 환경의 서버 에 응용 할 것 이다.사이트 도 메 인 이름 은 www. javastack. cn 이 고 네트워크 IP 는 192.168.1.11 이다.네트워크 IP 가 있 는 서버 에 nginx 를 배치 하여 모든 요청 에 부하 균형 처 리 를 합 니 다.
    nginx. conf 설정 은 다음 과 같 습 니 다.
    http {
        #  mime  ,   mime.type    
       include       /etc/nginx/mime.types;
       default_type  application/octet-stream;
       #      
       access_log    /var/log/nginx/access.log;
    
       #            
       upstream load\_balance\_server {
           #weigth      ,             
           server 192.168.1.11:80   weight=5;
           server 192.168.1.12:80   weight=1;
           server 192.168.1.13:80   weight=6;
       }
    
      #HTTP   
      server {
           #  80  
           listen       80;
    
           #    www.xx.com  
           server_name  www.javastack.cn;
    
           #             
           location / {
               root        /root;                 #               
               index       index.html index.htm;  #           
               proxy_pass  http://load\_balance\_server ;#    load\_balance\_server         
    
               #            (      )
               #proxy_redirect off;
               proxy\_set\_header Host $host;
               proxy\_set\_header X-Real-IP $remote_addr;
               #   Web       X-Forwarded-For      IP
               proxy\_set\_header X-Forwarded-For $remote_addr;
               proxy\_connect\_timeout 90;          #nginx            (      )
               proxy\_send\_timeout 90;             #           (      )
               proxy\_read\_timeout 90;             #     ,         (      )
               proxy\_buffer\_size 4k;              #       (nginx)             
               proxy_buffers 4 32k;               #proxy_buffers   ,     32k    ,    
               proxy\_busy\_buffers_size 64k;       #        (proxy_buffers*2)
               proxy\_temp\_file\_write\_size 64k;    #         ,     ,  upstream    
    
               client\_max\_body_size 10m;          #                
               client\_body\_buffer_size 128k;      #                  
           }
       }
    }
    

    웹 사이트 에는 여러 개의 웹 앱 설정 이 있 습 니 다.
    한 사이트 의 기능 이 점점 풍부 해 질 때 일부 기능 이 상대 적 으로 독립 된 모듈 을 분리 하고 독립 적 으로 유지 해 야 한다.이렇게 되면 보통 웹 앱 이 여러 개 있 습 니 다.
    예 를 들 어 www. javastack. cn 사이트 에 여러 개의 webapp, finance (금융), produt (제품), admin (사용자 센터) 이 있다 면.이 응용 프로그램 에 접근 하 는 방식 은 상하 문 (context) 을 통 해 구분 합 니 다.
  • www.javastack.cn/finance/
  • www.javastack.cnproduct/
  • www.javastack.cn/admin/

  • http 의 기본 포트 번 호 는 80 이라는 것 을 알 고 있 습 니 다. 한 서버 에서 이 세 개의 웹 앱 을 동시에 시작 하면 모두 80 포트 를 사용 하면 안 됩 니 다.따라서 이 세 가지 응용 프로그램 은 각각 다른 포트 번 호 를 연결 해 야 한다.
    그렇다면 문제 가 생 겼 습 니 다. 사용자 가 실제 www. javastack. cn 사 이 트 를 방문 할 때 서로 다른 웹 앱 을 방문 할 때 해당 하 는 포트 번 호 를 가지 고 방문 하 는 것 은 아 닙 니 다.그래서 당신 은 다시 역방향 대리 로 처리 해 야 합 니 다.
    설정 도 어렵 지 않 습 니 다. 어떻게 하 는 지 보 세 요.
    http {
       #          
    
       upstream product_server{
           server www.javastack.cn:8081;
       }
    
       upstream admin_server{
           server www.javastack.cn:8082;
       }
    
       upstream finance_server{
           server www.javastack.cn:8083;
       }
    
       server {
           #          
           #    product server
           location / {
               proxy_pass http://product_server;
           }
    
           location /product/{
               proxy_pass http://product_server;
           }
    
           location /admin/ {
               proxy_pass http://admin_server;
           }
    
           location /finance/ {
               proxy_pass http://finance_server;
           }
       }
    }
    

    https 역방향 프 록 시 설정
    보안 에 대한 요구 가 높 은 일부 사이트 에 서 는 HTTPS (ssl 통신 표준 을 사용 하 는 보안 HTTP 프로 토 콜) 를 사용 할 수 있 습 니 다.
    여 기 는 HTTP 프로 토 콜 과 SSL 표준 이 아 닙 니 다.그러나 nginx 설정 https 를 사용 하려 면 몇 가 지 를 알 아야 합 니까?
  • HTTPS 의 고정 포트 번 호 는 443 으로 HTTP 의 80 포트 와 다르다
  • SSL 표준 은 보안 인증 서 를 도입 해 야 하기 때문에 ngix. conf 에서 인증서 와 대응 하 는 key
  • 를 지정 해 야 합 니 다.
    다른 것 은 http 역방향 에이전트 와 마찬가지 로 서버 부분 설정 만 다 릅 니 다.
    #HTTP   
     server {
         #  443  。443      ,    HTTPS  
         listen       443 ssl;
    
         #    www.xx.com  
         server_name  www.javastack.cn;
    
         #ssl      (         :crt/pem)
         ssl_certificate      cert.pem;
         #ssl  key  
         ssl\_certificate\_key  cert.key;
    
         #ssl    (     )
         ssl\_session\_cache    shared:SSL:1m;
         ssl\_session\_timeout  5m;
         #    ,    MD5
         ssl_ciphers  HIGH:!aNULL:!MD5;
         ssl\_prefer\_server_ciphers  on;
    
         location / {
             root   /root;
             index  index.html index.htm;
         }
     }
    

    정적 사이트 설정
    때때로, 우 리 는 정적 사이트 (즉 html 파일 과 정적 자원 더미) 를 설정 해 야 한다.
    예 를 들 어 모든 정적 자원 이 / app / dist 디 렉 터 리 에 놓 여 있다 면 nginx. conf 에서 홈 페이지 와 이 사이트 의 host 만 지정 하면 됩 니 다.
    설정 은 다음 과 같 습 니 다:
    worker_processes  1;
    
    events {
       worker_connections  1024;
    }
    
    http {
       include       mime.types;
       default_type  application/octet-stream;
       sendfile        on;
       keepalive_timeout  65;
    
       gzip on;
       gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png;
       gzip_vary on;
    
       server {
           listen       80;
           server_name  static.zp.cn;
    
           location / {
               root /app/dist;
               index index.html;
               #        index.html
           }
       }
    }
    

    그리고 HOST 추가:
    127.0.0.1 static. zp. cn, 이 때 로 컬 브 라 우 저 에서 static. zp. cn 을 방문 하면 정적 사이트 에 접근 할 수 있 습 니 다.
    크로스 도 메 인 솔 루 션
    웹 분야 개발 에 서 는 앞 뒤 분리 모델 을 자주 사용한다.이러한 모드 에서 전단 과 백 엔 드 는 각각 독립 된 웹 프로그램 입 니 다. 예 를 들 어 백 엔 드 는 자바 프로그램 이 고 전단 은 React 또는 Vue 응용 입 니 다. 이 글 을 보십시오.
    각자 독립 된 웹 앱 이 서로 방문 할 때 반드시 크로스 필드 문제 가 존재 합 니 다.크로스 필드 문 제 를 해결 하 는 데 는 일반적으로 두 가지 사고 가 있다.
    CORS
    백 엔 드 서버 에 HTTP 응답 헤드 를 설정 하고 접근 할 도 메 인 이름 을 Access - Control - Allow - Origin 에 추가 합 니 다.
    jsonp
    백 엔 드 를 요청 에 따라 json 데 이 터 를 구성 하고 되 돌려 줍 니 다. 전단 은 jsonp 로 도 메 인 을 뛰 어 넘 습 니 다.
    이 두 가지 사고방식 은 본문 에서 토론 을 전개 하지 않 는 다.
    설명 이 필요 한 것 은 nginx 는 첫 번 째 사고 에 따라 크로스 도 메 인 을 해결 하 는 해결 방안 도 제공 했다.
    예 를 들 어 www. javastack. cn 사 이 트 는 전단 app, 백 엔 드 app 으로 구성 되 어 있 습 니 다.전단 포트 번 호 는 9000 이 고 백 엔 드 포트 번 호 는 8080 입 니 다.
    전단 과 백 엔 드 가 http 를 사용 하여 상호작용 을 할 때 요청 이 거 부 됩 니 다. 크로스 필드 문제 가 있 기 때 문 입 니 다.nginx 가 어떻게 해결 하 는 지 보 자.
    우선, enable - cors. conf 파일 에 cors 를 설정 합 니 다.
    # allow origin list
    set $ACAO '*';
    
    # set single origin
    if ($http_origin ~\* (www.javastack.cn)$) {
     set $ACAO $http_origin;
    }
    
    if ($cors = "trueget") {
       add_header 'Access-Control-Allow-Origin' "$http_origin";
       add_header 'Access-Control-Allow-Credentials' 'true';
       add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
       add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
    }
    
    if ($request_method = 'OPTIONS') {
     set $cors "${cors}options";
    }
    
    if ($request_method = 'GET') {
     set $cors "${cors}get";
    }
    
    if ($request_method = 'POST') {
     set $cors "${cors}post";
    }
    
    

    다음은 서버 에 include enable - cors. conf 를 포함 하여 크로스 도 메 인 설정 을 도입 합 니 다.
    # ----------------------------------------------------
    #        nginx     
    #       nginx config   include(  )
    #    copy     nginx  ,    
    # www.javastack.com       dns hosts     
    #   ,api     cors,              
    # ----------------------------------------------------
    upstream front_server{
     server www.javastack.cn:9000;
    }
    upstream api_server{
     server www.javastack.cn:8080;
    }
    
    server {
     listen       80;
     server_name  www.javastack.cn;
    
     location ~ ^/api/ {
       include enable-cors.conf;
       proxy_pass http://api_server;
       rewrite "^/api/(.*)$" /$1 break;
     }
    
     location ~ ^/ {
       proxy_pass http://front_server;
     }
    }
    
    

    이만 하면 완성 입 니 다.
    공중 호 자바 기술 스 택 에 주목 하여 '면접' 에 답 하여 내 가 정리 한 2020 가장 전면적 인 시험 문제 와 답 을 얻 었 다.
    제 블 로그 에 가서 더 많이 읽 는 것 을 추천 합 니 다.
    1. 자바 JVM, 집합, 다 중 스 레 드, 새로운 기능 시리즈 튜 토리 얼
    2. Spring MVC, Spring Boot, Spring Cloud 시리즈 튜 토리 얼
    3. Maven, Git, Eclipse, Intellij IDEA 시리즈 도구 튜 토리 얼
    4. 자바, 백 엔 드, 구조, 알 리 바 바 등 대형 공장 의 최신 면접 문제
    좋 은 것 같 아 요. 좋아요 + 리 트 윗 하 는 거 잊 지 마 세 요!

    좋은 웹페이지 즐겨찾기