WSL Ubuntu + XAMPP 설치·설정 & 트러블슈팅 — 대화 정리 (Dark Mode, Tistory)

WSL2 Ubuntu에서 XAMPP(PHP+MariaDB)를 설치·설정하며 겪은 이슈와 해결책을 Q&A 형식으로 정리했습니다. (Dark Mode)

목차

  1. WSL Ubuntu에 XAMPP 설치
  2. MySQL 외부 접속 허용 & 포트 확인
  3. vhost 설정 후 접근 거부(403)
  4. dummy vhost 경고 및 정리
  5. vhost 설정 예시 점검
  6. httpd -S로 vhost 매칭 확인
  7. 심볼릭 링크/권한(namei) 이슈
  8. 80포트 기본 루트를 myapp으로
  9. PHP 세션 Permission denied
  10. PHP 8: Optional parameter 경고
  11. PHP 에러를 localhost-error.log에 기록
  12. DB 접속 Access denied
  13. 설치된 PHP에서 Deprecated 숨기기
Q

WSL Ubuntu 시스템에 XAMPP(PHP + MariaDB)를 구성하려면?

두 가지 경로가 있음: (1) WSL Ubuntu 내부에 XAMPP 설치(권장), (2) Windows에 XAMPP 설치 후 WSL에서 접근.

A
# systemd 활성화
sudo nano /etc/wsl.conf
[boot]
systemd=true

# PowerShell에서
wsl --shutdown

# XAMPP 설치 (버전은 공식 사이트에서 다운로드 링크주소 확인:변경될 수 있음.)
wget https://downloads.apachefriends.org/xampp/xampp-linux-x64-8.2.x-0-installer.run
chmod +x xampp-linux-x64-8.2.x-0-installer.run
sudo ./xampp-linux-x64-8.2.x-0-installer.run

# 시작/중지/상태
sudo /opt/lampp/lampp start
sudo /opt/lampp/lampp stop
sudo /opt/lampp/lampp status

웹 루트: /opt/lampp/htdocs. DB 보안 스크립트(/opt/lampp/lampp security) 실행 후 계정/권한 구성.

Q

MySQL 외부 접속 허용 & 포트 확인

A
# /opt/lampp/etc/my.cnf
[mysqld]
bind-address = 0.0.0.0

# 재시작
sudo /opt/lampp/lampp restart

# 계정/권한
/opt/lampp/bin/mysql -u root -p
CREATE USER 'dev'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON mydb.* TO 'dev'@'%';
FLUSH PRIVILEGES;

# 포트 확인
SHOW VARIABLES LIKE 'port';
Q

vhost 설정 후 접근 거부(403)

A
  • 샘플 dummy vhost 제거
  • <Directory>에 Require all granted, AllowOverride All, Options Indexes FollowSymLinks
  • 인덱스 파일 없고 -Indexes면 403
  • 심볼릭 링크 부모 폴더에 실행권(x) 필요
sudo /opt/lampp/bin/httpd -S
tail -n 200 /opt/lampp/logs/error_log
Q

dummy-host.example.com 경고

A
<VirtualHost *:80>
  ServerName localhost
  DocumentRoot "/opt/lampp/htdocs"
  <Directory "/opt/lampp/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:80>
  ServerName myapp.local
  DocumentRoot "/opt/lampp/htdocs/myapp/public"
  <Directory "/opt/lampp/htdocs/myapp/public">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>
Q

vhost 예시 점검

<VirtualHost *:80>
  ServerName myapp
  DocumentRoot "/opt/lampp/htdocs/myapp"
</VirtualHost>
A
# C:\Windows\System32\drivers\etc\hosts
127.0.0.1  myapp.local  myapp
<VirtualHost *:80>
  ServerName myapp.local
  ServerAlias myapp
  DocumentRoot "/opt/lampp/htdocs/myapp"
  <Directory "/opt/lampp/htdocs/myapp">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
    DirectoryIndex index.php index.html
  </Directory>
</VirtualHost>
Q

httpd -S 매칭 확인

A

매칭은 정상. 403이면 인덱스/권한/.htaccess 문제.

Q

namei -l 권한 이슈

A
sudo chmod 755 /home/myuser      # 간단
sudo chmod 711 /home/myuser      # 보수적
sudo setfacl -m u:daemon:x /home/myuser
sudo setfacl -m u:daemon:rx /home/myuser/projects
sudo setfacl -R -m u:daemon:rx /home/myuser/projects/www
Q

80포트 기본 루트를 myapp으로

A
<VirtualHost *:80>
  ServerName localhost
  ServerAlias 127.0.0.1 myapp myapp.local
  DocumentRoot "/opt/lampp/htdocs/myapp"
  <Directory "/opt/lampp/htdocs/myapp">
    Require all granted
    DirectoryIndex index.php index.html
  </Directory>
</VirtualHost>
Q

PHP 세션 Permission denied

A
sudo mkdir -p /opt/lampp/var/sessions
sudo chown daemon:daemon /opt/lampp/var/sessions
sudo chmod 1733 /opt/lampp/var/sessions
# php.ini
session.save_path = "/opt/lampp/var/sessions"
# 또는
sudo mkdir -p /home/myuser/projects/sessions
sudo chgrp daemon /home/myuser/projects/sessions
sudo chmod 2770 /home/myuser/projects/sessions
sudo setfacl -m u:daemon:rwx /home/myuser/projects/sessions
sudo chmod 711 /home/myuser
sudo chmod 711 /home/myuser/projects
Q

PHP 8 Optional parameter 경고(PHP 8.x부터 함수 파라미터 순서 검사를 강화)

A
// 잘못된 예
function sendSomething($send_email = false, $title, $body = '') { ... }

// 수정
function sendSomething($title, $body = '', $send_email = false) { ... }
Q

PHP 에러를 localhost-error.log에 기록

A
# php.ini
log_errors = On
# error_log를 비우면 vhost ErrorLog로 기록

# vhost에서 강제
php_admin_flag  log_errors On
php_admin_value error_reporting E_ALL
php_admin_flag  display_errors Off
php_admin_value error_log "/opt/lampp/logs/localhost-error.log"
Q

DB 접속 Access denied

A
// mysqli
$mysqli = new mysqli('127.0.0.1', 'user', 'password', 'mydb', 3306);

// PDO
$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=mydb;charset=utf8mb4',
               'user','password',[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);
# 권한
CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
Q

설치된 PHP에서 Deprecated 숨기기

A
# php.ini
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
display_errors = Off
log_errors = On
error_log = /opt/lampp/logs/php_error_log

'개발환경' 카테고리의 다른 글

Docker  (2) 2025.08.11
Sublime Text2 - Package Control 설치하기  (0) 2016.04.13
난중읽기] git 관련  (0) 2013.10.06
Export

Docker GPT Q&A

Q. Docker 시스템이란?
**Docker 시스템**이란, 컨테이너(Container)라는 가벼운 가상화 기술을 통해 애플리케이션을 **개발, 배포, 실행**할 수 있게 해주는 **오픈소스 플랫폼**입니다. 일반적으로 "Docker"라고 부르며, 여기서 **시스템**이라는 표현은 Docker가 제공하는 전체적인 구조와 동작 방식, 구성요소들을 의미합니다.

핵심 개념 요약

개념 설명
컨테이너(Container) 운영체제 수준에서 격리된 환경으로, 애플리케이션과 그 실행환경(라이브러리, 설정 등)을 함께 패키징함
이미지(Image) 컨테이너 실행을 위한 템플릿. 실행 시 인스턴스(컨테이너)로 만들어짐
Docker Engine 컨테이너를 만들고 실행하는 도커의 핵심 프로그램 (데몬 포함)
Dockerfile 이미지를 만들기 위한 설정 파일. 명령어들이 정의됨
Docker Hub 공개된 Docker 이미지 저장소. GitHub처럼 이미지 공유 가능
[사용자 코드]
     ↓
[Dockerfile] → [Docker Image] → [Docker Container]
     ↓
  docker build      docker run
  • docker build: Dockerfile을 기반으로 이미지를 생성
  • docker run: 이미지를 기반으로 컨테이너를 생성하고 실행

중요한 이유

장점 설명
이식성 컨테이너는 어디서든 동일하게 실행됨 (로컬, 테스트, 클라우드 등)
경량화 VM보다 훨씬 가볍고 빠르게 실행
버전 관리 이미지 기반으로 버전 관리가 쉬움
확장성 마이크로서비스 구조와 매우 잘 맞음

간단한 Dockerfile

FROM python:3.10
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
 
Q. Windows에서 Docker 설치 및 실습 예제 설명해줘

설치 요약

  1. 관리자 PowerShell에서 wsl --install 실행 → 재부팅
  2. Docker Desktop for Windows 설치 및 WSL2 백엔드 선택
  3. docker --version, docker run hello-world로 확인

실습: 간단한 Python 웹앱

# Dockerfile
FROM python:3.10
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return "Hello from Docker on Windows!"
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
# requirements.txt
flask

실행: docker build -t my-python-app .docker run -d -p 5000:5000 my-python-apphttp://localhost:5000

 
Q. WSL 기본 설치 시 root의 초기 비밀번호는?
WSL 배포판(Ubuntu 등)은 root 비밀번호가 기본 설정되어 있지 않습니다. 처음에는 일반 사용자 계정/비밀번호를 생성합니다. 루트 권한이 필요하면 sudo를 사용하고, 필요 시 sudo passwd root로 비밀번호를 설정할 수 있습니다. 루트로 바로 로그인하려면 wsl -u root를 사용할 수 있습니다.
 
Q. Docker를 이용하여 프로젝트 협업을 할 경우 소스를 공유 또는 동기화 하는 방법과 서버에 수정된 소스코드를 적용시키는 방법은?

소스 공유/동기화

  • Git 리포지토리 공유 + 동일 Dockerfile로 빌드/실행
  • Bind mount로 로컬 폴더를 컨테이너에 연결: docker run -v $(pwd):/app ...
  • Docker Compose로 팀원 동일 환경 실행

서버 반영(배포)

  1. 최신 코드 반영 → 이미지 빌드
  2. 이미지 전달(레지스트리/파일 전송)
  3. 서버에서 기존 컨테이너 중지 → 새 이미지로 재실행
# 레지스트리 예시
docker build -t repo/your-app:latest .
docker push repo/your-app:latest
# 서버에서
docker pull repo/your-app:latest
docker run -d -p 8000:8000 repo/your-app:latest
 
Q. docker로 python 프로그램을 서비스하는 서버가 있다 . 해당 서버의 python 프로그램을 local에 구축하려고 하는데, local 개발 서버 구축을 위한 절차와 python 버전을 확인하여서 동일하게 맞추는 방법은?
  1. 컨테이너에서 Python 버전 확인: docker exec -it <컨테이너> python --version (또는 Dockerfile의 FROM python:X.Y)
  2. Dockerfile/requirements.txt 확인
  3. 로컬에 동일 Python 설치(예: pyenv)
  4. 가상환경 생성: python -m venv venv
  5. 컨테이너에서 소스 복사(필요시): docker cp <컨테이너>:/app .
  6. pip install -r requirements.txt 후 실행
Q. .env 파일을 찾을 수 없다고 한다
컨테이너 실행 시 환경변수 파일을 전달해야 합니다.
  • 권장: docker run --env-file .env -d your-image
  • 개별: docker run -e KEY=VALUE ...
  • 이미지에 포함(주의): Dockerfile에 COPY .env .env
  • Compose: env_file: .env (자동 인식)
Q. docker 실행 상태를 확인하려면?
  • 실행 중 컨테이너: docker ps
  • 전체(종료 포함): docker ps -a
  • 상태만: docker inspect --format='{{.State.Status}}' <이름>
  • 로그: docker logs <이름>
  • 도커 데몬(Linux): systemctl status docker
Q. docker 이미지에서 원본 소스를 추출할 수 있나요?
예. 이미지로 임시 컨테이너를 만들고 docker cp로 복사합니다.
docker create --name temp your-image
docker exec -it temp bash   # 경로 탐색 (/app, /usr/src/app 등)
docker cp temp:/app ./extracted
docker rm temp
보안상 배포 이미지에는 소스 최소화를 권장합니다.
 
Q. format 폴더 복사 에러 (경로 이슈)
Error: Could not find the file /format in container
컨테이너 내 실제 경로가 /app/format이므로 다음처럼 복사하세요:
sudo docker cp temp-d:/app/format ./backup
 
Q. 실행된 image의 python library list 확인
  • docker exec -it <컨테이너> pip list
  • 버전 고정: pip freeze
  • 임시 확인: docker run --rm <이미지> pip list
  • Conda: conda list
파일로 가져오기 예:
docker exec <컨테이너> sh -c "pip freeze > /app/req.txt"
docker cp <컨테이너>:/app/req.txt ./requirements_from_container.txt
 
Q. docker image 실행 후 실행된 image의 python 실행 파일은 무조건 app.py인가? (다른 파일 가능?)
아니요. Dockerfile의 CMD/ENTRYPOINT로 무엇이든 지정할 수 있습니다.
# 예: main.py 실행
CMD ["python", "main.py"]

# 실행 시 덮어쓰기
docker run my-image python other_script.py

# FastAPI 예
CMD ["uvicorn", "myapp:app", "--host", "0.0.0.0", "--port", "8000"]
 
Q. 이미지 빌드/실행 시 경로는 어떻게 해야 하나요?
  • 빌드: 빌드 컨텍스트(보통 프로젝트 루트)를 지정. 예: docker build -t app .
  • 실행: 경로 불필요(이미지 이름만). 예: docker run app
  • 개발 동기화: 바인드 마운트 시 로컬 경로 지정. 예: -v $(pwd):/app
Q. Dockerfile은 수동으로 만들어 줘야 하는가? 자동 생성되나?
일반적으로 수동 작성이 필요합니다. 예외적으로 컨테이너를 이미지로 저장(docker commit)하거나, IDE/도구가 템플릿을 만들어 줄 수 있지만, 재현성/유지보수를 위해 Dockerfile 작성이 권장됩니다.
 
Q. Dockerfile의 'Expose the port the app runs on' 의미는?
주석이며, 이어지는 EXPOSE <포트>는 컨테이너 내부에서 서비스가 사용하는 포트를 문서화합니다. 외부 접근은 docker run -p 호스트포트:컨테이너포트로 매핑해야 합니다.

'개발환경' 카테고리의 다른 글

WSL Ubuntu + XAMPP 설치·설정 & 트러블슈팅  (0) 2025.08.21
Sublime Text2 - Package Control 설치하기  (0) 2016.04.13
난중읽기] git 관련  (0) 2013.10.06

(*) Windows OS에서 Test용으로 구축한 MongoDB의 백업과 복원 방법

 

1. Backup 

  • 명령어 : mongodump.exe 
  • 구문
mongodump --host <source_host> --port <source_port> -u <username> -p <password> --authenticationDatabase <auth_db> --db <database_name> --out <backup_directory>
  • Arguments
    • --host: 원격 서버의 IP 또는 호스트 이름.
    • --port: MongoDB가 실행 중인 포트(기본값: 27017).
    • -u와 -p: MongoDB 사용자명과 비밀번호.
    • --authenticationDatabase: 인증 데이터베이스(대개 admin).
    • --db: 백업할 특정 데이터베이스 이름.
    • --out: 백업 데이터를 저장할 디렉토리 경로.
  • 예시 
mongodump --host 192.168.1.10 --port 27017 -u admin -p password --authenticationDatabase admin --db example_db --out D:\Temp

       out 폴더에 DB명의 폴더가 생기고 그 아래 백업 파일이 생성된다. 

 

       만약 네트워크 전송을 고려해야 한다면 압축 옵션을 사용할 수 있다. 

mongodump --db example_db --archive=backup.gz --gzip

 

 

2. Restore

  • 명령어 : mongorestore.exe
  • 구문
mongorestore --host <target_host> --port <target_port> -u <username> -p <password> --authenticationDatabase <auth_db> --db <database_name> <backup_directory>

 

  • Arguments 
    • --host: 복원할 대상 서버의 IP 또는 호스트 이름.
    • --port: 대상 서버의 MongoDB 포트.
    • -u와 -p: MongoDB 사용자명과 비밀번호.
    • --authenticationDatabase: 인증 데이터베이스(대개 admin).
    • --db: 복원할 데이터베이스 이름(필요시 백업된 데이터베이스 이름과 다르게 지정 가능).
    • <backup_directory>: mongodump로 생성된 데이터가 저장된 디렉토리
  • 예시
mongorestore --host 192.168.1.20 --port 27017 -u admin -p password --authenticationDatabase admin --db restored_db D:\Temp\restored_db_folder_name

 

(*) 참고로 mongodump는 MongoDB 서버와 함께 설치되지 않고, 별도로 MongoDB Database Tools 설치를 해줘야 함. 

 

Try MongoDB Tools - Download Free Here

Free download for MongoDB tools to do more with your database. MongoDB Shell, Compass, CLI for Cloud, BI Connector and other database tools available.

www.mongodb.com

 - 다운로드 파일 압축 해제 후 해당 폴더 내 bin에 명령어가 포함되어 있다. 

   만약 전역으로 사용하려면 Windows 환경 변수에  Tools/bin 경로를 추가 해야 한다. 

 

2차 전지 배터리 충전/방전 시그래프

 

'변화 > MindMap' 카테고리의 다른 글

마이크로 SD카드  (0) 2018.04.17
Software License  (0) 2018.03.17
Android AlermManager  (0) 2018.03.14

+ Recent posts