Nginx 입문 (1) Nginx 웹 서버 설정

13956 단어
Nginx 입문 (1) Nginx 웹 서버 설정
머리말
Nginx 는 고성능 웹 과 역방향 프 록 시 서버 로 인터넷 회사 에서 광범 위 하 게 응용 된다.갓 입사 한 샤 오 백 은 9 월 말 에 회사 사이트 의 HTTPS 개 조 를 겪 었 습 니 다. nginx 를 직접 배치 하지 않 았 지만 처음에 Nginx 설정 을 보 았 을 때 어 리 석 었 습 니 다. (왜 본과 학 교 는 전문 적 으로 배우 지 않 았 습 니까?% >
Nginx 설치
먼저 Nginx 의 다양한 시스템 에서 의 설 치 를 소개 합 니 다.
# CentOS
yum install nginx;
# Ubuntu
sudo apt-get install nginx;
# Mac
brew install nginx;

본 고 는 주로 Mac 에서 설 치 된 것 을 예 로 들 수 있 습 니 다. homebrew 를 통 해 nginx 는 기본적으로 /usr/local/Cellar/nginx/ 디 렉 터 리 에 설치 되 어 있 습 니 다. conf 설치 디 렉 터 리 는 /usr/local/etc/nginx/nginx.conf 시작, 열 재 부팅, 닫 기 및 테스트 설정 명령 이 다음 과 같 습 니 다.
#   
nginx -s start;
#     ,   ,           
nginx -s reload;
#   
nginx -s stop;
#      ,                  
nginx -t;

브 라 우 저 에 입력http://localhost:8080nginx 의 환영 인터페이스 에 접근 할 수 있 습 니 다. 그렇다면 왜 nginx 의 환영 인터페이스 에 접근 하 였 습 니까? nginx. conf 를 열 어 이 파일 을 분석 해 보 세 요. nginx 설정 에서 # 설명 을 표시 합 니 다.
#user  nobody;
##       Nginx   Linux    

worker_processes  1;
##     。      CPU        

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
##  Nginx      


#pid        logs/nginx.pid;
##Nginx     ID(PID)

events {
    worker_connections  1024;
    ##  worker_connections worker_processes  maxclients。
    ##max_clients = worker_processes * worker_connections
}


http {
    include       mime.types;
    ## /opt/nginx/conf/mime.types      http     
    
    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  logs/access.log  main;

    sendfile        on;
    ##                 ,sendfile       ,         ,         。
    #tcp_nopush     on;
##  nginx  ,tcp_nopush     tcp_nodelay "  "。               。    ,          0.2      ,               。  nginx  ,tcp_nopush    sendfile     。
    #keepalive_timeout  0;
    keepalive_timeout  65;
    ##           

    #gzip  on;
##      gzip  
    server {
      ##             ,           server  ,  include  
        listen       8080;
     ##  Nginx TCP  ,  HTTP  。listen 80;   listen *:80;    
        server_name  localhost;
        ##         
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
        ##location      nginx        
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    include servers/*;
}

위의 기본 설정 은 매우 많 지만 전체적으로 세 개의 모듈 로 요약 할 수 있 습 니 다.
 
#    
events {
    #events  
}

http 
{

   #http    
 
    server 
    {
    
        #server    
     
        location [PATTERN]{
           #location  
        }
    }

}  

1. 전역 블록: nginx 전역 에 영향 을 주 는 명령 을 설정 합 니 다. 일반적으로 nginx 서버 를 실행 하 는 사용자 그룹, nginx 프로 세 스 pid 저장 경로, 로그 저장 경로, 프로필 도입, worker process 수 생 성 등 이 있 습 니 다.
2. 이벤트 블록: nginx 서버 나 사용자 와 의 네트워크 연결 에 영향 을 주 는 설정 을 설정 합 니 다. 각 프로 세 스 의 최대 연결 수가 있 습 니 다. 어떤 이벤트 구동 모델 을 선택 하여 연결 요청 을 처리 할 지, 여러 네트워크 연결 을 동시에 받 아들 일 수 있 는 지, 여러 네트워크 연결 직렬 화 를 시작 할 수 있 는 지 등 이 있 습 니 다.
3. http 블록: 여러 개의 server, 프 록 시, 캐 시, 로그 정의 등 절대 다수의 기능 과 제3자 모듈 의 설정 을 포함 할 수 있 습 니 다. 예 를 들 어 파일 도입, mime - type 정의, 로그 사용자 정의, sendfile 전송 파일 사용 여부, 연결 시간 초과, 단일 연결 요청 수 등 입 니 다.
4. server 블록: 가상 호스트 의 관련 매개 변 수 를 설정 합 니 다. http 에 여러 개의 server 가 있 을 수 있 습 니 다.
5. location 블록: 요청 한 경로 와 각종 페이지 의 처리 상황 을 설정 합 니 다.
Nginx 웹 서버 설정
먼저 웹 서 비 스 를 간단하게 설정 한 다음 에 각 중요 한 점 에 대해 간단하게 설명 합 니 다. 이 사례 에서 역방향 대리 에 관 한 요점 은 다음 편 에서 소개 합 니 다.
기록 하 다
###########            。#################
#user administrator administrators;  #       ,   nobody nobody。
#worker_processes 2;  #        ,   1
#pid /nginx/pid/nginx.pid;   #  nginx          
error_log log/error.log debug;  #      ,  。           ,http ,server ,     :debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #         ,        ,   on
    multi_accept on;  #                  ,   off
    #use epoll;      #      ,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #     ,   512
}
http {
    include       mime.types;   #             
    default_type  application/octet-stream; #      ,   text/plain
    #access_log off; #          
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #     
    access_log log/access.log myFormat;  #combined         
    sendfile on;   #  sendfile      ,   off,   http ,server ,location 。
    sendfile_max_chunk 100k;  #                    ,   0,     。
    keepalive_timeout 65;  #      ,   75s,   http,server,location 。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #  
    }
    error_page 404 https://www.baidu.com; #       
    server {
        keepalive_requests 120; #         。
        listen       4545;   #    
        server_name  127.0.0.1;   #           
        location  ~*^.+$ {       #   url  ,    ,~      ,~*       。
           #root path;  #   
           #index vv.txt;  #     
           proxy_pass  http://mysvr;  #    mysvr         
           deny 127.0.0.1;  #   ip
           allow 172.18.5.54; #   ip           
        } 
    }
} 

도 메 인 이름과 포트 설정
상기 예 에서 listen 4545; # 감청 포트 는 4545 라 고 밝 혔 다. 그러나 한 소 백 에 게 는 가끔 listen [::]:80;, listen :80;, listen *:80; 이 세 가지 글 씨 를 보면 어 리 석 을 때 가 있다. 그렇다면 그들 사이 에는 어떤 차이 가 있 을 까?listen [::]:80; Nginx 는 IPv 4 와 IPv 6 의 80 포트 를 동시에 감청 할 것 이 라 고 밝 혔 다. listen :80; 이 두 가지 표기 법 은 같다.
위치 에서 URL 일치
상기 예 에서 location 뒤에 따 르 는 정규 가 일치 하 는 것 을 발 견 했 습 니 다. 사실은 nginx 에서 location url 매 칭 은 일정한 우선 순 위 를 따 릅 니 다.
location = / {
    #       =
    #       ~
    #       ~*
}
location ^~ /images/ {
    #        ^~
     #       /images/      ,      ,        ,     。
}
location ~* \.(gif|jpg|jpeg)$ {
    # ~*           ,      
    # ~           ,     
    #       gif,jpg jpeg      
}
location / {
    #         ,     
}

location 의 우선 순 위 는 다음 과 같 습 니 다.
(location =) > (location 전체 경로) > (location ^ ~ 경로) > (location, * 정규 순서) > (location 부분 시작 경로) > (/)
location = / {
#      
[ configuration A ]
}
location / {
#      /      。               ,         。            ,          。
[ configuration B ]
}
location /documents/ {
#       /documents/      。               ,         。
#            ,          。
[ configuration C ]
}
location ^~ /images/ {
#       /images/       ,      ,       。  ,           location, 
#      
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
#       gif jpg jpeg     。     /images/     ,    Configuration D
[ configuration E ]
}

파일 경로 정의
location 모듈 에서 루트 디 렉 터 리 설정 과 같은 파일 경 로 를 정의 할 수 있 습 니 다.
location / {
    root /home/barret/test/;
}

홈 페이지 설정:
index /html/index.html /php/index.php;

try files 설정 try file 은 파일 이 존재 하 는 지 확인 하고 찾 은 첫 번 째 파일 을 사용 하여 되 돌려 주 는 기능 입 니 다. 찾 은 파일 이 하나 도 없 으 면 마지막 매개 변수 가 지정 한 URI 로 다시 설정 합 니 다. 예:
location /images/ {
    try_files $uri /images/default.gif;
}

location = /images/default.gif {
    expires 30s;
}

ps: $uri 는 요청 인자 가 없 는 현재 URI 입 니 다. 다음 전역 변수 에서 설명 합 니 다. 마지막 인자 도 이름 을 가 진 location 일 수 있 습 니 다. 다음 과 같 습 니 다.
try_files $uri $uri.html $uri/index.html @other;
location @other {
    #        uri    ,           
    proxy_pass  http://localhost:9000;
}

location / {
    #        uri    ,        502
    try_files $uri $uri.html =502;
}

Rewrite 리 셋
하면, 만약, 만약...http://www.jianshu.com/users/10001 다시 쓴다http://www.jianshu.com/show?user=10001, rewrite 규칙 을 사용 할 수 있 습 니 다. 아래 코드 를 참조 하 십시오. 저 는 회사 사이트 의 개조 과정 에서 rewrite 를 만 났 습 니 다. URL 을 다시 쓰 는 목적 은 더 좋 은 SEO 를 위 한 것 입 니 다.
location /users/ {
    rewrite ^/users/(.*)$ /show?user=$1 break;
}

rewrite 기능 은 nginx 가 제공 하 는 전역 변수 나 자신 이 설정 한 변 수 를 사용 하여 정규 표현 식 과 표지 위 치 를 결합 하여 url 재 작성 과 재 설정 을 실현 하 는 것 입 니 다.
rewrite 규칙 방향 경로 재 작성 형식;
1. 규칙: 일치 하 는 대상 url 2, 방향 지정 경 로 를 문자열 이나 정규 로 표시 할 수 있 습 니 다. 규칙 에 일치 하 는 경 로 를 표시 합 니 다. 규칙 에 정규 가 있 으 면 $index 를 사용 하여 정규 캡 처 그룹 3, 재 작성 형식 을 표시 할 수 있 습 니 다. last: Apache 리드 (L) 에 해당 합 니 다.태그, rewrite 완료, 브 라 우 저 주소 표시 줄 URL 주 소 는 break 변 하지 않 습 니 다. 이 규칙 은 일치 가 완료 되면 일치 하지 않 습 니 다. 다음 규칙 과 일치 하지 않 습 니 다. 브 라 우 저 주소 표시 줄 URL 주 소 는 redirect 변 하지 않 습 니 다. 302 임시 방향 으로 돌아 가면 브 라 우 저 주 소 는 점프 후의 URL 주 소 를 표시 합 니 다 permanent: 301 영구 방향 으로 돌아 갑 니 다. 브 라 우 저 주소 표시 줄 은 점프 후의 URL 을 표시 합 니 다.주소.
break 와 last 의 차이
  • last 는 보통 server 와 if 에 쓰 이 고 break 는 location 에 사용 합 니 다
  • last 는 재 작성 후의 url 매 칭 을 중지 하지 않 습 니 다. 즉, 새로운 url 은 server 에서 매 칭 절 차 를 한 번 더 걷 고 break 는 재 작성 후의 매 칭 을 중지 합 니 다
  • break 와 last 는 뒤의 rewrite 명령 을 계속 수행 할 수 있 습 니 다. location 에서 break 로 돌아 가면 바로 효력 이 발생 하고 후속 적 인 일치 location 을 중단 합 니 다. 예 를 들 어
  • server {
        location / {
            rewrite /last/ /q.html last;
            rewrite /break/ /q.html break;
        }
        location = /q.html {
            return 400;
        }
    }
    
  • / last / 에 접근 할 때 / q. html 로 다시 쓰 고 새로운 uri 를 사용 하여 일치 합 니 다. location = / q. html 에 딱 맞 게 400
  • 을 되 돌려 주 었 습 니 다.
  • 방문 / break 시 / q. html 로 다시 쓰 고 break 로 되 돌아 오 면 바로 멈 춥 니 다
  • if 표현 식
    위의 간단 한 재 작성 은 수 요 를 만족 시 키 지 못 할 때 가 많 습 니 다. 예 를 들 어 파일 이 존재 하지 않 을 때, 경로 가 xx 를 포함 할 때 등 조건 을 판단 해 야 할 때 if 의 문법 은 다음 과 같 습 니 다.
    if (   ) {
    }
    

    내 장 된 전역 변수:
    $args :             , $query_string
    $content_length :      Content-length  。
    $content_type :      Content-Type  。
    $document_root :      root       。
    $host :        ,        。
    $http_user_agent :    agent  
    $http_cookie :    cookie  
    $limit_rate :             。
    $request_method :         ,   GET POST。
    $remote_addr :     IP  。
    $remote_port :       。
    $remote_user :     Auth Basic Module      。
    $request_filename :          , root alias   URI    。
    $scheme : HTTP  ( http,https)。
    $server_protocol :        ,   HTTP/1.0 HTTP/1.1。
    $server_addr :      ,                 。
    $server_name :      。
    $server_port :            。
    $request_uri :          URI,      , :”/foo/bar.php?arg=baz”。
    $uri :          URI,$uri      , ”/foo/bar.html”。
    $document_uri :  $uri  。
    

    내 장 된 조건 판단:
    - f 와! - f 는 파일 이 존재 하 는 지 여 부 를 판단 하 는 데 사 용 됩 니 다. - d 와! - e 는 파일 이나 디 렉 터 리 가 존재 하 는 지 여 부 를 판단 하 는 데 사 용 됩 니 다. - x 와! - x 는 파일 이 실행 가능 한 지 여 부 를 판단 하 는 데 사 용 됩 니 다.
    설정 파일 에서 볼 때 가 있 습 니 다 listen *:80;. 그 와 $http_host 는 어떤 차이 가 있 습 니까?$host$http_host 모두 원시 적 인 'HOST' 필드 입 니 다. 예 를 들 어 요청 할 때 HOST 의 값 은 $host 이 고 반 대 된 후에 도 www.csdn.net 클 라 이언 트 가 보 낸 요청 의 header 에 'HOST' 라 는 필드 가 없 을 때 www.csdn.net 를 사용 하 는 것 을 권장 합 니 다. 이때 $host$host 와 같 습 니 다.
    if 표현 식 예:
    #           400
    if (!-f $request_filename) {
        return 400;
    }
    #   host  xuexb.com, 301 xuexb.com 
    if ( $host != 'xuexb.com' ){
        rewrite ^/(.*)$ https://xuexb.com/$1 permanent;
    }
    #         POST   405
    if ($request_method = POST) {
        return 405;
    }
    #        a=1  301     
    if ($args ~ a=1) {
        rewrite ^ http://example.com/ permanent;
    }
    

    if 는 보통 location 규칙 과 조합 하여 사용 합 니 다. 예 를 들 어:
    #    /test.html  
    location = /test.html {
        #     xiaowu
        set $name xiaowu;
        #        name=xx      
        if ($args ~* name=(\w+?)(&|$)) {
            set $name $1;
        }
        # 301
        rewrite ^ /$name.html permanent;
    }
    

    위 에 표시:
  • /test.html => /xiaowu.html
  • /test.html?name=ok => /ok.html?name=ok

  • 본 고 는 주로 다음 과 같은 이 문헌 을 참고 한다.http://www.linuxeye.com/configuration/2657.html
    읽 어 주 셔 서 감사합니다. 다음 글 은 Nginx 의 역방향 프 록 시 설정 을 소개 합 니 다.

    좋은 웹페이지 즐겨찾기