• 이번에는 오픈된 cloud 인터넷 망에 설치된 code-server 를 계속 열어놓고 사용하기엔 불안한 부분도 있고, 어느 기기에서나 좀 더 간편하게 언제든지 code-server 접근이 되도록 nginx proxy를 앞에 두고 로그인도 가능하도록 구성해봅니다.
  • Safari 브라우저에서 nginx 로그인 뒤 code-server 로그인 후에 (blank) white screen 이슈가 있네요. 해결되면 업데이트하겠습니다. (Update: Mar 12, 2021)

환경 구성

  • OS: CentOS 8.3.2011 (on Oracle cloud VM)
    !!! 사용하려는 port가 (cloud network)방화벽에서 오픈되었는지 먼저 확인하세요
  • Code-server: 3.9.0-amd64.rpm
  • Nginx: v1.14.1 (with yum)

1. Code-server 설정 확인

; code-server 구성이 처음이라면 이전 code-server 설치 글 을 참고하세요.

USER1@ ~]$ cat /home/USER1/.config/code-server/config.yaml

bind-addr: 127.0.0.1:8080
auth: password
password: $myNewPassword
cert: false

2. Install Nginx

; CentOS에서 nginx 설치를 하니 Ubuntu 진행과 다르게 default.conf 파일과 폴더 등이 없습니다.
; /etc/nginx/nginx.conf 파일을 복사하여 가능하지만 Ubuntu OS에서 재구성할 경우를 대비해 Ubuntu 구성 절차로 진행했습니다.

USER1@ ~]$ sudo yum install nginx
USER1@ ~]$ sudo mkdir /etc/nginx/sites-available
USER1@ ~]$ sudo mkdir /etc/nginx/sites-enabled
USER1@ ~]$ sudo vi /etc/nginx/nginx.conf

[변경 전] 
include /etc/nginx/conf.d/*.conf;
(...이하 생략...)

[변경 후]
server_tokens off;      #off로 설정하면 에러페이지의 nginx 버전 숨김  
include /etc/nginx/sites-enabled/*.conf;

# /etc/nginx/nginx.conf 파일 내 server {} 블록 주석처리
#    server {
#        listen       80 default_server;
#        listen       [::]:80 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }       
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }       
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }       
#    }
USER1@ ~]$ sudo vi /etc/nginx/sites-available/code-server.conf

upstream vm2-code-server {             #upstream group name
     server 127.0.0.1:8080;            #code-server의 ip:port
}

server {
        listen 7777;                   #외부에서 접근하는 port
        listen [::]:7777;
        server_name vm2.mydomain.com;  #외부에서 호출하는 도메인 or VM ip

        location / {
                proxy_pass http://vm2-code-server;  #upstream group name
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection upgrade;
                proxy_set_header Accept-Encoding gzip;
                proxy_buffering off;
                #proxy_buffer_size          128k;
                #proxy_buffers              4 256k;
                #proxy_busy_buffers_size    256k;   
        }
}
USER1@ ~]$ sudo ln -s /etc/nginx/sites-available/code-server.conf /etc/nginx/sites-enabled/code-server.conf

USER1@ ~]$ cd /etc/nginx/sites-enabled/

USER1@ sites-enabled]$ ls -al
lrwxrwxrwx. 1 root root   43 Mar 12 14:29 code-server.conf -> /etc/nginx/sites-available/code-server.conf
[root@vm2 ~]$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

USER1@ ~]$ sudo systemctl start nginx.service
USER1@ ~]$ sudo systemctl status nginx.service
USER1@ ~]$ sudo systemctl enable nginx.service
USER1@ ~]$ sudo systemctl -t service list-unit-files |grep -i nginx
nginx.service         enabled 

3. Nginx 구성 중 오류

3-1. (인터넷)외부에서 접근할 포트를 7777 등으로 설정하면 nginx 시작이 안되는 오류

오류 - [emerg] bind() to 0.0.0.0:7777 failed (13: Permission denied)

USER1@ ~]$ sudo systemctl status nginx.service

● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Fri 2021-03-12 17:13:34 KST; 13s ago
Process: 3336 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=1/FAILURE)
Process: 3334 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)

Mar 12 17:13:34 vm2 systemd[1]: Starting The nginx HTTP and reverse proxy server...
Mar 12 17:13:34 vm2 nginx[3336]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Mar 12 17:13:34 vm2 nginx[3336]: nginx: [emerg] bind() to 0.0.0.0:7777 failed (13: Permission denied)
Mar 12 17:13:34 vm2 nginx[3336]: nginx: configuration file /etc/nginx/nginx.conf test failed
(..생략..)

조치 - 사용할 포트 추가 (또는 아래 3-2의 SELINUX=disabled 변경)

USER1@ ~]$ sudo semanage port -l | grep http_port_t
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000

USER1@ ~]$ sudo semanage port -a -t http_port_t -p tcp 7777
USER1@ ~]$ sudo semanage port -l | grep http_port_t
http_port_t                    tcp      7777, 80, 81, 443, 488, 8008, 8009, 8443, 9000

USER1@ ~]$ sudo systemctl restart nginx.service

3-2. 웹 브라우저로 http:// {mydomain}:{port} 접근할 때 “502 Bad Gateway” 오류
조치 - selinux disabled
;selinux 는 사용하지 않기에 disabled 수정하고 리부팅 후 재확인
;selinux 안쓰면 미리 변경해줍시다. ㅠ.ㅠ

USER1@ ~]$ sudo vi /etc/selinux/config

[변경 전]
SELINUX=enforcing

[변경 후]
SELINUX=disabled

4. Nginx 암호 인증 구성

;htpasswd 만 필요하여 찾아서 설치

USER1@ ~]$ yum provides \*bin/htpasswd
Failed loading plugin "osmsplugin": No module named 'librepo'
Last metadata expiration check: 10:51:48 ago on Fri 12 Mar 2021 12:29:59 PM KST.
httpd-tools-2.4.37-30.module_el8.3.0+561+97fdbbcc.x86_64 : Tools for use with the Apache HTTP Server
Repo        : appstream
Matched from:
Other       : *bin/htpasswd

USER1@ ~]$ sudo yum install -y httpd-tools

USER1@ ~]$ which htpasswd
/usr/bin/htpasswd

;로그인에 사용할 계정{myID}, 암호 설정

USER1@ ~]$ sudo htpasswd -c /etc/nginx/.htpasswd {myID}
New password: 
Re-type new password: 
Adding password for user {myID}

;auth_basic 인증 설정 추가
;MacOS/iPAD Safari 브라우저에서 nginx 로그인 후 code-server 로그인 뒤에 blank white screen 이슈가 있네요. 해결되면 업데이트하겠습니다. ㅠ.ㅠ

USER1@ ~]$ sudo vi /etc/nginx/sites-available/code-server.conf

upstream vm2-code-server {             #upstream group name
     server 127.0.0.1:8080;            #code-server의 ip:port
}

server {
        listen 7777;                   #외부에서 접근하는 port
        listen [::]:7777;
        server_name vm2.mydomain.com;  #외부에서 호출할 도메인 or VM ip

        location / {
                proxy_pass http://vm2-code-server;   #upstream group name
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection upgrade;
                proxy_set_header Accept-Encoding gzip;
                auth_basic "Authentication Page";
                auth_basic_user_file /etc/nginx/.htpasswd;
                proxy_buffering off;
                #proxy_buffer_size          128k;
                #proxy_buffers              4 256k;
                #proxy_busy_buffers_size    256k;   
        }
}

; nginx 재시작 후 브라우저에서 암호 설정한 계정으로 로그인 테스트

USER1@ ~]$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

USER1@ ~]$ sudo systemctl restart nginx.service
USER1@ ~]$ 

참고 글