리눅스 환경에서 서버를 돌릴 수 있다는 것을 깨닫고 컴퓨터보다 성능은 낮아도 스마트폰으로 리눅스 구축후 서버를 굴릴 수 있지 않을까 생각했다.
마침 휴대폰을 바꾸면서 공기계도 있었기에 테스트 해보았다. 인터넷은 공유기로 연결 하는 것이다보니 기기 성능은 물론 와이파이 상태까지 영향받지만 크게 돈 들이지 않은 무료 서버다보니 구축하면 불편해도 쓸만하지 않을까 싶었다.
삼성 노트 9 이다보니 안드로이드 기반이며, userLand 라는 가상머신 앱으로 리눅스를 설치 할 수 있었다. 안드로이드 설치 링크는 아래와 같다.
https://play.google.com/store/apps/details?id=tech.ula&hl=ko&gl=US
리눅스를 안드로이드에서 쓸 수 있도록 지원하기 위한 앱이다보니 다운로드에 큰 어려움은 없지만 몇몇 제약들이 있다.
포트 사용에 제약이 있다.
아무래도 루팅하는게 아니다보니 시스템 포트로 사용되는 0~1023는 사용하지 못한다.
안드로이드 위에 리눅스를 돌리는 상황이라 권한 이슈가 좀 있다.
포트 사용은 어쩔 수 없고 권한 사용은 잘 파고들면 있겠지만 해결하기 보단 원하는 결과 내는 방향으로 우회했다. 리눅스도 버전이 많은데 우분투를 선택했다.
sudo apt update
sudo apt upgrade
sudo apt install openssh-server
sudo apt install vim
순으로 입력한다.
sudo vi /etc/ssh/sshd_config
설정을 위해 아래 config 파일을 연다.
2.1. port는 아무튼 1023보다 큰 적당한 숫자로 맞춘다.
2.2. PasswordAuthentication를 활성화 후 yes로 설정
2.3. :wq 입력으로 저장후 나가면 된다.
sudo service ssh start
mysql 서비스를 실행한다.
방법 참고 : https://panython.tistory.com/28
통신사에서 모뎀으로 컴퓨터 이용자에게 제공해주는 외부 IP가 있다. 이게 있으면 어떤 컴퓨터로 접속 가능한지 확인이 가능하다. 괜히 주소라고 하는게 아니다. 근데 ip4는 알다시피 0.0.0.0 ~ 255.255.255.255 이며 그냥 숫자상 가짓수는 약 42억개다. 근데 알다시피 해외 IP라는 말이 있듯 약 42억개의 IP를 우리가 그대로 쓰면 부족함이 없지만 70억 인구인 지금 42억개 IP로는 부족하다. 이에 공유기나 와이파이를 이용하는 환경에서 내부 IP라는 개념이 생겨났다.
인터넷 설치후 랜선으로 받는게 외부 IP다. 그런데 우리는 공유기라는 놈을 사용한다. 그리고 공유기로 와이파이 연결을 하고, 랜선을 꼽아 사용하기도 한다. 그러면 여기서 할당받는 IP는 뭘까? 공유기가 받는 외부 IP는 1개 인데, 공유기가 인터넷을 공급할 수 있는 기기는 1개가 넘어간다.
여기서 내부 IP가 사용된다. 공유기에서 내부 아이피를 만들어 기기에 할당해준다. 모바일 단말기로 ip 확인했을 때 본 192.168.0.2 같은 숫자가 바로 그 내부 주소이다. 같은 공유기 내의 기기 끼리는 해당 내부주소로 연결하면 된다. 그런데 아예 다른 장소의 컴퓨터, 혹은 단말기에서 192.168.0.2를 사용하면 당연히 연결 안된다. 왜냐하면 내부 주소는 같은 공유기를 사용하고 있는 사람들만 알기 때문이다.
따라서 외부에서는 공유기에 연결된 인터넷 선의 외부 IP를 통해 연결 해야하는데 알다시피 해당 외부IP로 공유기와 접속해도 공유기가 만든 내부 IP의 어떤 것이 외부 접속자가 원하는 건지 알 수 없다. 이 문제를 해결하고자 포트포워딩이 사용된다. 외부 접속자는 공유기에 연결된 외부IP에 특정 포트로 연결한다. 134.134.134.134:XXX 로 연결했다고 가정하자. 그러면 사용자는 XXX 포트를 사용한 것이다 이는 22가 될 수 있고 8000이 될 수 있으며 20301이 될 수 있다. 포트포워딩은 바로 외부 PC가 접속할 때 사용한 XXX 포트를 내부에 공유기가 만든 내부 IP에 어떤 포트번호와 연결할지를 결정하는 것이다.
예를 들어 134.134.134.134:2022로 외부에서 접속한다고 하자. 포트포워딩으로 외부 2022로 접속하는 건 내부 IP 192.68.0.6:5000 으로 보내도록 설정하면 외부에선 134.134.134.134:2022으로 접속했지만 포트포워딩된 설정을 통해 공유기가 만든 내부 IP 192.68.0.6를 사용하는 단말기로 연결시켜주며 해당 단말기의 5000포트로 연결 시켜준다.
설명은 복잡했지만 그냥 스마트폰에 와이파이로 연결된 단말기라 어쩔 수 없다는 뜻이다.
설치 해야할 것은 총 4가지다.
1. nodejs, npm, git, mysql
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install curl
curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash --
sudo apt-get install nodejs
sudo apt install nodejs npm
sudo apt install git
sudo apt-get install mysql-server
sudo service mysql start
설치하고
서비스로 실행하는 명령어다.
초기 계정은 root, 비밀번호는 없다. 따라서 알아서 설정 해야한다.
USE mysql;
UPDATE user SET plugin='mysql_native_password' WHERE user='root';
FLUSH PRIVILEGES;
sudo service mysql restart
sudo mysql
USE mysql;
UPDATE user SET authentication_string=password('비밀번호') WHERE user='root';
FLUSH PRIVILEGES;
exit;
4.1. 변경하고 싶은 비밀번호가 helloworld 라면 아래와 같이 입력하면 된다.
UPDATE user SET authentication_string=password('helloworld') WHERE user='root';
외부 ip와 포트를 이용해 접근했는데 초기 로그인 화면까지는 잘 들어와진다.
이번 서비스 핵심 포인트인 구글 로그인이 안된다. Google OAuth2.0 policy에 부합하지 않는다고 한다.
구글 로그인 보안상 문제로 인해서 IP가 아니라 도메인을 사용해야한다고 한다.
알다시피 도메인 역시 한정적인 자원이고 이를 빌리는 것 역시 비용이 든다. 그런데 비용 아끼려고 스마트폰을 리눅스 서버로 운용해보았으나 결국 도메인을 할당해야만 했다. 비용을 절약하려고 휴대폰 리눅스 설치를 했지만 결국 도메인이라는 장벽으로 한계를 맞이 한 것.