Categories
PHP

PHP 내장 (built-in) 웹 서버 사용하기

PHP 내장 웹서버를 실행시켜 보자.

php -S 192.168.0.101:80

-S 옵션을 통해 웹서버의 IP 주소와 포트 번호를 지정해 주었다. 웹서버의 다큐먼트 (document) 루트 디렉토리를 지정하지 않았으므로 현재 작업 디렉토리가 다큐먼트 루트 디렉토리가 된다.

다큐먼트 루트 디렉토리를 지정해 보자.

php -S 192.168.0.101:80 -t /home/user1/html

/home/user1/html 디렉토리를 다큐먼트 루트 디렉토리로 지정한 것이다.

포트 번호로 디폴트값인 80 번 대신 다른 것을 사용해 보자.

php -S 192.168.0.101:8080 -t /home/user1/html

이런 경우에는 웹서버에 접속할 때 포트 번호를 지정해야 한다. 예를 들면 다음과 같다.

http://192.168.0.101:8080

포트 번호를 지정하지 않으면 웹브라우저는 디폴트값인 80번을 사용한다. 따라서 접속에 실패하게 된다.

PHP 내장 웹서버를 종료하려면 실행 상태에서 Ctrl + C 키를 누르면 된다.

Categories
PHP

우분투 리눅스에 PHP 8 설치하고 설정하기

우분투 리눅스에 PHP 8 을 설치해 보자.

우분투의 패키지 저장소는 아직 PHP 8 을 지원하지 않는다. 이런 경우에는 PPA (Personal Package Archive) 를 사용하면 된다. ondrej/php 는 PHP 8 패키지를 제공하는 PPA 이다.

ondrej/php PPA 를 소스 리스트에 추가한다.

sudo add-apt-repository ppa:ondrej/php

시스템의 패키지 데이터베이스를 업데이트한다.

sudo apt update

PHP 8 패키지를 설치한다.

sudo apt install php8.0

설치가 끝난 후에 PHP 버전을 확인해 보자.

php -v

PHP 익스텐션 (extension) 을 추가로 설치한다.

sudo apt install php8.0-common php8.0-mysql php8.0-gd php8.0-cli php8.0-zip php8.0-curl php8.0-xml php8.0-dev php8.0-imap php8.0-mbstring

PHP 의 설정 파일은 php.ini 이다. 이 파일은 /etc/php/8.0/apache2 디렉토리에 있다.

파일을 연다.

sudo vi /etc/php/8.0/apache2/php.ini

아래 내용을 참고하여 파일을 수정한다. 세미콜론 (;) 뒤의 설명 부분은 추가하지 않아도 된다.

; 스크립트 실행 시간의 최대값. 초 단위이다.
max_execution_time = 60

; 스크립트가 사용할 메모리 최대 용량.
memory_limit = 128M

; POST 데이터의 최대 크기.
post_max_size = 32M

; 업로드 파일의 최대 크기.
upload_max_filesize = 8M

파일을 저장하고 편집기를 닫는다.

PHP 를 새로 세팅했으므로 아파치를 재시작한다.

sudo systemctl restart apache2

Categories
Linux Network

리눅스 DHCP 서버의 설치 및 설정 방법

아래 명령으로 DHCP 서버를 설치한다.

sudo apt install isc-dhcp-server

DHCP 서버의 설정 파일은 /etc/dhcp/dhcpd.conf 이다. 이 파일을 백업한다.

sudo mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak

같은 이름으로 새로운 설정 파일을 만든다.

sudo vi /etc/dhcp/dhcpd.conf

아래와 같은 내용을 입력한다. 해시 표시 (#) 뒤에 있는 설명 부분은 입력하지 않아도 된다.

# IP 주소 임대 시간은 600초이다.
default-lease-time 600;
# 최대 IP 주소 임대 시간은 2시간이다.
max-lease-time 7200;
# 해당 DHCP 서버가 공식적인 서버임을 의미한다.
authoritative;

# 서브넷을 정의한다.
subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.201 192.168.0.220;    # 할당할 IP 주소의 범위
  option routers 192.168.0.1;   # 디폴트 게이트웨이의 IP 주소
  option domain-name-servers 8.8.8.8, 8.8.4.4;    # DNS 서버의 IP 주소
}

특정 클라이언트가 항상 똑같은 IP 주소를 할당받도록 해 보자. 이 경우에 해당 클라이언트의 MAC 주소가 필요하다.

아래 명령으로 MAC 주소를 알아낸다.

ip addr show

서브넷을 정의한 괄호 안에 아래 내용을 추가한다.

host client-221 {
  hardware ethernet 69:41:10:91:11:22;    # MAC 주소
  fixed-address 192.168.2.221;    # IP 주소
}

다음은 /etc/dhcp/dhcpd.conf 파일의 전체 내용이다.

default-lease-time 600;
max-lease-time 7200;
authoritative;

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.201 192.168.0.220;
  option routers 192.168.0.1;
  option domain-name-servers 8.8.8.8, 8.8.4.4;

  host client-221 {
    hardware ethernet 69:41:10:91:11:22;
    fixed-address 192.168.2.221;
  }
}

DHCP 서버의 또다른 설정 파일은 /etc/default/isc-dhcp-server 이다. 이 파일은 DHCP 서버와 네트워크 인터페이스를 바인딩하는 역할을 한다. 이러한 바인딩은 DHCP 서버에 여러 개의 네트워크 인터페이스가 있을 경우에 필요하다.

/etc/default/isc-dhcp-server 파일을 열고 아래와 같은 내용으로 작성한다.

INTERFACESv4="enp4s0"
INTERFACESv6=""

enp4s0 은 네트워크 인터페이스 이름이다. DHCP 서버는 이 인터페이스를 통해 클라이언트 요청에 응답하게 된다.

모든 설정을 마쳤다. 변경한 내용을 적용하기 위해 DHCP 서버를 재시작한다.

sudo systemctl restart isc-dhcp-server

DHCP 서버의 동작 상태를 확인해 보자.

sudo systemctl status isc-dhcp-server

Categories
JavaScript

POST 요청 방식에 의한 Ajax 프로그램 작성하기

Ajax 를 이용한 프로그램을 작성해 보자. 이 프로그램은 서버에 POST 방식의 요청을 한다. 서버에 문자열을 전송한다. 서버의 PHP 스크립트는 문자열의 길이를 계산하여 웹브라우저로 보낸다.

프로그램은 count.html 파일과 count.php 파일로 구성된다.

아래와 같이 count.html 파일을 작성한다.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ajax POST 요청</title>
<script>
// 자바스크립트 코드가 삽입되는 부분
</script>
</head>
<body>
  <div id="response">응답 메시지</div>
  <form id="userForm">
    <input type="text" name="string">
    <button type="button" onclick="countCharacters()">문자수 세기</button>
  </form>
</body>
</html>

countCharacters() 함수를 작성하자.

함수 정의를 시작한다.

function countCharacters() {

XMLHttpRequest 객체를 생성한다.

var xmlhttp = new XMLHttpRequest();

xmlhttp 객체의 인스턴스를 생성한다. POST 방식으로 요청한다. count.php 는 요청을 처리하는 서버 스크립트 파일이다.

xmlhttp.open(“POST”, “count.php”);

readystatechange 이벤트의 이벤트 리스너를 정의한다.

xmlhttp.onreadystatechange = function () {
  // 요청이 완료되었는지 확인한다.
  // 요청이 성공적인지 확인한다.
  if (this.readystate == 4 && this.status == 200) {
    // 서버로부터의 응답 메시지를 HTML 엘리먼트에 삽입한다.
    document.getElementById("response").innerHTML = this.responseText;
  }
};

폼 데이터를 변수에 저장한다.

var userForm = document.getElementById(“userForm”);

var userData = new FormData(userForm);

요청을 서버로 보낸다.

xmlhttp.send(userData);

함수 정의를 마친다.

}

이상의 내용을 연결하면 다음과 같다.

function countCharacters() {
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.open("POST", "count.php");
  xmlhttp.onreadystatechange = function () {
    if (this.readystate == 4 && this.status == 200) {
      document.getElementById("response").innerHTML = this.responseText;
    }
  };
  var userForm = document.getElementById("userForm");
  var userData = new FormData(userForm);
  xmlhttp.send(userData);
}

이 함수를 <script> 태그 안에 포함시킨다.

count.php 파일은 count.html 파일로부터 POST 요청을 받아 처리하는 파일이다.

아래와 같이 count.php 파일을 작성한다.

<?php
if (isset($_POST['string'])) {
  $string = trim($_POST['string']);
  // 문자열의 길이를 구해 변수에 저장한다.
  $count = strlen($string);
  // 응답 메시지를 웹브라우저에 보낸다.
  echo $string . " 의 문자 개수: " . $count . " 개";
} else {
  // $_POST['string'] 변수가 세팅되어 있지 않을 경우 처리할 수 없다.
  echo "처리 불가";
}
?>

count.html 파일과 count.php 파일을 웹서버에 저장한다. 두 파일을 같은 디렉토리에 저장해야 한다.

웹브라우저로 count.html 파일을 읽어들인다. ‘문자수 세기’ 버튼을 눌러서 POST 요청이 제대로 동작하는지 확인해 보자.

Categories
JavaScript

GET 요청 방식에 의한 Ajax 프로그램 작성하기

Ajax 를 이용한 프로그램을 작성한다. 프로그램은 문자열을 입력받아 문자의 개수를 알려준다.

프로그램은 count.html 파일과 count.php 파일로 구성된다.

아래와 같이 count.html 파일을 작성한다.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Ajax GET 요청</title>
<script>
// 자바스크립트 코드가 삽입되는 부분
</script>
</head>
<body>
<div id="response">응답 메시지</div>
<button type="button" onclick="countCharacters()">문자수 세기</button>
</body>
</html>

countCharacters() 함수를 작성하자.

함수 정의를 시작한다.

function countCharacters() {

XMLHttpRequest 객체를 생성한다.

var xmlhttp = new XMLHttpRequest();

xmlhttp 객체의 인스턴스를 생성한다. count.php 파일에 xtmci 라는 문자열을 전달한다. 전달할 때 string 이라는 이름을 사용한다.

xmlhttp.open(“GET”, “count.php?string=xtmci”);

readystatechange 이벤트의 이벤트 리스너를 정의한다.

xmlhttp.onreadystatechange = function () {
  // 요청이 완료되었는지 확인한다.
  // 요청이 성공적인지 확인한다.
  if (this.readystate == 4 && this.status == 200) {
    // 서버로부터의 응답 메시지를 HTML 엘리먼트에 삽입한다.
    document.getElementById("response").innerHTML = this.responseText;
  }
};

요청을 서버로 보낸다.

xmlhttp.send();

함수 정의를 마친다.

}

이상의 내용을 연결하면 다음과 같다.

function countCharacters() {
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.open("GET", "count.php?string=xtmci");
  xmlhttp.onreadystatechange = function () {
    if (this.readystate == 4 && this.status == 200) {
      document.getElementById("response").innerHTML = this.responseText;
    }
  };
  xmlhttp.send();
}

이 함수를 <script> 태그 안에 포함시킨다.

count.php 파일은 count.html 파일로부터 GET 요청을 받아 처리하는 파일이다.

아래와 같이 count.php 파일을 작성한다.

<?php
if (isset($_GET['string'])) {
  $string = trim($_GET['string']);
  // 문자열의 문자 개수를 구해 변수에 저장한다.
  $count = strlen($string);
  // 응답 메시지를 웹브라우저에게 보낸다.
  echo $string . " 의 문자 개수: " . $count . " 개";
} else {
  // $_GET['string'] 변수가 세팅되어 있지 않으므로 처리할 수 없다.
  echo "처리 불가";
}
?>

count.html 파일과 count.php 파일을 웹서버에 저장한다. 두 파일을 같은 디렉토리에 저장해야 한다.

웹브라우저로 count.html 파일을 읽어들인다. ‘문자수 세기’ 버튼을 눌러서 GET 요청이 제대로 처리되는지 확인해 보자.

Categories
FFmpeg

우분투에서 FFmpeg 설치하기

FFmpeg 을 설치하기 전에 시스템의 패키지 리스트를 업데이트한다.

sudo apt update

ffmpeg 패키지를 설치한다.

sudo apt install ffmpeg

설치가 끝난 후에 FFmpeg 의 버전을 확인해 보자.

ffmpeg -version

출력 결과를 통해 버전 정보 뿐만 아니라 다양한 컴파일 옵션도 확인할 수 있다.

Categories
Internet

youtube-dl: 커맨드 라인에서 유튜브 동영상 다운로드하기

youtube-dl 을 설치하는 방법을 알아보자.

youtube-dl 사이트에서 실행 파일을 다운로드한다.

wget https://yt-dl.org/downloads/latest/youtube-dl

실행 파일을 /usr/local/bin 디렉토리로 이동시킨다.

sudo mv youtube-dl /usr/local/bin

실행 파일의 사용 권한을 변경한다. 모든 사용자가 읽고 실행할 수 있도록 한다.

sudo chmod a+rx /usr/local/bin/youtube-dl

우분투의 apt 명령으로 youtute-dl 패키지를 설치하는 방법도 있다.

sudo apt install youtube-dl

하지만 이 방법은 최신 버전이 설치되는 것을 보장하지 않는다.

youtube-dl 은 새로운 버전으로 수정될 때가 많다. 따라서 정기적인 업데이트는 필수이다. 업데이트 시에는 -U 옵션을 사용한다.

sudo youtube-dl -U

유튜브 동영상을 다운로드해 보자. 아래와 같이 동영상의 URL 을 프로그램의 인자값으로 지정한다.

youtube-dl https://www.youtube.com/watch?v=T8PZyXqp_KY

이 URL 은 웹브라우저의 주소창에 표시되는 것이다. 이것 대신에 좀더 간단한 URL 을 사용할 수도 있다.

youtube-dl https://youtu.be/T8PZyXqp_KY

다운로드한 동영상의 이름이 ‘동영상제목.확장자’ 형식이 되도록 해 보자.

youtube-dl -o ‘%(title)s.%(ext)s’ https://www.youtube.com/watch?v=T8PZyXqp_KY

여기서 %(title)s 와 %(ext)s 는 플레이스 홀더 (place holder) 이다. 동영상을 다운로드할 때 각각 동영상의 제목과 동영상의 확장자로 대체된다.

유튜브 동영상은 여러 가지 포맷으로 제공된다. 이중에서 원하는 것을 선택하여 다운로드할 수 있다.

동영상의 포맷 리스트를 출력해 보자.

youtube-dl -F https://www.youtube.com/watch?v=T8PZyXqp_KY

포맷 리스트의 맨 왼쪽에 포맷 코드가 있다. 포맷 코드를 지정하면 이것에 해당하는 동영상을 다운로드할 수 있다.

youtube-dl -f 299 https://www.youtube.com/watch?v=T8PZyXqp_KY

이 명령은 화면 해상도는 1920×1080 이고 확장자는 mp4 인 동영상 파일을 다운로드하게 된다.

포맷 리스트를 출력하는 옵션은 대문자 F 이고 포맷을 지정하는 옵션은 소문자 f 라는 점을 유의하자.

Categories
Internet

rTorrent: 커맨드 라인 토렌트 다운로드 프로그램

터미널 창에서 아래 명령으로 rTorrent 를 설치한다.

sudo apt install rtorrent

토렌트 파일을 다운로드하여 ~/Downloads 디렉토리에 저장해 두자. rTorrent 를 실행한다.

rtorrent

그러면 rTorrent 화면이 나타난다.

토렌트 파일을 선택해 보자. rTorrent 화면에서 엔터 키를 친다. 화면 맨 밑에 아래와 같은 프롬프트가 나타날 것이다.

load.normal>

이 프롬프트에 토렌트 파일의 경로를 입력한다. 경로를 전부 입력할 필요는 없다. 일부만 입력하고 탭 키를 치면 자동 완성되기 때문이다.

프롬프트에 아무 것도 입력하지 않은 상태에서 탭 키를 치면 현재 작업 디렉토리에 있는 파일의 리스트가 출력된다. 이 리스트를 보면서 경로를 입력한다.

파일 선택을 하지 않고 처음으로 돌아가려면 Esc 키를 친다.

sample.torrent 라는 토렌트 파일을 선택한다고 해 보자. 아래와 같이 입력하고 엔터 키를 친다.

load.normal> Downloads/sample.torrent

방금 선택한 토렌트가 화면에 나타날 것이다. 자동으로 다운로드가 시작되지는 않는다.

위쪽 화살표 키나 아래쪽 화살표 키를 이용하여 토렌트를 선택한다. 그러면 토렌트의 왼쪽에 별표 (*) 3개가 나타난다. 이 상태에서 Ctrl + S 키를 치면 다운로드가 시작된다.

다운로드가 시작되면 해당 토렌트의 다운로드 및 업로드 진행 상태가 표시된다. 다운로드가 완료되면 ‘done’ 이라고 표시된다.

다운로드가 진행 중일 때 Ctrl + D 키를 치면 다운로드가 중단된다. 이 상태에서 다시 Ctrl + D 키를 치면 토렌트가 삭제된다.

다운로드가 중단된 상태에서 Ctrl + S 키를 치면 다운로드가 다시 시작된다.

다시 엔터 키를 쳐서 load.normal> 프롬프트를 호출해 보자. 앞에서 설명한 방법에 따라 다른 토렌트를 추가해 보자. 원하는 개수 만큼 토렌트를 추가할 수 있다.

5 키를 쳐 보자. 그러면 화면에 다운로드가 완료된 토렌트만 표시될 것이다. 1 키를 치면 다시 모든 토렌트가 표시된다.

rTorrent 를 종료할 때는 Ctrl + Q 키를 치면 된다.

Categories
Linux Network

우분투에서 iptables 명령으로 인터넷 연결 공유하기

인터넷 연결 공유를 위해서는 게이트웨이 역할을 할 리눅스 컴퓨터가 하나 필요하다. 이 컴퓨터에는 랜카드가 2개 설치되어야 한다. 하나는 퍼블릭 IP 주소를 갖게 되고 다른 하나는 사설 IP 주소를 갖게 된다. 이 컴퓨터를 게이트웨이 서버라고 부르도록 하자.

게이트웨이 서버에서의 설정 방법을 알아보자.

인터넷 연결 공유를 위해서는 게이트웨이에서 IP 포워딩이 활성화되어야 한다.

sudo sysctl -w net.ipv4.ip_forward=1

이 명령에 의해서 IP 포워딩이 활성화될 것이다. 하지만 그 효과는 시스템을 재부팅하면 사라지게 된다.

이러한 문제를 해결하기 위해 /etc/sysctl.conf 파일을 수정한다.

sudo vi /etc/sysctl.conf

파일에서 아래와 같이 된 부분을 찾는다.

# net.ipv4.ip_forward = 0

이 부분을 아래와 같이 고친다.

net.ipv4.ip_forward = 1

인터넷 연결 공유는 NAT 설정을 통해 이루어진다. 우분투에서 NAT 설정을 하는 명령은 iptables 이다.

iptables 명령으로 FILTER 테이블과 NAT 테이블을 설정하는 방법을 알아보자.

FILTER 테이블의 모든 체인을 비운다.

sudo iptables -F

NAT 테이블의 모든 체인을 비운다.

sudo iptables -t nat -F

NAT 테이블에서 IP 매스커레이딩을 활성화한다.

iptables -t nat -A POSTROUTING -o enp3s0 -j MASQUERADE

여기서 enp3s0 은 퍼블릭 IP 주소를 갖는 랜카드의 인터페이스 이름이다. 독자는 자신의 네트워크 환경에 맞게 수정해서 입력해야 한다.

랜카드의 인터페이스 이름은 아래 명령으로 확인할 수 있다.

ip addr show

이상으로 게이트웨이에서의 설정을 마쳤다. 하지만 이런 식으로 여러 명령들을 매번 입력하는 것은 번거로운 일이다. 명령들을 하나의 스크립트 파일 안에 정리해 보자.

sudo vi /usr/local/bin/ics.sh

아래와 같은 내용을 입력하고 저장한다.

#!/bin/bash
sysctl -w net.ipv4.ip_forward=1
iptables -F
iptables -t nat -F
iptables -t nat -A POSTROUTING -o enp3s0 -j MASQUERADE

모든 사용자가 이 파일을 실행할 수 있도록 한다.

sudo chmod a+x /usr/local/bin/ics.sh

시스템 부팅 후 아래 명령을 내리면 인터넷 연결 공유 기능이 활성화될 것이다.

sudo /usr/local/bin/ics.sh

이렇게 하는 것마저 귀찮다면 /etc/rc.local 파일을 이용하면 된다. ‘exit 0’ 부분을 찾아 그 앞에 아래 내용을 추가한다.

/usr/local/bin/ics.sh

그러면 시스템을 부팅할 때마다 해당 스크립트가 자동으로 실행될 것이다.

클라이언트 컴퓨터에서의 설정 방법을 알아보자.

인터넷에 직접 연결되어 있지 않은 다른 컴퓨터들은 게이트웨이 서버를 통해 인터넷에 연결하게 된다. 따라서 해당 컴퓨터들은 네트워크 설정을 할 때 2가지만 정확하게 입력하면 된다.

하나는 기본 게이트웨이의 주소이고 다른 하나는 DNS 서버의 주소이다.

기본 게이트웨이의 주소는 앞에서 설명한 게이트웨이 서버의 사설 IP 주소를 입력한다. 퍼블릭 IP 주소가 아니라는 점에 유의하자.

DNS 서버의 주소는 인터넷 서비스 제공 업체가 제공하는 DNS 서버의 주소를 입력한다. 구글의 퍼블릭 DNS 서버 주소 (8.8.8.8) 를 입력해도 된다.

Categories
Linux Network

우분투 리눅스에서 DHCP 서버를 설치하고 설정하기

우분투의 터미널 창에서 아래 명령으로 DHCP 서버를 설치한다.

sudo apt install isc-dhcp-server

설치가 끝났다면 DHCP 서버 설정(setup)을 해 보자. DHCP 서버의 설정 파일은 /etc/dhcp/dhcpd.conf 이다. 편집을 하기 전에 이 파일을 백업해 두자.

sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak

편집기로 파일을 연다.

sudo vi /etc/dhcp/dhcpd.conf

파일의 기존 내용을 모두 삭제한다. 그리고 아래와 같은 내용을 입력한다.

default-lease-time 600;    # IP 주소 임대 시간은 600초
max-lease-time 7200;    # IP 주소 최대 임대 시간은 2시간

subnet 192.168.0.0 netmask 255.255.255.0 {    # 네트워크 주소와 서브넷 마스크
  range 192.168.0.201 192.168.0.220;    # 임대할 IP 주소의 범위
  option routers 192.168.0.1;    # 게이트웨이 서버의 주소
  option domain-name-servers 210.220.163.82, 219.250.36.130;    # 도메인 네임 서버의 주소
  host static-ip {    # 특정 호스트에 고정 IP 주소를 할당하기 위한 부분
    hardware ethernet 68:14:02:82:12:28;    # 해당 호스트 랜카드의 MAC 주소
    fixed-address 192.168.0.221;    # 해당 호스트에 할당할 고정 IP 주소
  }
}

IP 주소 및 MAC 주소는 독자의 네트워크 환경에 맞게 수정해야 한다. 해시 (#) 기호 뒤에 있는 설명 부분은 입력할 필요가 없다.

fixed-address 192.168.0.221; 부분을 보자. 여기서 지정한 주소는 range 192.168.0.201 192.168.0.220; 부분의 범위에 포함되지 않는 것이어야 한다.

파일을 편집한 후 저장하고 편집기를 닫는다.

DHCP 서버를 재실행하여 설정한 내용을 적용한다.

sudo systemctl restart isc-dhcp-server

아래 명령은 DHCP 서버가 할당한 IP 주소의 리스트를 출력한다.

dhcp-lease-list

출력 결과를 /etc/dhcp/dhcpd.conf 파일에서 설정한 내용과 비교해 보자. 고정 IP 주소는 출력 결과에 포함되지 않는다.