업로드 파일 크기 제한 높게 올리기 (nginx, PHP 설정 – 워드프레스)

5

워드프레스 블로그, 사이트의 업로드 파일 크기의 최대치 제한은 약 2M 또는 8M 정도로 되어있을 겁니다. 하지만 이 제한은 큰 이미지, 비디오파일, 테마나 플러그인 zip 파일등을 업로드하는데 방해됩니다. 특히 유료테마를 구매했을 때 다운받은 zip을 업로드해 테마,플러그인을 설치할때 이런 용량 제한은 문제를 발생 시킬 수 있습니다.

서버에서 제한하는 것보다 큰 파일이나 이미지를 업로드하려고 하면 nginx 또는 워드프레스는 아래와 같은 에러를 내곤 합니다.

  • 413 Request Entity Too Large
  • The link you followed has expired. Please try again.
  • 테마 (플러그인) 설치 링크가 만료되었습니다. 재시도 하십시오.
  • HTTP error ( HTTP 오류)

이 문제를 해결하기위해서는 php.ini 파일 두 개에서 설정 문구를 찾아 수정하든지, 웹서버의 라우팅 설정파일 (아파치의 경우 .htaccess)에 문구를 삽입해야합니다. 여기에서는 php 설정파일과 nginx 설정파일을 수정하는 방법을 알아봅니다.

참고: Nginx, PHP 웹서버를 사용하는 워드프레스 사이트를 대상으로한 설명이지만, 워드프레스에대한 설정변경은 없이  php-fpm과 nginx에 대한 설정만 얘기하므로 LEMP 스택만 사용하는 개발 서버에도 해당되는 내용입니다.

참고하면 좋을 지식:

php.ini 위치와 수정할 값

php.ini 파일 두개를 수정해야하는데요. php.ini 파일은 아래 두개의 경로에 있을 겁니다. 이 때 자신의 서버에 설치된 php 버전이 7.0이라면 7.2 부분을 7.0으로 찾아보면 있을 겁니다. 또는 php5.ini 처럼 파일이름 뒤쪽에 버전넘버가 붙기도 합니다.

  • /etc/php/7.2/fpm/php.ini
  • /etc/php/7.2/cli/php.ini
FTP로 찾아본 php.ini 파일 위치
수정해야할 php.ini 파일은 두 군데

그런데 이 파일들의 소유자는 root 사용자라서 ubuntu 사용자로 접속한 FTP 프로그램으로는 바로 수정할 수 없습니다. 권한을 먼저 바꾸든지, CLI에서 곧바로 root 권한으로 수정해줘야합니다.

참고: FTP에서 수정하고 싶다면 콘솔에서 리눅스 웹서버에 접속해 아래 두 파일에 대한 권한번호를 777로 완전 개방하고 나면 FTP를 통해서 수정할 수 있게됩니다. 수정하고 나면 다시 664로 되돌려주는게 좋습니다.

sudo chmod 권한번호 /파일경로/php.ini파일명

두개의 php.ini 파일에대한 권한을 777로 변경했다

 

하지만 저는 어차피 CLI 사용을 해야하는 상황인관계로 위처럼 777 권한으로 변경하지 않고 곧바로 CLI 용 텍스트편집기 nano를 사용해 root 권한으로 파일을 수정할 건데요. php.ini 파일에서 변경해야할 설정문구는 아래와 같습니다.

  • upload_max_filesize
    • 파일에대한 최대 업로드 용량을 결정합니다.
  • post_max_size
    • POST 요청(HTTP 리퀘스트)를 통한 업로드 용량 제한치를 결정합니다.
  • memory_limit
    • PHP 스크립트가 얼마나 많은 메모리를 할당 받을 것인가를 결정하는데 upload_max_filesize의 값과 같거나 커야합니다. 
    • 참고: 워드프레스의 경우 설정파일(wp-config.php)에 define('WP_MEMORY_LIMIT', '64M');  처럼 문구를 추가해 변경 할 수도  있습니다.
  • max_execution_time
    • 실행 시간 제한입니다. 초단위 값을 넣습니다. 웹서버에서 fatal error: maximum execution time exceeded 같은 에러 메시지가 나온다면 이 값을 올려주면됩니다.
  • file_uploads  
    • On 으로 설정해야 파일을 업로드 할 수 있습니다. 이미 On으로 되어있을 겁니다.

 자신이 업로드하려는 파일이 20MB라고 한다면 위에서 각 3개의 세팅을 각각 25MB, 27MB, 30MB 정도로 설정해주면 된다고 하는데 대충 큰숫자로 통일하면 됩니다. max_execution_time 은 600으로 설정하겠습니다.

이런 값들은 플러그인이나 테마(특히 유료테마)들이 요구하는 최소 권장 값들에 따르면 됩니다.

php.ini 파일 수정하기

파일이 어디있는지, 수정해야할 값이 무엇인지 알았으니 이제 수정할 차례입니다. fpm 폴더에있는 php.ini 파일을 먼저 수정하겠습니다.

 /etc/php/7.2/fpm/php.ini 파일을 CLI에서 root로 수정하려면 sudo 접두사를 사용해서 아래와 같이 nano 편집기로 열어 수정을 시도합시다.

sudo nano /etc/php/7.2/fpm/php.ini

참고: nano 편집기 사용법

 

나노 에디터에서 파일이 열리고나면 control + w 를 눌러서 upload_max_filesize 문구를 입력해 찾은 다음 아래처럼 값을 입력해주세요. 저는 한번에 64메가바이트까지 업로드 할 수 있도록 upload_max_filesize = 64M 라고 입력했습니다.

upload max filesize = 64M

중요: 줄 시작부분에 세미콜론;이 붙어있으면 그줄은 주석문이 되어 동작하지 않는 것입니다. 만일 upload_max_filesize 앞에 세미콜론이 붙어있다면 제거해야합니다. 

 

또 다시  control + w 를 눌러서 단어를 찾아 아래처럼 숫자, 값을 모두 변경해주세요. 

  • upload_max_filesize = 64M
  • post_max_size = 64M
  • memory_limit = 256M
  • max_execution_time = 1000
  • file_uploads = On

참고: memory_limit = -1 에서 -1 값은 PHP 스크립트가 할당받는 메모리에 대한 제한을 최대치로 허가하는 설정값입니다. 무거운 사이트를 이용하거나 사양이 높은 컴퓨터를 쓴다면 -1값을 사용하는 것도 답입니다.

 

모두 수정했다면 control o 키 > 엔터키를 눌러 저장하고, control x > 엔터키를 눌러 nano 에디터를 종료합니다.

 

두 번째 파일인 cli 폴더의 php.ini도 위와 같은 방식으로 열어 같은 값으로 수정해주고 저장, 종료 해주세요.

sudo nano /etc/php/7.2/cli/php.ini

 

두 파일 모두 수정했다면 php-fpm을 재시작 해줘야합니다만, 아래에서 ningx 파일도 수정해준뒤 함께 재시작 해주겠습니다.

nginx.conf 파일에 내용추가

웹서버인 nginx의 설정파일 nginx.conf 파일을 수정해줍니다. CLI에서는 아래 명령어를 이용해 nano 편집기로 수정하면 됩니다.

sudo nano /etc/nginx/nginx.conf

파일의 내용 초반에있는 http {….} 블록 안에 client_max_body_size 라는 값을 설정해줘야합니다. client_max_body_size이 있다면 값만 수정해주고 없다면  #Basic Settings 라는 주석문 아래쪽에 다음과 같이 적어 넣도록 합시다. 저는 64MB의 용량을 허가하기 위해 64m으로 적었습니다.

client_max_body_size 64m;

그리고 이 파일에 온김에 아래 설정 문장도 함께 써줍니다. nginx 502 Bad Gateway 오류를 방지해주기위해 응답시간과 버퍼사이즈를 늘려주는 설정입니다.

fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

 

이 역시도 nginx를 재실행해줘야 적용됩니다.

php-fpm, nginx 재실행

php-fpm 재시작

아래 명령어를 입력해 php-fpm을 재시작할 수 있는데요. 

sudo service php7.2-fpm restart

위 명령어 중간에 php.7.2 라고 써진 부분은 제서버가 php7.2를 사용하기 때문입니다. 버전별로 버전번호를 붙여서 재실행 할 수도 있고 단순히 php-fpm 처럼 버전번호가 필요없을 수도 있습니다.

nginx 재시작

위에서 nginx 설정파일도 수정했으니 이제 nginx를 재시작 해줘야합니다. 

sudo nginx -t 

위 명령어로 설정파일 문법이 이상없는지 확인해봐서 …syntax is ok…test is successful 메시지가 나오는지 먼저 확인한다음 아래 재시작 명령어를 통해 재시작해주세요.

sudo service nginx restart

nginx 재시작 명령어 입력

워드프레스 멀티사이트 업로드 설정

추가로 WordPress 멀티사이트를 사용할 경우 최고관리자로 로그인해서 내사이트 > 네트워크 관리자 > 설정에 들어가 사이트 업로드 공간(Max upload file siz)에 대한 최대 한도 크기를 변경해줘야할 수도 있습니다.

워드프레스 멀티 사이트 서버 업로드 파일 설정

다음단계

시리즈 연재작 다음 단계로 워드프레스 홈페이지에 접속해 설정해봅시다

5 댓글

  1. nginx.conf 파일열면 아예 다르게 나옵니다 이것도 버젼없으로 인한것 같은데 완젼달라서 난감하네요 ㅎ

    client_max_body_size 64M;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    }

    #mail {

    # See sample authentication script at:

    # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript

    #

    # auth_http localhost/auth.php;

    # pop3_capabilities “TOP” “USER”;

    # imap_capabilities “IMAP4rev1” “UIDPLUS”;

    #

    server {

    listen localhost:110;

    • 써놓으신 client_max_body_size 64M; 부터

      ##
      # Virtual Host Configs
      ##
      include /etc/nginx/conf.d/*.conf;
      include /etc/nginx/sites-enabled/*;
      

      까지가 http {...} 블락안에 들어가는 내용입니다.

      그보다 위에 http { 로 시작하는 부분이 있을건데요.

      어쨌든
      client_max_body_size 64M;
      하위에 적어주시면 될것같습니다.

    • nginx.conf 파일 전체 내용은 아래와 같습니다.

      user www-data;
      worker_processes auto;
      pid /run/nginx.pid;
      
      events {
          worker_connections 768;
          # multi_accept on;
      }
      
      http {
      
          ##
          # Basic Settings
          ##
          client_max_body_size 100m;
          fastcgi_buffers 8 16k;
          fastcgi_buffer_size 32k;
          fastcgi_connect_timeout 300;
          fastcgi_send_timeout 300;
              fastcgi_read_timeout 300;
      
          sendfile on;
          tcp_nopush on;
          tcp_nodelay on;
          keepalive_timeout 65;
          types_hash_max_size 2048;
          # server_tokens off;
      
          # server_names_hash_bucket_size 64;
          # server_name_in_redirect off;
      
          include /etc/nginx/mime.types;
          default_type application/octet-stream;
      
          ##
          # SSL Settings
          ##
      
          ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
          ssl_prefer_server_ciphers on;
      
          ##
          # Logging Settings
          ##
      
          access_log /var/log/nginx/access.log;
          error_log /var/log/nginx/error.log;
      
          ##
          # Gzip Settings
          ##
      
          gzip on;
          gzip_disable "msie6";
      
          # gzip_vary on;
          # gzip_proxied any;
          # gzip_comp_level 6;
          # gzip_buffers 16 8k;
          # gzip_http_version 1.1;
          # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
      
          ##
          # Virtual Host Configs
          ##
      
          include /etc/nginx/conf.d/*.conf;
          include /etc/nginx/sites-enabled/*;
      }
      
      
      #mail {
      #  # See sample authentication script at:
      #  # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
      # 
      #  # auth_http localhost/auth.php;
      #  # pop3_capabilities "TOP" "USER";
      #  # imap_capabilities "IMAP4rev1" "UIDPLUS";
      # 
      #  server {
      #      listen     localhost:110;
      #      protocol   pop3;
      #      proxy      on;
      #  }
      # 
      #  server {
      #      listen     localhost:143;
      #      protocol   imap;
      #      proxy      on;
      #  }
      #}
      
      
      • 감사합니다.. 댓글달기 설정에 후속댓글을 이메일로 알립니다. 랑 새글이 올라오면 전자 우편으로 알림 받기 둘다 체크를 해두었는데
        세팅이 잘못된건지 멜로 안오네요 ㅎㅎ
        그래서 바쁘셔서 답글 안다신줄알았네요 직접 페이지 안들어오면 몰랐네요.

        • 지메일이면 아마도 스팸이나 프로모션,소셜 폴더 이런쪽으로 빠졌을 것같네요. 메일받은거에서 주소록에 스위프트코딩 추가를 눌러 주소록에 추가하시면 스팸으로는 빠지지 않을 거예요.

댓글은 익명이나 SNS, wordpress.com 로그인 지원). 마크다운 문법 사용가능(Shift+~ 키로 특정문구 혹은 위아래 ~~~으로감싸서 여러줄을 코드블락으로 작성)