1. 서버 업데이트 및 기본 패키지 설치
먼저 서버를 최신 상태로 업데이트하고, 필요한 패키지를 설치합니다.
sudo apt update && sudo apt upgrade -y
sudo apt install software-properties-common unzip -y2. Apache 웹 서버 설치
Apache는 Nextcloud의 웹 서버로 사용됩니다.
sudo apt install apache2 -yApache 설치 후 서비스를 활성화하고 시작합니다.
sudo systemctl enable apache2
sudo systemctl start apache23. MySQL 데이터베이스 설치 및 설정
Nextcloud는 데이터를 저장할 데이터베이스가 필요합니다. MySQL을 설치하고 데이터베이스와 사용자 계정을 설정합니다.
sudo apt install mysql-server -yMySQL 설치가 완료되면 보안을 강화하는 초기 설정을 진행합니다.
sudo mysql_secure_installation보안 설정이 완료되면 MySQL에 로그인하여 Nextcloud용 데이터베이스와 사용자 계정을 생성합니다.
sudo mysql -u root -pMySQL 프롬프트에서 다음 명령어를 실행합니다.
CREATE DATABASE nextcloud;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;
EXIT;참고:
your_password는 강력한 비밀번호로 설정하세요.
4. PHP 설치 및 설정
Nextcloud는 PHP 8.1 이상이 필요하며, 여러 PHP 모듈을 함께 설치합니다. *(HTTP/2를 사용하기 위해서는 Apache 2.4.46 이상 최신 버전과 php 8.3으로 설치 하는 것이 좋다. 여러모로 Ubuntu를 최신 버전으로 사용하는 것이 좋을 듯)
4.1. Ubuntu 22.04 부터는 자동으로 8.1으로 설치됨
sudo apt install php libapache2-mod-php php-mysql php-gd php-xml php-mbstring php-curl php-zip php-intl php-json php-bcmath php-imagick -y4.2. Ubuntu 20.04 는 7.4가 설치된다. 이 경우
echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/ondrej-php.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E5267A6C
sudo apt update
sudo apt install -y php8.1 php8.1-cli php8.1-fpm php8.1-common php8.1-mbstring php8.1-xml php8.1-mysql php8.1-zip php8.1-curl php8.1-gd php8.1-intl php8.1-bcmath php8.1-imagick
sudo a2dismod php7.4
sudo a2enmod php8.1
ERROR: Module php8.1 does not exist!
>>
sudo apt install php8.1-fpm -y
sudo a2enmod proxy_fcgi setenvif
// 20.04의 경우 nextcloud 실행 시 php 버전 에러 출력 시,
sudo vi /etc/apache2/sites-available/nextcloud.conf
sudo vi /etc/apache2/sites-available/nextcloud-le-ssl.conf
두 파일 다 PHP-FPM 설정 추가<VirtualHost *:80>
ServerName your_domain_or_IP
DocumentRoot /var/www/nextcloud
<Directory /var/www/nextcloud/>
Options +FollowSymlinks
AllowOverride All
Require all granted
</Directory>
# PHP-FPM 설정 추가
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
SetEnv HOME /var/www/nextcloud
SetEnv HTTP_HOME /var/www/nextcloud
</VirtualHost>sudo systemctl restart apache2
PHP 설정을 최적화하기 위해 다음 파일을 엽니다.
sudo vi /etc/php/8.1/apache2/php.ini
sudo vi /etc/php/8.3/apache2/php.ini
sudo vi /etc/php/8.1/fpm/php.ini
sudo vi /etc/php/8.3/fpm/php.ini아래 설정을 찾아 다음과 같이 수정합니다.
memory_limit = 5G
upload_max_filesize = 5G
post_max_size = 5G
max_execution_time = 300
date.timezone = Asia/Seoulsudo systemctl restart apache2
sudo systemctl restart php8.1-fpm.service
sudo systemctl restart php8.3-fpm.service5. Nextcloud 다운로드 및 설치
Nextcloud 최신 버전을 다운로드하여 설정합니다.
wget https://download.nextcloud.com/server/releases/nextcloud-XX.XX.XX.zip
wget https://download.nextcloud.com/server/releases/nextcloud-30.0.1.zip참고:
XX.XX.XX부분은 최신 버전으로 교체하세요. Nextcloud 공식 다운로드 페이지에서 최신 버전을 확인할 수 있습니다.
다운로드한 파일을 압축 해제하고, Apache 웹 서버의 루트 디렉터리로 이동합니다.
unzip nextcloud-XX.XX.XX.zip
sudo mv nextcloud /var/www/6. Apache 설정
Nextcloud 디렉터리의 권한을 Apache 웹 서버가 접근할 수 있도록 설정합니다.
sudo chown -R www-data:www-data /var/www/nextcloud
sudo chmod -R 755 /var/www/nextcloudApache에 새로운 VirtualHost 설정 파일을 생성합니다.
sudo vi /etc/apache2/sites-available/nextcloud.conf파일에 아래 내용을 추가합니다.
<VirtualHost *:80>
DocumentRoot "/var/www/nextcloud"
ServerName nextcloud.example.com
ErrorLog ${APACHE_LOG_DIR}/nextcloud.error
CustomLog ${APACHE_LOG_DIR}/nextcloud.access combined
<Directory /var/www/nextcloud/>
Require all granted
Options FollowSymlinks MultiViews
AllowOverride All
SetEnv HOME /var/www/nextcloud
SetEnv HTTP_HOME /var/www/nextcloud
Satisfy Any
</Directory>
</VirtualHost>설정 파일을 저장하고, 활성화한 후 Apache 모듈을 활성화하고 재시작합니다.
sudo a2ensite nextcloud.conf
sudo a2enmod rewrite headers env dir mime setenvif
sudo systemctl restart apache27. SSL 보안 인증서 설치 및 HTTPS 리다이렉트 설정
Let’s Encrypt SSL 인증서를 설치하여 Nextcloud를 HTTPS로 보호합니다.
sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache --agree-tos --redirect --staple-ocsp --email your_email@example.com -d your_domain_or_IP --rsa-key-size 4096 --deploy-hook "systemctl reload apache2"참고:
your_domain_or_IP를 도메인 이름 또는 서버 IP로 대체하세요. 인증서 설치 후certbot이 자동으로 Apache 설정을 업데이트하여 HTTP 요청을 HTTPS로 리다이렉트합니다.
인증서가 성공적으로 설치되면 http://your_domain_or_IP로 접속 시 자동으로 https://your_domain_or_IP로 리다이렉트됩니다.
7.0. Certbot error!!
7.1. 기존 Certbot 및 Python 패키지 제거
먼저 시스템에서 기존 Certbot과 Python 관련 패키지를 모두 제거합니다.
sudo apt remove --purge python3-pip certbot -y7.2. Snap으로 Certbot 설치
Snap 패키지를 통해 Certbot을 설치하면, pip나 pyOpenSSL 충돌 없이 독립된 환경에서 실행됩니다.
7.2.1. Snap 설치 및 업데이트 (Snap이 설치되지 않은 경우)
sudo apt update
sudo apt install snapd -y
sudo snap install core
sudo snap refresh core7.2.2.Certbot 설치
sudo snap install --classic certbot7.2.3.Certbot에 접근할 수 있도록 링크 생성
sudo ln -s /snap/bin/certbot /usr/bin/certbot7.3. Certbot 명령 실행
이제 certbot 명령을 실행해 SSL 인증서를 설정할 수 있습니다.
sudo certbot --apache --agree-tos --redirect --staple-ocsp --email your_email@example.com -d your_domain_or_IP --rsa-key-size 4096 --deploy-hook "systemctl reload apache2"- Apache 서버에 SSL 인증서 설치 (
--apache). - Let’s Encrypt 서비스 약관 자동 동의 (
--agree-tos). - HTTP에서 HTTPS로의 자동 리다이렉트 설정 (
--redirect). - OCSP Stapling 활성화 (
--staple-ocsp). - 갱신 및 인증서 만료 알림을 받을 이메일 설정 (
--email your_email@example.com). - 도메인 지정 (
-d your_domain_or_IP). - 4096비트의 RSA 키 생성 (
--rsa-key-size 4096). - 인증서 갱신 후 Apache 자동 재시작 (
--deploy-hook "systemctl reload apache2"). 이 방법으로certbot을 설치하면 기존pip문제를 우회하여 인증서 설치가 가능할 것입니다. Snap 패키지는 자체 환경을 사용하므로, 기존 Python 환경의 충돌 없이 사용할 수 있습니다.
8. Nextcloud 웹 설치 마법사 실행
웹 브라우저에서 https://your_domain_or_IP로 이동하여 Nextcloud 설치 마법사를 실행합니다.
- 관리자 계정 생성: 관리자 사용자 이름과 비밀번호를 설정합니다.
- 데이터베이스 설정: 아래와 같이 입력합니다.
- 데이터베이스 사용자 이름:
nextclouduser - 데이터베이스 비밀번호:
your_password - 데이터베이스 이름:
nextcloud - 데이터베이스 호스트:
localhost(nextcloud 서버와 db가 같은 서버)
- 데이터베이스 사용자 이름:
설정을 완료하고 “설치 완료”를 클릭하여 설치를 마칩니다.
9. 추가 설정들
9.1 background cron.php
Nextcloud에서 백그라운드 작업을 처리할 때, cron을 사용하는 것이 가장 안정적이고 추천되는 방법입니다. 특히 사용자 수가 증가하거나 많은 파일을 다루는 환경에서 cron은 다음과 같은 장점이 있습니다:
- 일관된 실행: 시스템의 cron 서비스가 5분마다
cron.php를 실행하도록 설정하면, 서버의 부하와 관계없이 일정하게 백그라운드 작업이 수행됩니다. 이는 페이지 로드에 의존하는 AJAX 방식보다 안정적입니다. - 서버 부하 감소: AJAX 방식은 사용자가 페이지에 접속할 때마다 작업을 수행하기 때문에, 많은 사용자가 접속하면 오히려 서버 부하가 증가할 수 있습니다. 반면 cron은 서버에서 독립적으로 실행되어 부하를 줄여줍니다.
- 유연한 조정: cron을 통해 작업 빈도를 자유롭게 설정할 수 있어 서버 상태에 맞춰 조정할 수 있습니다. 예를 들어, 5분에서 15분 주기로 변경할 수 있습니다.
- 더 나은 성능:
cron.php가 필요할 때만 호출되므로, 페이지 로드 속도에 영향을 주지 않으며, 더 빠르고 일관된 성능을 보장합니다.
대규모 인스턴스나 안정성이 중요한 서버 환경에서는 cron을 사용하는 방식이 가장 추천되며, 특히 다음과 같이 설정하는 것이 좋습니다:
// set editor
sudo update-alternatives --set editor /usr/bin/nvim
or
sudo update-alternatives --set editor /usr/bin/vim
// edit crontab
sudo -u www-data crontab -e// add cron job in crontab
*/5 * * * * php -f /var/www/nextcloud/cron.php이 설정을 통해 Nextcloud가 정기적으로 백그라운드 작업을 안정적으로 수행하도록 할 수 있습니다.
// cron test
sudo -u www-data php -f /var/www/nextcloud/cron.php
/var/www/nextcloud/cron.php PHP Warning: PHP Startup: Unable to load dynamic library 'imagick.so' (tried: /usr/lib/php/20240924/imagick.so (/usr/lib/php/20240924/imagick.so: undefined symbol: php_strtolower), /usr/lib/php/20240924/imagick.so.so (/usr/lib/php/20240924/imagick.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 This version of Nextcloud is not compatible with PHP>=8.4.<br/>You are currently running 8.4.0RC1.와 같은 에러 뜨면 서버에서 실행하는 php 버전이 안맞아서 그럼
sudo update-alternatives --set php /usr/bin/php8.3
or
sudo update-alternatives --set php /usr/bin/php8.1nextcloud와 버전 맞춰주면 됨
9.2 HTTP/2
- 성능 개선:
- 멀티플렉싱: HTTP/2는 단일 연결에서 여러 개의 요청을 동시에 처리할 수 있어 네트워크 성능을 크게 향상시킵니다.
- 헤더 압축: HTTP/2는 헤더 정보를 압축하여 요청과 응답 간 데이터 전송량을 줄입니다.
- 서버 푸시: 서버에서 클라이언트가 요청하기 전에 필요한 리소스를 미리 전송할 수 있어 웹 페이지 로딩 속도가 빨라집니다.
- 보안 강화:
- HTTP/2는 HTTPS를 기본 요구 사항으로 설정하여 보안을 강화합니다.
- 네트워크 자원 절약:
- HTTP/2는 연결을 효율적으로 관리하여 네트워크 대역폭과 서버 리소스를 절약합니다. 결과적으로 더 나은 사용자 경험을 제공합니다.
이와 같이 HTTP/2를 활성화하면 Nextcloud 서비스의 응답성과 성능이 개선되어 최적의 클라우드 파일 공유 환경을 구축할 수 있습니다.
sudo a2enmod http2
sudo vi /etc/apache2/sites-available/nextcloud-le-ssl.conf<VirtualHost *:443>
ServerName yourdomain.com
Protocols h2 http/1.1
...
</VirtualHost>sudo systemctl restart apache2
sudo systemctl restart php8.3-fpm
curl -I -s --http2 -k https://yourdomain.com
HTTP/2 302
// HTTP/1.1 >>
sudo vi /var/log/apache2/error.log
sudo a2dismod php8.3
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo apt install php8.3-fpm
sudo vi /etc/apache2/sites-available/nextcloud.conf
sudo vi /etc/apache2/sites-available/nextcloud-le-ssl.conf
# PHP-FPM 설정 추가
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
sudo vi /etc/php/8.3/apache2/php.ini
sudo vi /etc/php/8.3/fpm/php.ini
memory_limit = 5G
upload_max_filesize = 5G
post_max_size = 5G
max_execution_time = 300
date.timezone = Asia/Seoul
sudo systemctl restart apache2
sudo systemctl restart php8.3-fpm