이것은 어떻게 달성해야 할지 전혀 감이 안 잡히는 목표입니다. iOS 리버스 엔지니어로서, 소스 코드에서 서버가 이 이미지를 어떻게/어디서 보내는지 알면, 서버가 이 이미지를 로컬에서 어디에서 로드하는지 역추적할 수 있을 거라고 생각합니다. 하지만 저는 Ruby를 읽는 게 의사 코드(세우도 코드)를 읽는 것과 비슷할 정도라, 서버가 이 이미지를 보내는 위치를 찾는 것은 저에게 매우 큰 과제가 됩니다
소스 코드에 익숙한 사람이라면 훨씬 쉬울 텐데 말이에요
에서 모든 사용자의 업로드를 저장하는 uploads 테이블을 확인했습니다. 사용자 ID가 1637인 Baal998 사용자의 경우, SELECT * FROM uploads WHERE user_id = '1637'; 쿼리를 실행하면 다음과 같은 결과가 반환됩니다.
id | user_id | original_filename | filesize | width | height | url | created_at | updated_at | sha1 | origin | retain_hours | extension | thumbnail_width | thumbnail_height | etag | secure | access_control_post_id | original_sha1 | animated | verified | verification_status
------+---------+-------------------+----------+-------+--------+-----------------------------------------------------------------------------+----------------------------+----------------------------+------------------------------------------+--------+--------------+-----------+-----------------+------------------+------+--------+------------------------+---------------+----------+----------+---------------------
2210 | 1637 | 2.pic.jpg | 60610 | | | /uploads/default/original/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183.jpg | 2016-08-08 09:37:13.937306 | 2018-01-05 02:38:49.498264 | cb2188eaeecc3a648f021fa00da4734bd60ca183 | | | jpg | | | | f | | | | | 1
(1 row)
이는 Rails에서 Upload.find(user_avatar.custom_upload_id).url을 실행한 것과 동일한 결과입니다.
제 추측으로는 사용자가 아바타를 업로드한 후, Discourse가 원본 아바타 파일에 대해 어떤 작업을 수행하고 최적화된 파일을 다른 위치에 저장하는 것이 아닐까 싶습니다.
테이블 optimized_images에서 이 행이 의심스러웠습니다
id | sha1 | extension | width | height | upload_id | url | filesize | etag | version | created_at | updated_at
-------+------------------------------------------+-----------+-------+--------+-----------+----------------------------------------------------------------------------------------+----------+------+---------+----------------------------+----------------------------
49538 | e6dc9b0d6c18f2a4c3c0d2027534d01cfc89c84e | .jpg | 135 | 135 | 2210 | /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg | 10968 | | 2 | 2016-08-08 09:37:13.937306 | 2016-08-08 09:37:13.937306
(1 row)
sha1과 filesize는 https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png 와 일치하지만, 서버에는 이 파일이 존재하지 않습니다.
root@iosre:/var/discourse/shared/standalone# ls /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg
ls: cannot access /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg: No such file or directory
무엇이 잘못되었는지 전혀 모르겠습니다.
문제가 해결되었습니다:
포럼의 누군가가 이 아바타 이미지가 nginx 캐시에 proxy_cache_path 아래에 저장되어 있을 수 있다고 알려주었습니다. 보통 이 경로는 /var/nginx/cache인데, proxy_cache_path도 /var/nginx/cache도 찾을 수 없었습니다.
그분의 조언을 받아 launcher enter app 명령을 통해 discourse 앱으로 진입했고, 그제서야 nginx 캐시를 발견했습니다:
root@iosre:/var/discourse/shared# /var/discourse/launcher enter app
WARNING: Docker version 17.05.0-ce deprecated, recommend upgrade to 17.06.2 or newer.
root@iosre-app:/var/www/discourse# cd /var/nginx/cache
root@iosre-app:/var/nginx/cache# ls
0 1 2 3 4 5 6 7 8 9 a b c d e f
root@iosre-app:/var/nginx/cache#
그리고 모든 캐시를 삭제했습니다:
root@iosre-app:/var/nginx/cache# ls
root@iosre-app:/var/nginx/cache#
이미지가 사라졌습니다.