모듈

이미지 압축

추천 수 6 댓글 3
Extra Form
자료 소개 첨부하는 이미지 파일을 압축
설치 경로 modules/imgopt
테스트 환경 Rhymix 2.0
라이선스 GPL v2
이름 버전 날짜 다운수
imgopt_1.0.1.zip 1.0.1 2023-06-24 230
imgopt.zip - 2023-05-28 1,131

v1.0.1 업데이트

주요 변경

  1. 개선: proc_open 함수 가능하고 ip.txt 파일을 작성하지 않았다면 curl 없이 proc_open 사용함.
    기존: ip.txt 파일 유무에 관계없이 항상 curl 처리하여 php-fpm 띄우는 비효율.
  2. 변경: myisam, innodb 둘 중에 db 설정된 type 만 create table 쿼리 버튼을 표시함.
    기존: myisam, innodb 선택권으로 초보(?)에게 혼동을 줄 수 있음.

기타 변경

  1. 개선: ip.txt 파일을 작성하지 않았다면 관리자 화면에 config 항목이 불필요하므로 비활성화

요약

  1. 성능과 보안이 조금 나아졌고 매뉴얼도 조금 친절해 졌습니다.

주요 특징

  • files 테이블에 첨부하는 이미지 파일을 압축 합니다.
  • 압축 대상: jpg(jpeg), png, gif, svg, webp
  • 효과: 운영중인 사이트에 첨부된 이미지 파일을 압축하여 약 5.5GB SSD 용량을 확보함.
    (direct_download=Y 조건의 첨부 파일이 약 57,000건 첨부되어 있음)

작동 방식

  1. optimize old images: 이미 첨부된 과거 파일을 대상 (수동)
  2. insert trigger (require): 첨부하는 신규 파일을 대상 (자동)
    이미지인 파일이 첨부 완료되면 압축을 실행합니다.
    압축에 성공하면 덮어씌우고 용량을 기록, 압축에 실패했다면 건너뜁니다.

설치 요구조건

  • Rhymix (XE 배제하진 않았으나 테스트하지 않았음)
  • 다음 명령어를 실행 가능해야 합니다: (일반 웹 호스팅 사용 불가!)
    composer install (modules/imgopt 경로에서 실행, 설치 링크)
    • Ubuntu
      sudo apt-get install jpegoptim optipng pngquant gifsicle webp
      sudo npm install -g svgo
    • Fedora/RHEL/CentOS
      sudo dnf install epel-release
      sudo dnf install jpegoptim optipng pngquant gifsicle libwebp-tools
      sudo npm install -g svgo
    • MacOS
      brew install jpegoptim optipng pngquant gifsicle webp
      npm install -g svgo

라이센스

매뉴얼

관심이 있으시다면: https://tradia.me/diablo2/rhymix/12111732

  • profile

    코어에서 지원하지 않는 부분을 적절하게 채워 주는 좋은 자료로군요.

    코어 개발자 입장에서 몇 가지 피드백을 드립니다. 비판이 아니라 더 유용한 자료가 되었으면 하는 마음에서 드리는 말씀이니, 님이 생각하고 계신 이 자료의 방향성과 맞지 않는다면 반영하지 않으셔도 무방합니다.

    1. MyISAM/InnoDB 테이블 타입은 라이믹스/XE 설치시 사용자가 선택하거나 자동으로 선택되고, 선택한 타입이 설정 파일에 기록됩니다. 라이믹스/XE 기반으로 동작하는 모듈이라면 이 설정을 따르는 것을 추천합니다. 만약 로그 테이블에만 특정 타입을 선택해야 할 필요가 있다 하더라도, 현재 선택된 기본값을 알려주면 좋을 것 같습니다.

    2. 실제 이미지 압축은 내부적으로 HTTP 요청을 해서 처리하고 있는데, 비동기식으로 처리하는 것도 아니면서 굳이 별도의 요청을 하는 것은 비효율적으로 보입니다. 시간은 똑같이 걸리고, 서버 프로세스를 하나 더 잡아먹을 뿐이지요. exec.php에 파일명을 넘기고 외부에서 임의로 호출하지 못하도록 막는 과정에서 보안취약점이 발생할 가능성도 배제할 수 없고요. 라이믹스 모듈의 컨트롤러 파일에서도 얼마든지 자체적으로 vendor/autoload.php를 인클루드하고 외부 라이브러리를 끌어와서 작업할 수 있으므로, 이 과정을 별도의 파일로 분리할 필요가 없습니다.

    3. 실제 적용사례에서 5.5GB의 용량이 절약되었다고 하셨는데, 원본 파일의 갯수만 언급하시고 원본의 총 용량을 알 수 없어서 그게 몇%나 절약된 건지 체감이 되지 않네요. 대부분의 이미지 포맷은 화질 설정을 조금만 바꿔도 수십%가 오락가락하기 때문에, 객관적인 비교 기준이 있으면 좋겠습니다. 화질을 그대로 유지하면서 용량만 줄여 준다는 것인지, 아니면 일정 수준의 화질로 자동 조정된다는 것인지...

  • profile ?

    댓글과 관심에 감사드립니다.
    기진곰님은 다 아실 내용이지만, 자료 사용하시는 분들이 참고하실 내용으로 적겠습니다.

    1. 테이블 설치는 가능하다면 innodb 선택을 추천 드립니다.
    2. php-fpm 보안을 빡세게 잡으면 curl http 요청으로 처리가 필요했으나, 거의 다수의 서버는 그렇게 막아둘리가 없으므로 exec.php 분리에 득이 없다는 말씀에 공감합니다.
    3. (아래 대댓글 내용으로 이어짐)


    1, 2번은 개선이 필요합니다. 그러나 잇점이 크지 않아서 메이저 업데이트를 진행할 때 알려주신 내용을 포함하겠습니다.

  • profile ?

    3. jpg 이미지는 퀄리티 85로 변환합니다. 다른 이미지는 무손실이나 손실이 거의 없는 수준에서 압축됩니다.

    그리고 참고하실 수 있도록 통계를 더 자세히 수집했습니다. (본문 예시와 동일한 실서비스 환경)

    통계.png

    SELECT `success` `분류(Y:자동,M:수동,N:실패)`,
    COUNT(`file_srl`) `카운트`, CONCAT(FORMAT(SUM(`ori_size`)/1024/1024, 0), 'MB') `원본 합`,
    CONCAT(FORMAT(SUM(`opt_size`)/1024/1024, 0),'MB') `결과 합`,
    CONCAT(FORMAT((SUM(`ori_size`) - SUM(`opt_size`)) / 1024 / 1024,0), 'MB') `확보 용량`,
    CONCAT(FORMAT(100 - SUM(`opt_size`) / SUM(`ori_size`) * 100, 1), '%') `압축 비율`
    FROM `td_imgopt`
    GROUP BY `success`