개발 꿀팁/PHP

Nginx는 Upstream을 사용하여 동정을 분리한다

Jammie 2022. 10. 28. 11:32
반응형

하나, 왜 동선분리를 하는가

자원을 분리하고 불필요한 요청 소비를 줄이며 요청 지연 시간을 줄입니다.

비고: 여기서는 nginx가 정적 자원을 처리하고 apache가 동적 자원을 처리합니다.

장면 분석:

1, 분리되지 않은 장면의 단계

(1) 클라이언트에서 미들웨어로 url 요청(예: nginx, apache)

(2) 미들웨어는 url에 따라 해당 디렉토리를 요청하며, 프로그램 프레임워크

(3) 프로그램 프레임워크 실행 프로그램 논리

(4) 프로그램 논리 요청 해당 데이터 리소스

(5) 데이터 리소스를 클라이언트에 반환

참고: 사실 정적 리소스는 동적 요청을 거치지 않고 클라이언트에 직접 미들웨어를 반환하면 됩니다.그러니까 1단계와 5단계만 하면 되는 거예요

설정 파일 표시:

upstream php_api{
    #에이전트가 로컬 apache 서버에 요청하여 움직임 분리를 수행합니다(여기서 apache 기본 포트를 81로 변경합니다)
    server 127.0.0.1:81;
}
server {
    listen       80;
    server_name  www.xiaobudiu.top;
 
    access_log  /etc/nginx/logs/access/www.xiabudiu.top.access.log  main;
    root /data/www;
 
    location ~ \.php$ {
        #웹 사이트 방문의 url 접미사가 .php인 경우, 에이전트는 apache를 사용하여 분석합니다
        proxy_pass http://php_api;
        index  index.html index.htm;
    }
 
    #정적 자원이 요청되면 기본적으로 nginx로 처리됩니다
    location ~ \.(jpg|png|gif)$ {
        expires 1h;
        gzip on;
    }
 
    location /{
        index  index.html index.htm;
    }
 
 
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504 404 403  /404.html;
    location = /404.html {
        root   /data/errorPage;
    }
 
 
    location ~ /\.ht {
        deny  all;
    }
}

아니면 다음과 같습니다

upstream image {
    server  192.168.0.3:80;
    server  192.168.0.4:80;
}
 
upstream php {
    server  192.168.0.5:80;
    server  192.168.0.6:80;
}
 
server {
    listen       80;
    server_name  www.xiaobudiu.top;
 
    access_log  /etc/nginx/logs/access/www.xiabudiu.top.access.log  main;
 
    location  /{
        #만약 uri 접미사가 .php나 그림 접미사가 아니라면 로컬 서버로 가서 처리한다
        root data/www;
        index  index.php index.html;
    }
 
    location ~* \.php$ {
        #php 끝의 경우 역방향 에이전트가 upstream php 그룹에 폴링됨
        proxy_pass  http://php;
    }
 
    location ~* "\.(.jpg|png|jpeg|gif)" {
        #만약 .jpg, .png, .jpeg, .gif의 경우, 역방향 에이전트는 upstream image 그룹으로 폴링됩니다
        proxy_pass http://image;
    }
 
    # redirect server error pages to the static page /404.html
    error_page   500 502 503 504 404 403  /404.html;
    location = /404.html {
        root   /data/errorPage;
    }
 
    location ~ /\.ht {
        deny  all;
    }
 
}

비고: 이것은 하위 프로필에서 정의됩니다. 예를 들어 /etc/nginx/conf.d/www.xiaobudiu.top.conf 파일입니다.



물론 nginx는 에이전트에 대한 특정 요구 사항이 있기 때문에 다음과 같이 nginx.conf에서도 특정 정의를 내려야 합니다.

nginx.conf

user  nginx;
worker_processes  1;
worker_rlimit_nofile 65536;
 
error_log  /etc/nginx/logs/error/error.log warn;
pid        /var/run/nginx.pid;
 
 
events {
    worker_connections  1024;
    multi_accept on;
    use epoll;
}
 
 
http {
    include       /etc/nginx/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  /etc/nginx/logs/access/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    keepalive_timeout  65;
    client_max_body_size 20m;
 
    gzip  on;
    gzip_proxied any;
    gzip_comp_level 3;
    gzip_min_length 1k;
    gzip_buffers 16 32k;
    gzip_http_version 1.0;
    gzip_types text/plain text/css application/json application/xml+rss text/javascript image/jpeg image/gif image/png;
 
    fastcgi_buffers 256 16k;
    fastcgi_buffer_size 128k;
    fastcgi_connect_timeout 3s;
    fastcgi_send_timeout 120s;
    fastcgi_read_timeout 120s;
    reset_timedout_connection on;
    server_names_hash_bucket_size 100;
 
    include /etc/nginx/conf.d/*.conf;
 
}

마지막으로, 위의 프로필은 역방향 에이전트 및 로드 균형이 어떻게 달성되는지를 설명하기 위한 것일 뿐 실제 프로젝트를 결합하지 않는다는 점에 유의해야 합니다

 

반응형