Nginx 간이 튜 토리 얼

14671 단어
Nginx 간이 튜 토리 얼
본 고 는 Nginx 의 간단 한 튜 토리 얼 로 초보 자 들 이 Nginx 에 신속하게 입문 하도록 돕 는 데 목적 을 둔다.
나 는 Github 에 Nginx 튜 토리 얼 프로젝트 를 만 들 었 다. nginx - tutorial.
튜 토리 얼 에 서 는 자주 사용 되 는 장면 의 Nginx 예 시 를 제공 합 니 다. 예 시 는 스 크 립 트 원 키 로 시작 하여 초보 자 들 이 쉽게 공부 할 수 있 습 니 다.
개술
Nginx 가 뭐 예요?
Nginx (engine x) 는 경량급 웹 서버, 역방향 프 록 시 및 이메일 (IMAP / POP 3) 프 록 시 서버 다.
역방향 대리 란 무엇 입 니까?
역방향 프 록 시 (Reverse Proxy) 방식 은 프 록 시 서버 로 인터넷 의 연결 요청 을 받 은 다음 내부 네트워크 에 있 는 서버 에 전송 요청 을 하고 서버 에서 얻 은 결 과 를 인터넷 에서 연결 을 요청 하 는 클 라 이언 트 에 게 되 돌려 주 는 것 을 말한다. 이때 프 록 시 서 비 스 는 대외 적 으로 역방향 프 록 시 서버 로 나타난다.
설치 및 사용
설치 하 다.
nginx 홈 페이지 다운로드 주소
발표 버 전 은 Linux 와 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,         ,     web  。
nginx -s quit           Nginx,      ,      web  。
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.helloworld.com;

        #  
        index index.html

        #  webapp   
        root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp;

        #    
        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:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp\views;
            #  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 설정 한 포트 와 일치 해 야 합 니 다.
  • host 변경: C: \ Windows \ System 32 \ \ drivers \ etc 디 렉 터 리 에 있 는 host 파일 에 DNS 기록 추가
  • 127.0.0.1 www.helloworld.com
  • 앞의 startup. bat 명령 시작
  • 브 라 우 저 에서 www. helloworld. com 을 방문 하면 의외 의 사고 없 이 이미 방문 할 수 있다.

  • 부하 균형 설정
    이전 예 에서 프 록 시 는 서버 만 가리 키 고 있 습 니 다.
    그러나 사 이 트 는 실제 운영 과정 에서 대부분 여러 대의 서버 가 같은 앱 을 실행 하고 있 기 때문에 부하 균형 을 사용 하여 분류 해 야 한다.
    nginx 도 간단 한 부하 균형 기능 을 실현 할 수 있다.
    이러한 응용 장면 을 가정 하면 192.168.1.11: 80, 192.168.1.12: 80, 192.168.1.13: 80 세 대의 Liux 환경의 서버 에 응용 할 것 이다.사이트 도 메 인 이름 은 www. helloworld. com 이 고 인터넷 IP 는 192.168.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.helloworld.com;
    
            #             
            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. helloworld. com 사이트 에 여러 개의 웹 앱, finance (금융), produt (제품), admin (사용자 센터) 이 있다 면.이 응용 프로그램 에 접근 하 는 방식 은 상하 문 (context) 을 통 해 구분 합 니 다.
    www.helloworld.com/finance/
    www.helloworld.com/product/
    www.helloworld.com/admin/
    http 의 기본 포트 번 호 는 80 이라는 것 을 알 고 있 습 니 다. 한 서버 에서 이 세 개의 웹 앱 을 동시에 시작 하면 모두 80 포트 를 사용 하면 안 됩 니 다.따라서 이 세 가지 응용 프로그램 은 각각 다른 포트 번 호 를 연결 해 야 한다.
    그렇다면 문제 가 생 겼 습 니 다. 사용자 가 실제 www. helloworld. com 사 이 트 를 방문 할 때 서로 다른 웹 앱 을 방문 할 때 해당 하 는 포트 번 호 를 가지 고 방문 하 는 것 은 아 닙 니 다.그래서 당신 은 다시 역방향 대리 로 처리 해 야 합 니 다.
    설정 도 어렵 지 않 습 니 다. 어떻게 하 는 지 보 세 요.
    http {
        #          
    
        upstream product_server{
            server www.helloworld.com:8081;
        }
    
        upstream admin_server{
            server www.helloworld.com:8082;
        }
    
        upstream finance_server{
            server www.helloworld.com: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 역방향 에이전트 와 마찬가지 로 Server 부분 에서 만 설정 이 다 릅 니 다.
      #HTTP   
      server {
          #  443  。443      ,    HTTPS  
          listen       443 ssl;
    
          #    www.xx.com  
          server_name  www.helloworld.com;
    
          #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 을 방문 하면 정적 사이트 에 접근 할 수 있 습 니 다.
    파일 서버 구축
    때때로 팀 은 데이터 나 자 료 를 압축 해 야 하기 때문에 파일 서버 가 없어 서 는 안 된다.Nginx 를 사용 하면 간단 하고 편리 하 게 파일 서 비 스 를 구축 할 수 있 습 니 다.
    Nginx 의 설정 요점:
  • autoindex 를 열 면 디 렉 터 리 를 표시 할 수 있 고 기본적으로 열지 않 습 니 다.
  • autoindexexact_size 가 열 리 면 파일 의 크기 를 표시 할 수 있 습 니 다.
  • autoindexlocaltime 이 열 리 면 파일 의 수정 시간 을 표시 할 수 있 습 니 다.
  • 루트 는 파일 서비스 로 열 린 루트 경 로 를 설정 합 니 다.
  • charset 는 charset utf-8,gbk; 로 설정 되 어 중국어 난 코드 문 제 를 피 할 수 있 습 니 다 (windows 서버 에서 설정 한 후에 도 난 코드 를 사용 하여 본인 은 잠시 해결 방법 을 찾 지 못 했 습 니 다).

  • 가장 간단 한 설정 은 다음 과 같 습 니 다.
    autoindex on;#     
    autoindex_exact_size on;#       
    autoindex_localtime on;#       
    
    server {
        charset      utf-8,gbk; # windows        ,    ,    
        listen       9050 default_server;
        listen       [::]:9050 default_server;
        server_name  _;
        root         /share/fs;
    }

    크로스 도 메 인 솔 루 션
    웹 분야 개발 에 서 는 앞 뒤 분리 모델 을 자주 사용한다.이 모드 에서 전단 과 백 엔 드 는 각각 독립 된 웹 프로그램 입 니 다. 예 를 들 어 백 엔 드 는 자바 프로그램 이 고 전단 은 React 또는 Vue 응용 입 니 다.
    각자 독립 된 웹 앱 이 서로 방문 할 때 반드시 크로스 필드 문제 가 존재 합 니 다.크로스 필드 문 제 를 해결 하 는 데 는 일반적으로 두 가지 사고 가 있다.
  • CORS

  • 백 엔 드 서버 에 HTTP 응답 헤드 를 설정 하고 접근 할 도 메 인 이름 을 추가 합 니 다 Access-Control-Allow-Origin.
  • jsonp

  • 백 엔 드 를 요청 에 따라 json 데 이 터 를 구성 하고 되 돌려 줍 니 다. 전단 은 jsonp 로 도 메 인 을 뛰 어 넘 습 니 다.
    이 두 가지 사고방식 은 본문 에서 토론 을 전개 하지 않 는 다.
    설명 이 필요 한 것 은 nginx 는 첫 번 째 사고 에 따라 크로스 도 메 인 을 해결 하 는 해결 방안 도 제공 했다.
    예 를 들 어 www. helloworld. com 사 이 트 는 전단 app, 백 엔 드 app 으로 구성 된다.전단 포트 번 호 는 9000 이 고 백 엔 드 포트 번 호 는 8080 입 니 다.
    전단 과 백 엔 드 가 http 를 사용 하여 상호작용 을 할 때 요청 이 거 부 됩 니 다. 크로스 필드 문제 가 있 기 때 문 입 니 다.nginx 가 어떻게 해결 하 는 지 보 자.
    우선, enable - cors. conf 파일 에 cors 를 설정 합 니 다.
    # allow origin list
    set $ACAO '*';
    
    # set single origin
    if ($http_origin ~* (www.helloworld.com)$) {
      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.helloworld.com       dns hosts     
    #   ,api     cors,              
    # ----------------------------------------------------
    upstream front_server{
      server www.helloworld.com:9000;
    }
    upstream api_server{
      server www.helloworld.com:8080;
    }
    
    server {
      listen       80;
      server_name  www.helloworld.com;
    
      location ~ ^/api/ {
        include enable-cors.conf;
        proxy_pass http://api_server;
        rewrite "^/api/(.*)$" /$1 break;
      }
    
      location ~ ^/ {
        proxy_pass http://front_server;
      }
    }

    이만 하면 완성 입 니 다.
    레 퍼 런 스
    Nginx 의 중국어 위 키

    좋은 웹페이지 즐겨찾기