웹사이트 검색

Fedora 32에서 Nextcloud를 설치하고 구성하는 방법


이 페이지에서

  1. 전제 조건
  2. 방화벽 구성\n
  3. PHP 설치
  4. PHP 구성
  5. Nginx 설치
  6. MariaDB 설치
  7. MariaDB 구성
  8. Nextcloud 다운로드
  9. SSL 설치
  10. SELinux/권한 구성\n
  11. Nextcloud용 Nginx 구성
  12. Nextcloud 설치
  13. 결론

Nextcloud는 여러 장치에서 데이터를 저장하고 동기화하기 위한 오픈 소스 소프트웨어입니다. 자신의 Dropbox 클론으로 간주할 수 있습니다. 그러나 파일 저장 외에도 캘린더, 연락처, 예약된 작업, 미디어 스트리밍 등과 같은 추가 기능도 제공합니다.

Nextcloud는 다양한 장치에서 파일을 동기화하는 데 사용할 수 있는 Android 및 iOS용 모바일 앱과 Windows, Linux, MacOS용 앱을 제공합니다.

이 튜토리얼에서는 Fedora 32 기반 서버에 Nextcloud를 설치하고 구성하는 방법을 배웁니다. 또한 PHP 7.4 및 MariaDB와 함께 Nginx 웹 서버를 설치합니다.

전제 조건

  • A server running Fedora 32.

  • A non-root sudo user.

  • Make sure everything is updated.

    $ sudo dnf update
    
  • Essential packages.

    $ sudo dnf install wget curl bzip2 nano unzip policycoreutils-python-utils -y
    

    Some of these packages may already be on your system.

방화벽 구성

첫 번째 단계는 방화벽을 구성하는 것입니다. Fedora 서버에는 Firewalld 방화벽이 미리 설치되어 있습니다.

방화벽이 실행 중인지 확인하십시오.

$ sudo firewall-cmd --state
running

현재 허용된 서비스/포트를 확인하십시오.

$ sudo firewall-cmd --permanent --list-services

다음 출력이 표시되어야 합니다.

dhcpv6-client mdns ssh

HTTP 및 HTTPS 포트를 허용합니다.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

방화벽의 상태를 다시 확인하십시오.

$ sudo firewall-cmd --permanent --list-services

비슷한 출력이 표시되어야 합니다.

dhcpv6-client http https mdns ssh

방화벽을 다시 로드합니다.

$ sudo systemctl reload firewalld

PHP 설치

Fedora 32는 기본적으로 PHP 7.4와 함께 제공되지만 업데이트된 PHP 리포지토리를 갖기 위해 REMI 리포지토리를 추가합니다.

PHP 패키지 설치를 위한 공식 Fedora 리포지토리인 REMI 리포지토리를 설치합니다.

$ sudo dnf -y install https://rpms.remirepo.net/fedora/remi-release-32.rpm

remi 저장소를 활성화하고 remi-modular 저장소를 비활성화합니다. 이렇게 하면 PHP 7.4 패키지를 설치하는 데 필요한 리포지토리가 활성화됩니다.

$ sudo dnf config-manager --set-enabled remi
$ sudo dnf config-manager --set-disabled remi-modular

일부 추가 패키지와 함께 PHP 7.4를 설치합니다.

$ sudo dnf install php-fpm php-cli php-gd php-mbstring php-intl php-mysqlnd php-imagick php-zip php-json php-process php-xml php-bcmath php-gmp php-ftp php-smbclient php-opcache

PHP가 올바르게 작동하는지 확인하십시오.

$ php --version
PHP 7.4.11 (cli) (built: Sep 29 2020 10:17:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.11, Copyright (c), by Zend Technologies

PHP 구성

/etc/php-fpm.d/www.conf 파일을 엽니다.

$ sudo nano /etc/php-fpm.d/www.conf

PHP 프로세스의 Unix 사용자/그룹을 nginx로 설정해야 합니다. 파일에서 user=apachegroup=apache 줄을 찾아 nginx로 변경합니다.

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
...

아래의 PHP 환경 변수의 주석을 제거하십시오.

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

마지막 줄에서 opcache 구성의 주석을 해제하십시오.

php_value[opcache.file_cache] = /var/lib/php/opcache

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

이제 PHP opcache 구성 /etc/php.d/10-opcache.ini를 편집합니다.

$ sudo nano /etc/php.d/10-opcache.ini

아래와 같이 구성을 변경합니다.

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

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

다음 명령을 실행하여 PHP의 파일 업로드 및 메모리 제한을 늘립니다.

$ sudo cp /etc/php.ini /etc/php.ini.bak
$ sudo sed -i "s/memory_limit = 128M/memory_limit = 512M/" /etc/php.ini
$ sudo sed -i "s/post_max_size = 8M/post_max_size = 100M/" /etc/php.ini
$ sudo sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 100M/" /etc/php.ini

기본적으로 그룹 소유자가 apache로 설정된 /var/lib/php/ 디렉토리에는 3개의 파일이 있지만 Nginx를 사용하고 있습니다. 따라서 nginx 사용자에게 setfacl을 사용하여 3개의 디렉토리를 읽고 쓸 수 있는 권한을 부여해야 합니다.

$ sudo setfacl -R -m u:nginx:rwx /var/lib/php/opcache/
$ sudo setfacl -R -m u:nginx:rwx /var/lib/php/session/
$ sudo setfacl -R -m u:nginx:rwx /var/lib/php/wsdlcache/

php-fpm 프로세스를 활성화하고 시작합니다.

$ sudo systemctl enable php-fpm
$ sudo systemctl start php-fpm

Nginx 설치

Fedora 32는 기본적으로 Nginx의 최신 안정 버전과 함께 제공됩니다.

Nginx를 설치합니다.

$ sudo dnf install nginx -y

제대로 작동하는지 확인하십시오.

$ nginx -v
nginx version: nginx/1.18.0

Nginx를 시작하고 활성화합니다.

$ sudo systemctl start nginx
$ sudo systemctl enable nginx

다음 페이지를 보려면 브라우저에서 서버 IP 주소를 여십시오. Nginx가 제대로 작동하고 있음을 의미합니다.

MariaDB 설치

MariaDB는 MySQL의 드롭인 대체품으로 MariaDB를 실행하고 작동하는 명령이 MySQL과 동일합니다.

기본적으로 Fedora 32는 우리가 사용할 MariaDB 10.4와 함께 제공됩니다.

MariaDB 서버를 설치합니다.

$ sudo dnf install mariadb-server

MariaDB가 올바르게 설치되었는지 확인하십시오.

$ mysql --version
mysql  Ver 15.1 Distrib 10.4.14-MariaDB, for Linux (x86_64) using  EditLine wrapper

MariaDB 서비스를 활성화하고 시작합니다.

$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb

다음 명령을 실행하여 루트 암호 제공, 익명 사용자 제거, 원격 루트 로그인 금지 및 테스트 테이블 삭제와 같은 기본 구성을 수행합니다.

$ sudo mysql_secure_installation

Enter 키를 누르면 기본 옵션(대문자로 표시된 옵션, 이 경우 Y)이 선택됩니다.

Enter current password for root (enter for none): [PRESS ENTER]
Switch to unix_socket authentication [Y/n] [PRESS ENTER]
Change the root password? [Y/n] [ANSWER n]
Remove anonymous users? [Y/n] [PRESS ENTER]
Disallow root login remotely? [Y/n] [PRESS ENTER]
Remove test database and access to it? [Y/n] [PRESS ENTER]
Reload privilege tables now? [Y/n] [PRESS ENTER]

그게 다야. 다음에 MySQL에 로그인하려면 다음 명령을 사용하십시오.

$ sudo mysql

프롬프트가 표시되면 루트 비밀번호를 입력하십시오.

MariaDB 구성

다음 명령을 입력하여 MySQL 셸에 들어갑니다.

$ sudo mysql

NextCloud 데이터베이스를 처리할 MySQL 사용자를 생성합니다.

mysql> CREATE USER 'nextuser'@'localhost' IDENTIFIED BY 'yourpassword';

NextCloud 데이터베이스를 생성합니다.

mysql> CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

생성한 사용자에게 Nextcloud 데이터베이스에 대한 모든 권한을 부여합니다.

mysql> GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextuser'@'localhost';

MySQL 셸을 종료합니다.

mysql> exit

넥스트클라우드 다운로드

Nextcloud 폴더를 다운로드하고 설정할 시간입니다.

$ wget https://download.nextcloud.com/server/releases/latest.tar.bz2
$ tar -jxvf latest.tar.bz2
$ sudo mv nextcloud /var/www/html/

다음으로 데이터 폴더를 만들어야 합니다.

$ sudo mkdir /var/www/html/nextcloud/data
$ sudo chown -R nginx:nginx /var/www/html/nextcloud

SSL 설치

Let’s Encrypt 서비스를 사용하여 SSL을 설치합니다.

이를 위해 Certbot을 설치합니다.

$ sudo dnf install certbot

Certbot 프로세스를 방해하므로 Nginx를 중지하십시오.

$ sudo systemctl stop nginx

인증서를 생성합니다. DHParams 인증서도 생성합니다.

$ export LDOMAIN="nextcloud.example.com"
$ export LEMAIL=""
$ sudo certbot certonly --standalone -d $LDOMAIN --preferred-challenges http --agree-tos -n -m $LEMAIL --keep-until-expiring 
$ sudo systemctl start nginx
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

또한 SSL을 자동으로 갱신하기 위해 cron 작업을 설정해야 합니다. crontab 편집기를 열려면 다음 명령을 실행합니다.

$ sudo EDITOR=nano crontab -e

위의 명령은 기본 Vim 편집기 대신 Nano 편집기로 Crontab을 엽니다.

맨 아래에 다음 줄을 붙여넣습니다.

25 2 * * * /usr/bin/certbot renew --quiet --pre-hook “systemctl stop nginx” --post-hook “systemctl start nginx”

위의 크론 작업은 매일 오전 2시 25분에 certbot을 실행합니다. 원하는 것으로 변경할 수 있습니다.

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

SELinux/권한 구성

Nextcloud가 Fedora에서 작동하도록 SELinux를 구성해야 합니다. 모두에게 적용되는 기본 SELinux 설정을 위해 다음 명령을 입력합니다.

귀하의 경우 파일 경로가 다른 경우 파일 경로를 조정하십시오.

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/data(/.*)?'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/config(/.*)?'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/apps(/.*)?'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/.user.ini'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/3rdparty/aws/aws-sdk-php/src/data/logs(/.*)?'

$ sudo restorecon -Rv '/var/www/html/nextcloud/'

Nextcloud의 웹 인터페이스를 통해 업데이트를 활성화하려면 다음 명령도 실행하십시오.

$ sudo setsebool -P httpd_unified on

Nextcloud용 Nginx 구성

다음으로 Nextcloud를 호스팅하기 위해 Nginx를 구성해야 합니다.

우리의 목적을 위해 Nextcloud는 http://nextcloud.example.com 도메인에서 호스팅됩니다.

서버 블록이 위치할 디렉토리를 설정합니다.

$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled

편집을 위해 /etc/nginx/nginx.conf 파일을 엽니다.

$ sudo nano /etc/nginx/nginx.conf	

include /etc/nginx/conf.d/*.conf 줄 뒤에 다음 줄을 붙여넣습니다.

include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;

Ctrl + X를 눌러 편집기를 닫고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

Nano 편집기를 사용하여 /etc/nginx/sites-available/nextcloud.conf 파일을 생성합니다.

$ sudo nano /etc/nginx/sites-available/nextcloud.conf

편집기에 다음 코드를 붙여넣습니다. 붙여넣기 전에 예시 도메인을 실제 도메인으로 교체해야 합니다.

upstream php-handler {
    #server 127.0.0.1:9000;
    server unix:/run/php-fpm/www.sock;
}

server {
    listen 80;
    listen [::]:80;
    server_name nextcloud.example.com;
    # enforce https
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name nextcloud.example.com;
	
	access_log /var/log/nginx/nextcloud.access.log;
    error_log /var/log/nginx/nextcloud.error.log;

    # Use Mozilla's guidelines for SSL/TLS settings
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/
    # NOTE: some settings below might be redundant
    ssl_certificate /etc/letsencrypt/live/nextcloud.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/nextcloud.example.com/privkey.pem;
	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;
	ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
	ssl_dhparam /etc/ssl/certs/dhparam.pem;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this
    # topic first.
    #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
    #
    # WARNING: Only add the preload option once you read about
    # the consequences in https://hstspreload.org/. This option
    # will add the domain to a hardcoded list that is shipped
    # in all major browsers and getting removed from this list
    # could take several months.
    add_header Referrer-Policy "no-referrer" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Download-Options "noopen" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Permitted-Cross-Domain-Policies "none" always;
    add_header X-Robots-Tag "none" always;
    add_header X-XSS-Protection "1; mode=block" always;
	
	# Remove X-Powered-By, which is an information leak
    fastcgi_hide_header X-Powered-By;

    # Path to the root of your installation
    root /var/www/html/nextcloud;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    # The following rule is only needed for the Social app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/webfinger /public.php?service=webfinger last;

    location = /.well-known/carddav {
      return 301 $scheme://$host:$server_port/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host:$server_port/remote.php/dav;
    }

    # set max upload size
    client_max_body_size 100M;
    fastcgi_buffers 64 4K;

    # Enable gzip but do not remove ETag headers
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    location / {
        rewrite ^ /index.php;
    }

    location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
        deny all;
    }
    location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) {
        fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
        set $path_info $fastcgi_path_info;
        try_files $fastcgi_script_name =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;
        # Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        # Enable pretty urls
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
        try_files $uri/ =404;
        index index.php;
    }

    # Adding the cache control header for js, css and map files
    # Make sure it is BELOW the PHP block
    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        add_header Referrer-Policy "no-referrer" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-Download-Options "noopen" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Permitted-Cross-Domain-Policies "none" always;
        add_header X-Robots-Tag "none" always;
        add_header X-XSS-Protection "1; mode=block" always;

        # Optional: Don't log access to assets
        access_log off;
    }

    location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
        try_files $uri /index.php$request_uri;
        # Optional: Don't log access to other assets
        access_log off;
    }
}

Ctrl + X를 눌러 편집기를 닫고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

sites-enabled 디렉터리에 연결하여 이 구성 파일을 활성화합니다.

$ sudo ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/

Nginx 구성을 테스트합니다.

$ sudo nginx -t

모든 것이 정상이면 Nginx 서비스를 다시 로드합니다.

$ sudo systemctl reload nginx

넥스트클라우드 설치

명령줄 또는 그래픽 인터페이스를 통해 Nextcloud를 구성하는 두 가지 방법이 있습니다. 명령줄 방법을 선택하겠습니다.

Nextcloud 디렉터리를 입력합니다.

$ cd /var/www/html/nextcloud

다음 명령을 실행하여 Nextcloud를 설치합니다.

$ sudo -u nginx php occ  maintenance:install --database "mysql" --database-name "nextcloud"  --database-user "nextuser" --database-pass "yourpassword" --admin-user "admin" --admin-pass "password"

이 명령은 Nextcloud 폴더에 대한 쓰기 권한이 있으므로 nginx 사용자로 실행됩니다.

다음으로 도메인을 신뢰할 수 있는 도메인 목록에 추가해야 합니다. /var/www/html/nextcloud/config/config.php 파일을 엽니다.

$ sudo nano config/config.php

도메인에서 설치에 액세스할 수 있도록 서버 IP 주소와 Nextcloud 도메인 nextcloud.example.com을 추가하여 trusted_domains 변수의 값을 변경합니다.

'trusted_domains' =>
  array (
    0 => 'localhost',
    1 => '167.172.35.56',
    2 => 'nextcloud.example.com',
  ),

Ctrl + X를 눌러 편집기를 닫고 파일을 저장하라는 메시지가 표시되면 Y를 누릅니다.

브라우저에서 https://nextcloud.example.com을 열어 Nextcloud 설치를 시작하면 다음 화면이 표시됩니다.

관리 로그인 정보를 입력하십시오. 소개 Nextcloud 배너를 스크롤하고 날씨 위치와 상태를 설정하고 배경화면을 선택하면 비슷한 화면이 표시됩니다.

결론

이것으로 Fedora 32 서버에 Nextcloud를 설치하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.