서버개발

NextCloud 직접 수동 설치 하기

이 내용은 snap을 이용한 자동설치 가 실패했을 때, 직접 설치하기 위해 작성하였습니다.

기본적으로 내용 참고한 사이트를 링크해드립니다.

저는 이미 아파치가 설치되어있으므로 생략합니다만, 그래도 디렉토리 리스팅이 웹브라우저에서 되는걸 막는 코드는 삽입해야겠네요.

$sudo sed -i "s/Options Indexes FollowSymLinks/Options FollowSymLinks/" /etc/apache2/apache2.conf

저는 이미 mysql DB 가 설치 되어있으므로 생략합니다.

저는 php7.2 최신 버전을 이용하겠습니다. ( 기존에 php 5로 되어있었는데, 쓸일은 없었기 때문에 다시 갈아타도록 할 것입니다.)

$sudo apt install php libapache2-mod-php
$sudo systemctl restart apache2

이제 /etc/php/7.2/apache2/php.ini 파일을 수정하겠습니다.

nano /etc/php/7.1/apache2/php.ini

아래 내용을 적용해 주시면 됩니다.

file_uploads = On
allow_url_fopen = On
memory_limit = 256M
upload_max_filesize = 100M
display_errors = Off
date.timezone = America/Chicago

다음은 nextcloud 데이터베이스를 생성하겠습니다.

sudo mysql -u root -p // 데이터베이스로 진입합니다.
mysql>CREATE DATABASE nextcloud;
mysql>CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'new_password_here';
mysql>GRANT ALL ON nextcloud.* TO 'nextclouduser'@'localhost' IDENTIFIED BY 'user_password_here' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;
mysql>EXIT;

이제 nextcloud 소스를 받아보겠습니다.(최신버전의 링크는  여기서 확인하시면 됩니다.)

$cd /tmp && wget https://download.nextcloud.com/server/releases/nextcloud-13.0.5.zip
$unzip nextcloud-13.0.5.zip
sudo mv nextcloud /var/www/html/nextcloud/ 

이제 폴더의 권한을 설정하겠습니다.

$sudo chown -R www-data:www-data /var/www/html/nextcloud/
$sudo chmod -R 755 /var/www/html/nextcloud/

이제 웹에서 보이도록 아파치를 설정하도록 하겠습니다.

sudo nano /etc/apache2/sites-available/nextcloud.conf
<VirtualHost *:80>
     ServerAdmin admin@example.com
     DocumentRoot /var/www/html/nextcloud/
     ServerName example.com
     ServerAlias www.example.com
  
     Alias /nextcloud "/var/www/html/nextcloud/"

     <Directory /var/www/html/nextcloud/>
        Options +FollowSymlinks
        AllowOverride All
        Require all granted
          <IfModule mod_dav.c>
            Dav off
          </IfModule>
        SetEnv HOME /var/www/html/nextcloud
        SetEnv HTTP_HOME /var/www/html/nextcloud
     </Directory>

     ErrorLog ${APACHE_LOG_DIR}/error.log
     CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

이제 80포트로 들어오면 nextcloud로 들어가게 위의 내용을 아파치에 적용합니다.

//우선 80포트를 사용하고 있는 conf를 끄겠습니다.
$ ls /etc/apache2/site-enabled
>000-default.conf default-ssl.conf
$ sudo a2dissite 000-default.conf default-ssl.conf
>Site 000-default disabled.
>Site default-ssl disabled.
>To activate the new configuration, you need to run:
>  systemctl reload apache2

$sudo a2ensite nextcloud.conf
$sudo a2enmod rewrite
$sudo a2enmod headers
$sudo a2enmod env
$sudo a2enmod dir
$sudo a2enmod mime
$sudo service apache2 restart

웹브라우저에서 접속을 했떠니… 뭔가 설정을 안해줬습니다.

일단 php 버전을 확인해 보았습니다.

/var/www/html/nextcloud/phpinfo.php 파일을 만들어서

<?php
  phpinfo();
?>

웹브라우저에서 http://192.168.0.61/phpinfo.php 하니 php7.2버전입니다. 그렇다면 이문제는 아니겠군요… 해서 php7.2에 대한 추가적인 모듈을 모조리 설치하기로 했습니다.

$sudo apt-get install php-pear php-fpm php-dev php-zip php-curl php-xmlrpc php-gd php-mysql php-mbstring php-xml libapache2-mod-php
$sudo service apache2 restart

다시 http://192.168.0.61 로 접속을 해봤습니다.

드디어 성공입니다. 이제 위의 내용을 채워놓고 실행해보아야 겠습니다.

데이터폴더(파일저장공간)은 보안상의 이유로 보통 다른 공간에 옮겨 놓아야 합니다.

그리고 데이터베이스 포트번호는 혹시 다를 지도 모르니 확인해봐야겠습니다.

$ mysql -u root -p
mysql> SHOW GLOBAL VARIABLES LIKE 'PORT';

그럼 3306 으로 접근하면 되겠네요.

뭔가 오류가 보이긴 하지만 일단 되었습니다.

그런데 이제 nextcloud 앱을 이용해서 핸드폰에서 봐야 하니까 https를 적용해야겠습니다.

아파치를 이용해 https를 적용하는데 있어서 도메인 이름이 없을 경우 selfsigned ssl 을 적용해야 합니다. 이곳을 참고 하겠습니다.

대략적인 내용은 다음과 같습니다.

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
>Country Name (2 letter code) [AU]:KO
>State or Province Name (full name) [Some-State]:Seoul
>Locality Name (eg, city) []:Seoul
>Organization Name (eg, company) [Internet Widgits Pty Ltd]:WORKING TEAM
>Organizational Unit Name (eg, section) []:SERVER Section
>Common Name (e.g. server FQDN or YOUR name) []:192.168.0.61
>Email Address []:admin@example.com
/etc/apache2/conf-available$ sudo vim ssl-params.conf
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

위의 내용을 넣고 저장합니다.

이제 /etc/apache2/sites-available/default-ssl.conf  이 파일을 수정해서 ssl이 동작되도록 하겠습니다.

$ sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak
$ sudo nano /etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin your_email@example.com
                ServerName server_domain_or_IP

                DocumentRoot /var/www/html/nextcloud

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

이제 우리가 설정한 nextcloud.conf 를 다시 수정해서 redirect시키겠습니다.(이 방법은 https를 전적으로 이용하는 방법일것 같습니다. 네이버 처럼 로그인했을 경우, http로 접속하게 하려면 코드 상에서 구현해야 할 것 같습니다. )

vim /etc/apache2/site-available/nextcloud.conf
<VirtualHost *:80> // 요밑에 바로 리다이렉트 시키겠습니다.
     Redirect permanent "/" "https://192.168.0.61/"
     ....
</VirtualHost>
$sudo a2ensite default-ssl.conf
$sudo service apache2 restart

이제 다시 nextcloud에 접속해 보겠습니다. 

고급눌르고 계속진행입니다..

성공했습니다. 이제 핸드폰의 구글플레이/AppStore 에서 nextcloud를 찾아서 설치하시면 핸드폰에서 연동이 됩니다.

제가 한가지 실수를 했네요, HTTP 에서 HTTPS로 바꾸었을 때, 아파치 설정을 바꾸어줘야 합니다.

default-ssl.conf 안에 nextcloud.conf 에 있는 내용을 가져와야 합니다.

다음 문구가 발생했을 때는

“Strict-Transport-Security” HTTP header (HSTS)

아파치 설정에서 (conf-available/ssl-parms.conf)

Header always add Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"

와 같이 설정해 주어야 합니다. ( 주석으로 되어있네요 )

음…그래도 경고가 사라지지 않네요? 아..확인해보니 저 설정을 활성화 시켜주지 않았네요…다음과 같이 활성해 해주고 아파치를 다시 리로드해주세요.

/etc/apache2$ sudo a2enconf ssl-params
/etc/apache2$ sudo service apache2 reload

이번에는 다른 경고가 떳습니다

The “X-Content-Type-Options” HTTP header is not set to “nosniff”. This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.

/var/www/html/nextcloud/.htaccess 파일에 들어가서

아래를
Header set X-Content-Type-Options "nosniff"
아래로
# Header set X-Content-Type-Options "nosniff"

다시 sudo service apache2 reload 해주시고 리프레쉬 해주시면 사라진게 보입니다.

다음은 “SAMEORIGIN” 에 대한 문제입니다. 경고문구는 다음과 같습니다.

The "X-Frame-Options" HTTP header is not configured to equal to "SAMEORIGIN". This is a potential security or privacy risk and we recommend adjusting this setting.

해결방법은 SAMEORIGIN 을 찾아서 주석 처리 해버리는 것입니다.
/etc/apache2/conf-available/ 아래 params-ssl.conf 와 security.conf 에서 내용을 찾아서 둘다 주석처리해주세요.

다음은 opcache 에 대한 설정 문제입니다. 이번엔 /etc/php/7.2/안에서 php.ini 파일 안에서 내용을 찾아서 주석을 제거해주시고 내용을 바꿔주세요.

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1
opcache.save_comments=1

memcache 설정은… APCuREDIS 까지만 설정해 보았지만, 여기선 다루지 않도록 하겠습니다. 

댓글 남기기

This site uses Akismet to reduce spam. Learn how your comment data is processed.