# 最佳化

為了讓MoodleBox在實務中使用，有必要進行最佳化的動作。

我們不僅設置Moodle的盒子，也要管理檔案的儲存及下載。

## Moodle特定檔案使用的RAM記憶體

新建一個資料夾作為RAM記憶體的掛載點。

```
$ cd /var/cache/
$ sudo mkdir moodle
$ sudo chown www-data:www-data moodle/
```

RAM記憶體也可用於暫存資料夾及Moodle連線的資料夾。這兩個資料夾都位於 moodledata。

我們在樹莓的分割表中定義RAM記憶體。 要達成這個目的，我們在/ etc / fstab中新增以下文字:

```
tmpfs /var/cache/moodle tmpfs size=64M,mode=775,uid=www-data,gid=www-data 0 0
tmpfs /var/www/moodledata/temp tmpfs size=64M,mode=775,uid=www-data,gid=www-data 0 0
tmpfs /var/www/moodledata/sessions tmpfs size=32M,mode=775,uid=www-data,gid=www-data 0 0
```

新增以上文字後 /etc/fstab的檔案內容如下：

```
proc              /proc         proc         defaults             0        0
/dev/mmcblk0p1    /boot         vfat         defaults             0        2
/dev/mmcblk0p2    /             ext4         defaults,noatime     0        1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that

tmpfs /var/cache/moodle tmpfs size=64M,mode=775,uid=www-data,gid=www-data 0 0
tmpfs /var/www/moodledata/temp tmpfs size=64M,mode=775,uid=www-data,gid=www-data 0 0
tmpfs /var/www/moodledata/sessions tmpfs size=32M,mode=775,uid=www-data,gid=www-data 0 0
```

重新啟動樹莓後，在Moodle中就可以設定快取記憶體。

使用管理員帳號(上述所建立的)連上Moodle，然後在Moodle上進入網站管理＞外掛＞快取＞配置。我們要新增兩個新的儲存實體，在網頁上方的安裝快取儲存區段，按一下添加實列。

![](https://3967703709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZPoMAPwjKpJAvsz%2F-LdydaJ5uKuApQWq-67g%2F-LdydfHNTKNEEVtEYWqM%2Ftmpfs_application.png?generation=1556903017065121\&alt=media)

![](https://3967703709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZPoMAPwjKpJAvsz%2F-LdydaJ5uKuApQWq-67g%2F-LdydfHP2YPMmiD0M-v9%2Ftmpfs_sessions.png?generation=1556903018198982\&alt=media)

1. 儲存名稱：TMPFS application快取路徑：/var/cache/moodle/application，勾選自動建立目錄；
2. 儲存名稱：TMPFS sessions 快取路徑：/var/cache/moodle/sessions，勾選自動建立目錄。

最後，它仍然需要連結這兩個新的實例至它們的目的地，在網頁的最下方「當沒有對映出現時所用的儲存」區段下方按一下「編輯對映」。

![](https://3967703709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZPoMAPwjKpJAvsz%2F-LdydaJ5uKuApQWq-67g%2F-LdydfHRE1Xuc2RRViWF%2Ftmpfs_edit.png?generation=1556903017849748\&alt=media)

***驗證***

```
這些在ＭoodleBox上的Moodle的動作完成後，使用SSH連上MoodleBox，然後執行下列命令:
ls -l /var/cache/moodle/
終端機應該會顯示一些東西如:
total 0
drwxrwxrwx 19 www-data www-data 380 mai 30 19:18 application
drwxrwxrwx 8 www-data www-data 160 mai 29 19:00 sessions
```

![](https://3967703709-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LdydZPoMAPwjKpJAvsz%2F-LdydaJ5uKuApQWq-67g%2F-LdydfHTQSftdTRmnKwe%2FlsCacheDir.png?generation=1556903017257992\&alt=media)

快取RAM記憶體有一個缺陷：內含的資料在每次重新啟動時會消失。所以Moodle每次都得重建快取。 如果我們要在動新啟動時保存的快取，就需定期拷貝RAM記憶體中的內容至MicroSD卡，並且，在每次重新啟動時，就要執行相反的操作(從MicroSD拷貝至RAM記憶體)

我們新建備份資料夾，然後設定排程cron

```
$ sudo mkdir /var/cache/moodle-cache-backup/
$ sudo crontab -e
```

我們新增下面的兩行指令到cron排程表來每隔20分鐘執行備份工作，並在重新啟動時回存快取內容：

```
*/20 * * * * rsync -a --delete /var/cache/moodle/ /var/cache/moodle-cache-backup/
@reboot cp -Rpf /var/cache/moodle-cache-backup/* /var/cache/moodle/
```

## 使用X SENDFILE

使用 X-SENDFILE 可以提高Web伺服器傳送Moodle資料庫的檔案的速度。

在Moodle的設定檔案/var/www/html/config.php裏，在$CFG->admin = 'admin'這行後面，增加這些行命令

```
$CFG->xsendfile = 'X-Accel-Redirect';
$CFG->xsendfilealiases = array (
   '/dataroot/' => $CFG->dataroot
);
```

/var/www/html/config.php檔案的內容將會是：

```
<?php // Moodle configuration file
unset($CFG);
global $CFG;
$CFG = new stdClass();
$CFG->dbtype = 'mariadb';
$CFG->dblibrary = 'native';
$CFG->dbhost = 'localhost';
$CFG->dbname = 'moodle';
$CFG->dbuser = 'root';
$CFG->dbpass = 'Moodlebox4$';
$CFG->prefix = 'mdl_';
$CFG->dboptions = array (
    'dbpersist' => 0,
    'dbport' => '',
    'dbsocket' => '',
);
$CFG->wwwroot = 'http://moodlebox.home';
$CFG->dataroot = '/var/www/moodledata';
$CFG->admin = 'admin';
$CFG->xsendfile = 'X-Accel-Redirect';
$CFG->xsendfilealiases = array (
    '/dataroot/' => $CFG->dataroot
);
$CFG->directorypermissions = 02777;
require_once(dirname(__FILE__) . '/lib/setup.php');
// There is no php closing tag in this file,
// it is intentional because it prevents trailing whitespace problems!
```

接下來在/etc/nginx/sites-available/default 檔案加入下列數行：

```
location /dataroot/ {
    internal;
    alias /var/www/moodledata/;
}
```

/etc/nginx/sites-available/default 檔案的內容就變成如此：

```
# Default server configuration
#
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.php index.html index.htm index.nginx-debian.html;
    server_name moodlebox;

    location / {
        try_files $uri $uri/ =404;
    }
    location /dataroot/ {
        internal;
        alias /var/www/moodledata/;
    }

    location ~ [^/]\.php(/|$) {
        include fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_read_timeout 300;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "max_execution_time=300\n upload_max_filesize=50M
            \n post_max_size=50M";
        client_max_body_size 50M;
    }
}
```

## 優化MariaDB的

我們要在 /etc/mysql/mariadb.conf.d/50-server.cnf 檔案中修改MariaDB的一些變數的數值。因此，打開該檔案後，找到適當的行列進行修改：

```
table_cache                = 512
table_definition_cache     = 512
max_connections            = 100
query_cache_size           = 16M
query_cache_type           = 0
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gxiangco.gitbook.io/moodlebox-on-raspberry-pi-3/chapter10.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
