Ubuntu 26.04 & Apache2 환경에서 /home 디렉토리내 업로드 폴더 쓰기가 안될 경우

리눅스/APACHE|2026. 7. 21. 09:44
반응형

Apache 2.4.66 버전부터 업로드 디렉토리에 쓰기가 안되는 문제점이 확인 되었습니다.


[ 증상 ]

- uploads 폴더 권한을 707/777로 바꿔도 업로드 실패

- is_writable()은 true인데 실제 fopen()/move_uploaded_file()은 "Failed to open stream: Read-only file system" 에러 발생

- sudo -u www-data로 직접 쉘에서 쓰기 테스트하면 성공하는데 PHP(Apache)를 통해서만 실패

 

[ 원인 ]

Apache 2.4.66부터 Debian/Ubuntu 패키지 자체에서 systemd 하드닝(ProtectSystem=full, ProtectHome=read-only)을 기본 적용함.

Ubuntu 24.04에서는 없었고, 26.04(Apache 2.4.66 탑재)부터 기본 활성화됨.

 

 

1. 보안 설정 확인

 

# systemctl show apache2.service | grep ProtectHome

ProtectHome=read-only

 

 

2. 해결 (override로 uploads 경로만 예외 처리)


전체 /home을 rw로 풀면 보안이 약해지니, uploads 디렉토리만 명시적으로 쓰기 허용합니다.


mkdir -p /etc/systemd/system/apache2.service.d

cat > /etc/systemd/system/apache2.service.d/override.conf << 'EOF'
[Service]
ReadWritePaths=/home/sysdocu/public_html/file/uploads
EOF


만약 다른 웹앱들도 업로드/쓰기 디렉토리가 있다면, 그것들도 한 번에 같이 추가하는 게 좋습니다.

(필요한 다른 경로들도 같은 방식으로 추가)

 

cat > /etc/systemd/system/apache2.service.d/override.conf << 'EOF'
[Service]
ReadWritePaths=/home/sysdocu/public_html/file/uploads
ReadWritePaths=/home/sysdocu/public_html/share/uploads
EOF


변경 사항이 있다면 아래와 같이 반영합니다.

systemctl daemon-reload

systemctl restart apache2

 

적용한 설정을 확인합니다.

systemctl show apache2.service -p ReadWritePaths


uploads 경로가 목록에 나온다면, 웹에서 파일업로드가 잘 될 것입니다.

 

반응형

댓글()

스토리지 상태를 점검하기 위한 API 데몬 만들기

프로그래밍/BASH SHELL|2026. 1. 7. 10:24
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

AMD Radeon AI PRO R9700 두 장으로 vLLM 구동하기

리눅스/OS 일반|2026. 1. 5. 14:42
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

CSS Beautify 설치 및 사용법

리눅스/OS 일반|2025. 8. 19. 11:15
반응형

압축된(minified) CSS 파일은 한 줄로만 되어 있어 사람이 읽기 불편합니다.

이럴 때 cssbeautifier 도구를 사용하면 손쉽게 들여쓰기와 줄바꿈이 적용된 CSS 코드로 변환할 수 있습니다.

 

pip가 없다면 설치합니다.

# apt -y install python3-pip


그 다음 cssbeautifier 패키지를 설치합니다.

# pip install cssbeautifier

 

이제 준비된  CSS 파일을 표준 입력/출력 방식을 활용하여 사람이 읽기 편한 개행과 들여쓰기 처리를 합니다.

압축된 CSS 파일을 cat으로 읽어서 css-beautify에 전달하고, 결과를 새로운 파일로 저장하는 방법입니다.

# cat difficult.css | css-beautify > easy.css


이렇게 하면 difficult.css 파일이 보기 좋은 형태로 포맷팅되어 easy.css 파일에 저장됩니다.

 

반응형

댓글()

NGC(NVIDIA GPU Cloud)에서 Ollama 설치 및 모델 구동하기

AI|2025. 8. 13. 10:21
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

vi 에디터 기본 환경 설정

리눅스/OS 일반|2025. 6. 25. 08:42
반응형

현재 계정의 디렉토리에 .vimrc 파일을 생성하고 설정값을 저장만 하면 됩니다.

기본 설정이 안되어 있으면 새로운 파일을 편집하게 됩니다.

" 표시는 주석입니다.

 

# vi ~/.vimrc

" 검색 관련 설정
set hlsearch                    " 검색 결과 하이라이트
set incsearch                   " 실시간 검색
set ignorecase                  " 대소문자 무시
set smartcase                   " 스마트 대소문자

" 검색 하이라이트 색상 (노란 배경, 검은 글씨)
highlight Search ctermbg=yellow ctermfg=black guibg=yellow guifg=black

" 현재 검색 결과 색상 (빨간 배경, 흰 글씨)
highlight IncSearch ctermbg=red ctermfg=white guibg=red guifg=white

" 줄 번호 표시
"set number

" 구문 강조
syntax on

 

이제 vi 에디터를 사용하면 설정된 값이 적용되어 열리게 됩니다.

 

반응형

댓글()

wkhtmltopdf로 HTML 웹페이지 또는 웹문서를 PDF로 변환하기

리눅스/OS 일반|2025. 6. 12. 14:15
반응형

아래 페이지에가면 시스템 및 버전별 패키지를 배포하는데, 여기에서는 Ubuntu 24.04 시스템을 기준으로 설명드립니다.

https://wkhtmltopdf.org/downloads.html

 

Ubuntu 24.04 라 하더라도 최근에 나오는 버전은 없기때문에 Ubuntu 22.04 패키지를 다운로드해서 설치해야 합니다.

 

 

1. 다운로드 및 설치

 

# wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.jammy_amd64.deb

# dpkg -i wkhtmltox_0.12.6.1-2.jammy_amd64.deb

설치도중 추가 패키지 설치 내용이 나오면 아래 패키지도 같이 설치해 주세요.

# apt install -y xfonts-75dpi xfonts-base

 

한글 사용을 위해 무료폰트를 설치합니다.

# apt -y install fonts-nanum

# apt -y install fonts-noto-cjk fonts-unfonts-core

 

 

2. 사용방법

 

로컬의 파일 또는 웹사이트를 pdf 로 변환할 수 있습니다.

# wkhtmltopdf --encoding UTF-8 --enable-local-file-access report.html report.pdf

# wkhtmltopdf http://www.sysdocu.kr/text.html text.pdf

 

 

반응형

댓글()

watchdog 설정으로 시스템 다운시 재부팅하기

리눅스/OS 일반|2025. 6. 11. 16:58
반응형

watchdog 명령은 시스템을 주기적으로 감시하고, 문제가 감지되었을 때 자동으로 재부팅하도록 도와주는 데몬 프로그램입니다.

시스템이 멈추거나 심각한 장애 상태에 빠졌을 때 자동으로 복구되도록 하기 위해 사용됩니다.

 

# dnf -y install watchdog    // RockyLinux 에서

# apt -y install watchdog    // Ubuntu 에서

 

# systemctl enable watchdog

 

여기에서는 시스템이 행(Hang) 걸릴때 네트워크 연결이 안된다는 것을 이용해 '네트워크 연결 실패시 리부팅' 이라는 조건을 설정하였습니다.

하지만 행 걸린 시점에서 watchdog 이 제대로 동작할지는 모르겠네요...

# vi /etc/watchdog.conf

# 모든 ping 대상에 실패할 경우에만 재부팅을 트리거합니다.
# 5번 연속 실패해야 다운으로 간주
ping = 192.168.10.1
ping = 192.168.10.2
ping-count = 60

# 60초 동안 syslog 파일이 업데이트되지 않으면 재부팅 시도
change = /var/log/syslog 60

# 1분 평균 부하가 24를 초과하면 재부팅
max-load-1 = 24

# 이는 시스템이 매우 바쁘거나 멈추려고 할 때 watchdog이 확실하게 작동하도록 돕습니다.
# 1 (가장 높은 우선순위) ~ 99 (가장 낮은 우선순위)
realtime = yes
priority = 1

 

# systemctl restart watchdog

 

이제 네트워크 연결이 1분간 체크되지 않으면 시스템이 자동 리부팅 됩니다.

별도의 파일에 기록하도록 옵션 설정을 하지 않았으므로, 로그는 /var/log/messages 에 기록됩니다.

 

반응형

댓글()

AK82 Mechanical Keyboard Instruction Manual

자료실|2025. 5. 2. 07:14
반응형

AK82 Mechanical Keyboard Instruction Manual
ak82-mechanical-keyboard-instruction-manual-coonection-mode-multimedia-keys_1024x1024_2x.png
0.47MB

 

백라이트 모드 변경 : [FN] + \

 

반응형

댓글()

AMD GPU 리소스 모니터링 (amdgpu_top) 설치하기

AI|2025. 4. 29. 10:39
반응형

GPU 모니터링 도구는 몇가지 있지만 그 중에 더 많은 정보를 실시간으로 출력해주는 도구가 있어 소개합니다.

amdgpu_top은 AMD GPU의 사용률, 온도, 메모리 사용량 등을 실시간으로 확인할 수 있는 TUI 기반 도구입니다.

필자는 Ubuntu 24.04에서 AMD Radeon RX Vega 8을 정상적으로 사용하기 위해 아래 절차로 진행하였습니다.

 

 

1. 드라이버 설치 


AMD 공식 사이트에서 Ubuntu 24.04용 드라이버를 다운로드합니다.

# wget https://repo.radeon.com/amdgpu-install/6.3.2/ubuntu/noble/amdgpu-install_6.3.60302-1_all.deb

 

패키지 리스트를 업데이트 하고, 설치 작업을 계속 진행합니다.

# apt update && apt -y upgrade
# apt -y install "linux-headers-$(uname -r)" "linux-modules-extra-$(uname -r)"
# apt -y install python3-setuptools python3-wheel
# usermod -a -G render,video $LOGNAME
# wget https://repo.radeon.com/amdgpu-install/6.3.2/ubuntu/noble/amdgpu-install_6.3.60302-1_all.deb
# apt -y install amdgpu-install_6.3.60302-1_all.deb
# apt update
# apt -y install amdgpu-dkms rocm

# amdgpu-install -y --usecase=graphics

 

이후 리부팅을 해야 적용됩니다.

# reboot

 

 

2. amdgpu_top 설치

 

# git clone https://github.com/Umio-Yasuno/amdgpu_top.git

# cd amdgpu_top

# apt -y install cargo rustup

# rustup install nightly

# rustup default nightly

# cargo build --release

 

amdgpu_top 명령을 실행하여 모니터링을 시작합니다.

# ./target/release/amdgpu_top

 

반응형

댓글()

LLM 파일 형식 변환하기 (Safetensors to GGUF)

AI|2025. 4. 28. 08:47
반응형

huggingface_cli 또는 vllm 명령으로 다운로드 받은 Safetensors 형식의 LLM을 ollama 에서 사용하기 위해 GGUF 파일 형식으로 변환하는 작업입니다.

여기에서는 Gemma2:9b 모델을 예로 들었습니다.

 

 

1. HuggingFace LLM 다운로드

 

huggingface_hub 패키지를 설치하고 LLM 다운로드를 위한 파이썬 스크립트를 작성합니다.

(myenv) root@sysdocu:~# pip install huggingface_hub

(myenv) root@sysdocu:~# vi download.py

from huggingface_hub import snapshot_download

model_id= "unsloth/gemma-2-9b-it"

snapshot_download(repo_id=model_id, local_dir="downllm", local_dir_use_symlinks=False, revision="main")

 

작성한 파이썬 코드를 실행하여 LLM을 다운로드 합니다.

(myenv) root@sysdocu:~# python download.py

 

 

2. GGUF 형식 모델 생성

 

모델을 Safetensors 형식에서 GGUF 형식으로 변환하기 위한 환경을 구성합니다.

(myenv) root@sysdocu:~# git clone https://github.com/ggerganov/llama.cpp.git

(myenv) root@sysdocu:~# pip install -r llama.cpp/requirements.txt

(myenv) root@sysdocu:~# python llama.cpp/convert_hf_to_gguf.py downllm/ --outfile gemma2-9b.gguf

 

 

3. Ollama 모델 추가

 

Modelfile에 GGUL 모델을 지정하고 ollama 명령으로 모델을 생성합니다.

(myenv) root@sysdocu:~# echo "from ./gemma2-9b.gguf" > Modelfile

(myenv) root@sysdocu:~# ollama create gemma2:9b -f Modelfile

(myenv) root@sysdocu:~# ollama list

NAME               ID                     SIZE      MODIFIED
gemma2:9b2    26e0cfb6b65    18 GB    2 seconds ago

 

생성된 모델이 잘 실행됩니다.

(myenv) root@sysdocu:~# ollama run gemma2:9b "hello?"

Hello! 👋 How can I help you today? 😊

 

반응형

댓글()