เซิร์ฟเวอร์อีเมล OpenBSD ที่ใช้ OpenSMTPD, Dovecot, Rspamd และ RainLoop

บทนำ

บทช่วยสอนนี้แสดงให้เห็นถึงเซิร์ฟเวอร์อีเมลแบบเต็มรูปแบบที่ทำงานบน OpenBSD โดยใช้ OpenSMTPD, Dovecot, Rspamd และ RainLoop OpenSMTPD เป็นเซิร์ฟเวอร์อีเมลเริ่มต้นสำหรับ OpenBSD เลือกอินสแตนซ์ Vultr Compute Cloud ที่มีพื้นที่เก็บข้อมูลมากมายสำหรับจำนวนผู้ใช้ที่คาดหวัง

ขั้นตอนเบื้องต้น

ตั้งค่าบัญชีผู้ใช้ของคุณเพื่อทำงานเป็นรูท

su -
usermod -G wheel <username>
echo "permit nopass keepenv :wheel" > /etc/doas.conf
exit

ตั้งค่าที่เก็บแพ็กเกจสำหรับ OpenBSD

doas su
echo "https://cdn.openbsd.org/pub/OpenBSD" > /etc/installurl
exit

เพิ่มแพ็คเกจที่จำเป็น

doas pkg_add opensmtpd-extras opensmtpd-filter-rspamd dovecot dovecot-pigeonhole rspamd redis

กำหนดค่า OpenSMTPD

ตามค่าเริ่มต้น OpenSMTPD จะฟังเฉพาะที่ localhost เท่านั้น ต้องกำหนดค่าอย่างชัดเจนเพื่อฟังบนอินเตอร์เฟสภายนอก ควรกำหนดค่าให้ใช้ผู้ใช้เสมือนแทนผู้ใช้ระบบเพื่อความปลอดภัย

สำรองข้อมูล/etc/smtpd.confไฟล์เริ่มต้นและสร้างใหม่ตั้งแต่เริ่มต้น

cd /etc/mail
mv smtpd.conf smtpd.conf.default

สร้างใหม่smtpd.confตามที่แสดงด้านล่าง แทนที่example.comด้วยโดเมนของคุณ การกำหนดค่าเริ่มต้นนี้ไม่เปิดใช้งานตัวกรอง rspamd ขณะทดสอบ OpenSMTP ตัวกรองสแปมจะเปิดใช้งานในภายหลัง

pki "mail" cert "/etc/ssl/mail.crt"
pki "mail" key "/etc/ssl/private/mail.key"

table aliases file:/etc/mail/aliases
table credentials passwd:/etc/mail/credentials
table virtuals file:/etc/mail/virtuals

filter "rspamd" proc-exec "/usr/local/libexec/smtpd/filter-rspamd"

# To accept external mail, replace with: listen on all

# listen on all tls pki "mail" hostname "mail.example.com"
listen on egress port submission tls-require pki "mail" hostname "mail.example.com" \
  auth <credentials>

action "local_mail" mbox alias <aliases>
action "domain_mail" maildir "/var/vmail/example.com/%{dest.user}" \
  virtual <virtuals>
action "outbound" relay

# Uncomment the following to accept external mail for domain "example.org"

# match from any for domain "example.com" action "domain_mail"
match from local for local action "local_mail"

match from local for any action "outbound"
match auth from any for any action "outbound"

สร้างไฟล์ / etc / หนังสือรับรอง

OpenSMTPD และ Dovecot สามารถแชร์ฐานข้อมูลการพิสูจน์ตัวตน ฐานข้อมูลนี้มีลักษณะคล้ายกับไฟล์รหัสผ่านระบบในรูปแบบโดยมีสองฟิลด์พิเศษสำหรับ Dovecot สองฟิลด์พิเศษกำหนดโฮมไดเร็กทอรีเสมือนและตำแหน่งเมล รหัสผ่านอยู่ในรูปแบบปักเป้า บทช่วยสอนนี้สร้างผู้ใช้ตัวอย่างสามคน

สร้างรหัสผ่านและต่อรหัสเข้ากับ/etc/mail/credentialsไฟล์

doas su
smtpctl encrypt example_password1 >> /etc/mail/credentials
smtpctl encrypt example_password2 >> /etc/mail/credentials
smtpctl encrypt example_password3 >> /etc/mail/credentials
exit

ผลลัพธ์มีลักษณะคล้ายกับสิ่งนี้:

$2b$10$agmNBPvFm1zqCjbbZC3JbO4Ns2jJNZQfTS45MAnKi.IPrkKITyTa6
$2b$10$LwkcKVVnwG8hDxu2W4YKD.K0kQ2oylOmQ9SBUb0hIopBsmNxYPb4e
$2b$10$bgLW/GMZyRXKbROgRQIvRu4xbeOqOJJXlgEAKuS5sIrBvfdPvEzeq

แก้ไข/etc/mail/credentialsเพื่อเพิ่มฟิลด์ที่จำเป็น แต่ละบรรทัดแผนที่ไปยังบัญชีระบบVmailกับ UID และ GID ของ2000 แทนที่ example.com ด้วยโดเมนของคุณ ชื่อผู้ใช้เสมือนคือที่อยู่อีเมลที่สมบูรณ์

[email protected]:$2b$10$agmNBPvFm1zqCjbbZC3JbO4Ns2jJNZQfTS45MAnKi.IPrkKITyTa6:vmail:2000:2000:/var/vmail/example.com/john::userdb_mail=maildir:/var/vmail/example.com/john
[email protected]:$2b$10$LwkcKVVnwG8hDxu2W4YKD.K0kQ2oylOmQ9SBUb0hIopBsmNxYPb4e:vmail:2000:2000:/var/vmail/example.com/adam::userdb_mail=maildir:/var/vmail/example.com/adam
[email protected]:$2b$10$bgLW/GMZyRXKbROgRQIvRu4xbeOqOJJXlgEAKuS5sIrBvfdPvEzeq:vmail:2000:2000:/var/vmail/example.com/natalie::userdb_mail=maildir:/var/vmail/example.com/natalie

สร้างบัญชีเมลเสมือนและตั้งค่าความปลอดภัย

  • ตั้งค่าการ/etc/mail/credentialsอนุญาตให้เป็นแบบอ่านอย่างเดียวสำหรับ_smtpdและ_dovecotผู้ใช้ระบบ
  • สร้างvmailผู้ใช้ระบบกลุ่มและโฮมไดเรกทอรี

    • เมื่อคุณสร้างผู้ใช้ระบบ Vmail useradd: Warning: home directory '/var/vmail' doesn't exist, and -m was not specifiedที่คุณจะได้รับการแจ้งเตือนต่อไปนี้: คาดว่าจะเป็นแบบนี้ หลีกเลี่ยงนี้เกะกะไดเรกทอรีที่มีไฟล์ dot /etc/skelจาก ไม่จำเป็นเนื่องจากบัญชี vmail ไม่อนุญาตให้ลงชื่อเข้าใช้

      doas chmod 0440 / etc / mail / credentials doas chown smtpd: dovecot / etc / mail / หนังสือรับรอง doas useradd -c "บัญชีเมลเสมือน" -d / var / vmail -s / sbin nologin -u 2000 -g = uid -l พนักงาน vmail doas mkdir / var / vmail doas chown vmail: vmail / var / vmail

สร้างการแมปผู้ใช้เสมือน

สร้าง/etc/mail/virtualsเพื่อกำหนดที่อยู่อีเมลที่ถูกต้อง

สร้างคีย์สาธารณะ / ส่วนตัวสำหรับ OpenSMTPD

ตัวอย่างนี้ใช้ใบรับรองแบบลงนามด้วยตนเอง ใช้ใบรับรองที่ลงชื่อที่ถูกต้องหากคุณมี เมื่อได้รับพร้อมต์สำหรับชื่อสามัญตรวจสอบให้แน่ใจว่าตรงกับ FQDN ของเซิร์ฟเวอร์ ตัวอย่างนี้ใช้ mail.example.com

doas su
cd /etc/ssl
openssl genrsa -out private/mail.key 4096
openssl req -x509 -new -nodes -key private/mail.key -out mail.crt -days 3650 -sha256
chmod 0400 /etc/ssl/private/mail.key
exit

ทดสอบเซิร์ฟเวอร์

ใช้ตัวตรวจสอบไวยากรณ์การกำหนดค่า OpenSMTPD หากไม่พบปัญหาให้รีสตาร์ท smtpd daemon

doas smtpd -n
doas rcctl restart smtpd

จากบัญชีอีเมลภายนอกให้ส่งอีเมลทดสอบไปยังผู้ใช้คนใดคนหนึ่ง

  • OpenSMTPD จะสร้างโครงสร้างของโฟลเดอร์ Maildir ด้านล่างและส่งจดหมายไปยัง/var/vmail/var/vmail/example.com/<username>/new
  • 1576339842.4d64757b.example.com:2,ในฐานะที่เป็นผู้ใช้รากเรียกดูไปยังสถานที่แห่งนี้และยืนยันได้ว่าคุณมีไฟล์ชื่อที่คล้ายกันนี้:
  • ตรวจสอบเนื้อหาของไฟล์รวมถึงส่วนหัวจดหมายทั้งหมดเพื่อตรวจสอบว่าการส่งอีเมลทำงานได้อย่างถูกต้อง

    Return-Path: <n0244e80da3-54b1ed125c5342fc-adam===example.org@bounce.example.org>
    Delivered-To: [email protected]
    Received: from spruce-goose-ba.twitter.com (spruce-goose-ba.twitter.com [199.59.150.96])
        by mail.example.com (OpenSMTPD) with ESMTPS id 75b514d3 (TLSv1.2:ECDHE-RSA-AES256-GCM-    SHA384:256:NO)
        for <[email protected]>;
        Sat, 14 Dec 2019 11:10:40 -0500 (EST)
    DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=twitter.com;
        s=dkim-201406; t=1576339839;
        bh=jhKB5/w9v87GaXSuizT576ntJ/72gvLRDhsqmGQQrCE=;
        h=Date:From:To:Subject:MIME-Version:Content-Type:List-Unsubscribe:
        Message-ID;
        b=TWn/QVUJ1VDlWiweWoanwHLABCL1nqmm0+TBzh3PjmYNm0quRMXB7QL2ykzHGME5A
        DTz/JFHa0cOvQsrdhxxbjOLFKimK0nF+Ou5kI+2HzTzfVNZS0qGnTVP/tZyaIsWjjl
        an5EiR6HFOHG4iClOOEOJW4oLDEZfPTefrlW+378bmHGIRUNDvVKrbXKunL9fJFAb3
        JSrhWQNwbrF/aARFzw4nKfb1I7vTRSrN1eXE5JxzGwI2XAjqDIWdR5ExwUNbJH5ZPs
        wQ85j8KLZEEgQkbH9CypgeUMJWsVK95FqOCCaqKMS10M7intGMb3aeiiFcB7yDHi9t
        u7rVESm4eGp/g==
    X-MSFBL: DM7pSZns+YDRgNEmGNre9aPjZTtc1tDlN97w5rQDBts=|eyJ1IjoibWF0dEBnb2J
        sYWNrY2F0LmNvbUBpaWQjIzU0YjFlZDEyNWM1MzQyZmNiNThiMzVmNzI0NDZlMGF
        mQHVzYiMjNkAyNDRAMTA4MjgwNTAxMDYzNzk1MDk3NkAwQDA4MjY5ZWI4OTI3YzR
        kNTFiNTZkMjY3YzY2OGRmN2IwY2Y4M2ExZGIiLCJyIjoibWF0dEBnb2JsYWNrY2F
        0LmNvbSIsImciOiJCdWxrIiwiYiI6InNtZjEtYmd4LTM0LXNyMS1CdWxrLjE4NiJ
        9
    Date: Sat, 14 Dec 2019 16:10:39 +0000
    ...
    

กำหนดค่า Dovecot IMAP

ตั้งค่าคลาสเข้าสู่ระบบ

Dovecot ต้องการความสามารถในการเปิดไฟล์จำนวนมากขึ้นสำหรับการอ่านและการเขียนมากกว่าคลาสเริ่มต้นที่อนุญาต การไม่ทำเช่นนี้จะทำให้เกิดข้อผิดพลาดที่แก้ไขได้ยาก

กำหนดคลาสล็อกอินสำหรับ Dovecot daemon ที่ด้านล่างของ/etc/login.confเพิ่มบรรทัดต่อไปนี้

    dovecot:\
        :openfiles-cur=1024:\
        :openfiles-max=2048:\
        :tc=daemon:    

สร้างไฟล์การกำหนดค่า Dovecot

/etc/dovecot/local.confสร้าง

auth_mechanisms = plain
first_valid_uid = 2000
first_valid_gid = 2000
mail_location = maildir:/var/vmail/%d/%n
mail_plugin_dir = /usr/local/lib/dovecot
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex  imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext imapsieve vnd.dovecot.imapsieve
mbox_write_locks = fcntl
mmap_disable = yes
namespace inbox {
  inbox = yes
  location =
  mailbox Archive {
  auto = subscribe
  special_use = \Archive
  }
  mailbox Drafts {
  auto = subscribe
  special_use = \Drafts
  }
  mailbox Junk {
  auto = subscribe
  special_use = \Junk
  }
  mailbox Sent {
  auto = subscribe
  special_use = \Sent
  }
  mailbox Trash {
  auto = subscribe
  special_use = \Trash
  }
  prefix =
}
passdb {
  args = scheme=CRYPT username_format=%u /etc/mail/credentials
  driver = passwd-file
  name =
}
plugin {
  imapsieve_mailbox1_before = file:/usr/local/lib/dovecot/sieve/report-spam.sieve
  imapsieve_mailbox1_causes = COPY
  imapsieve_mailbox1_name = Junk
  imapsieve_mailbox2_before = file:/usr/local/lib/dovecot/sieve/report-ham.sieve
  imapsieve_mailbox2_causes = COPY
  imapsieve_mailbox2_from = Junk
  imapsieve_mailbox2_name = *
  sieve = file:~/sieve;active=~/.dovecot.sieve
  sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
  sieve_pipe_bin_dir = /usr/local/lib/dovecot/sieve
  sieve_plugins = sieve_imapsieve sieve_extprograms
}
protocols = imap sieve
service imap-login {
  inet_listener imaps {
  port = 0
  }
}
service managesieve-login {
  inet_listener sieve {
  port = 4190
  }
  inet_listener sieve_deprecated {
  port = 2000
  }
}
ssl_cert = </etc/ssl/mail.crt
ssl_key = </etc/ssl/private/mail.key
userdb {
  args = username_format=%u /etc/mail/credentials
  driver = passwd-file
  name =
}
protocol imap {
  mail_plugins = " imap_sieve"
}

แก้ไขข้อบกพร่อง Dovecot

มีข้อผิดพลาดใน Dovecot ที่ssl_certและssl_keyการตั้งค่าไม่ถูกแทนที่ในlocal.confไฟล์ดังนั้นเราจึงต้องแสดงความคิดเห็นออก หากคุณพลาดขั้นตอนนี้ Dovecot จะล้มเหลวในการเริ่มต้นอย่างถูกต้อง

แก้ไข/etc/dovecot/conf.d/10-ssl.confตามที่แสดง

...
# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
#ssl_cert = </etc/ssl/dovecotcert.pem
#ssl_key = </etc/ssl/private/dovecot.pem
...

สร้างสคริปต์ Sieve

สคริปต์ตะแกรงฝึก Rspamd บนสแปมและแฮม การย้ายอีเมลเข้าและออกจากโฟลเดอร์ขยะจะทำให้เกิดเหตุการณ์ในการฝึกอบรม Rspamd

/usr/local/lib/dovecot/sieveไฟล์เหล่านี้จะตั้งอยู่ที่

สร้างreport-ham.sieveไฟล์

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.mailbox" "*" {
  set "mailbox" "${1}";
}

if string "${mailbox}" "Trash" {
  stop;
}

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "sa-learn-ham.sh" [ "${username}" ];

สร้างreport-spam.sieveไฟล์

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "sa-learn-spam.sh" [ "${username}" ];

รวบรวมไฟล์

sievec report-ham.sieve
sievec report-spam.sieve 

สร้างเชลล์สคริปต์สองตัวต่อไปนี้ใน /usr/local/lib/dovecot/sieve

เพิ่มรายการต่อไปนี้เพื่อ sa-learn-ham.sh

#!/bin/sh
exec /usr/local/bin/rspamc -d "${1}" learn_ham

เพิ่มรายการต่อไปนี้เพื่อ sa-learn-spam.sh

#!/bin/sh
exec /usr/local/bin/rspamc -d "${1}" learn_spam

ทำให้ไฟล์ปฏิบัติการได้

chmod 0755 sa-learn-ham.sh
chmod 0755 sa-learn-spam.sh

เปิดใช้งานและเริ่ม Dovecot

rcctl enable dovecot
rcctl start dovecot

ตรวจสอบว่า Dovecot เริ่มต้นอย่างถูกต้อง

ps ax | grep dovecot

88005 ??  I        0:00.11 /usr/local/sbin/dovecot
69640 ??  I        0:00.03 dovecot/anvil
91207 ??  I        0:00.03 dovecot/log
98178 ??  I        0:00.19 dovecot/config
34712 ??  I        0:00.06 dovecot/stats
96674 ??  I        0:00.03 dovecot/imap-login
 8891 ??  S        0:00.02 dovecot/imap

ตรวจสอบว่า Dovecot สามารถอ่านได้อย่างถูกต้อง /etc/mail/credentials

doveadm user [email protected]

field    value
uid      2000
gid      2000
home /var/vmail/example.com/john
mail maildir:/var/vmail/example.com/john

ตรวจสอบว่าผู้ใช้จดหมายสามารถเข้าสู่ระบบ

doveadm auth login [email protected]

Password: ********
passdb: [email protected] auth succeeded
extra fields:
  [email protected]

userdb extra fields:
  [email protected]
  mail=maildir:/var/vmail/example.com/john
  uid=2000
  gid=2000
  home=/var/vmail/example.com/john
  auth_mech=PLAIN

ตั้งค่า Rspamd

นี่คือการกำหนดค่าพื้นฐาน Rspamd อ้างอิงเอกสารทางการสำหรับรายละเอียดเพิ่มเติม ตัวอย่างนี้สร้างคำนิยามสำหรับโดเมนของเราเพื่อเปิดใช้งานการลงนาม DKIM

สร้างพับบลิคสาธารณะ / ส่วนตัวใน/etc/mail/dkimและตั้งค่าการอนุญาตที่ถูกต้อง

doas su
mkdir /etc/mail/dkim
cd /etc/mail/dkim
openssl genrsa -out private.key 1024
openssl rsa -in private.key -pubout -out public.key
chmod 0440 private.key
chown root:_rspamd private.key

สร้างระเบียน DNS สำหรับ DKIM ที่มีรหัสสาธารณะ อ้างถึงผู้ให้บริการ DNS ของคุณสำหรับรายละเอียดวิธีสร้างระเบียน DKIM คัดลอกเนื้อหาจาก/etc/mail/dkim/public.keyและวางไว้หลังp=ส่วนของระเบียน DKIM ดังที่แสดงด้านล่าง หมายเหตุตัวอย่างนี้ยังสร้างระเบียน SPF

default._domainkey.example.com. IN TXT "v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClcuK3FV3Ug64li8iFsuJ2ykgb7FMZsujk9uG79ppPUp57vCfjzO7F+HBfx5qIwvlGxv2IJXK86FZwhpUX+HFCDUtfB2z0ZNGerWcZfNzM1w1Bru/fdMd2tCYkiHEa5RWIkLfs/Fm+neXxRZfAG2UDWmAghNbgzYv7xViwgufDIQIDAQAB"
example.com. IN TXT "v=spf1 a ip4:192.0.2.1 mx ~all"

สร้างระเบียน DMARC

_dmarc.example.com. IN TXT "v=DMARC1;p=none;pct=100;rua=mailto:[email protected]"

สร้าง/etc/rspamd/local.d/dkim_signing.confไฟล์กำหนดค่า

  • selector="default";สายมาจากส่วนแรกของการบันทึก DKIM DNS ( default._domainkey....) สร้างขึ้น

    domain {
        example.com {
            path = "/etc/mail/dkim/example.com.key";
            selector = "default";
        }
    }
    

เปิดใช้งานและเริ่ม Rspamd

doas rcctl enable redis rspamd
doas rcctl start redis rspamd

เปลี่ยนบรรทัดด้านล่าง/etc/mail/smtpd.confและรีสตาร์ท OpenSMTPD เพื่อเปิดใช้งาน Rspamd

...
listen on all tls pki "mail" hostname "mail.example.com" filter "rspamd"
listen on egress port submission tls-require pki "mail" hostname "mail.example.com" \
  auth <credentials> filter "rspamd"
...
rcctl restart smtpd

ทดสอบเซิร์ฟเวอร์อีเมลด้วยไคลเอนต์อีเมล POP3 หรือ IMAP หากคุณไม่ต้องการใช้เว็บเมลให้หยุดที่นี่

(ไม่บังคับ) กำหนดค่าเว็บเมล RainLoop

ติดตั้งแพคเกจข้อกำหนดเบื้องต้น

เมื่อได้รับแจ้งโปรดเลือก PHP เวอร์ชันล่าสุด

pkg_add php php-curl php-pdo_sqlite php-zip pecl73-mcrypt zip unzip wget curl

เรียก RainLoop เว็บเมล tarball /var/www/htdocs/และแยกไป

ใช้ Standard Edition ซึ่งรวมถึงตัวอัปเดตอัตโนมัติ

cd /tmp
wget https://www.rainloop.net/repository/webmail/rainloop-latest.zip
unzip rainloop-latest.zip -d /var/www/htdocs/rainloop
chown -R www:www /var/www/htdocs

สร้าง Let's Encrypt SSL Certificate

  • คัดลอก/etc/examples/acme-client.confไปยัง/etc
  • เพิ่มบรรทัดต่อไปนี้ที่ด้านล่างของไฟล์:

    domain webmail.example.com {
    domain key "/etc/ssl/private/webmail.example.com.key"
    domain full chain certificate "/etc/ssl/webmail.example.com.crt"
    sign with letsencrypt
    }
    

กำหนดค่า httpd

  • สร้างรายการ DNS (ระเบียน CNAME หรือ A) สำหรับโดเมนย่อย webmail.example.com
  • แก้ไข/etc/httpd.confตามตัวอย่างด้านล่าง

    prefork 3
    types { include "/usr/share/misc/mime.types" }
    
    server "default" {
        listen on egress port 80 
        root "/htdocs"
        directory index index.html
    
        location "/.well-known/acme-challenge/*" {
                root "/acme"
                request strip 2
        }
    }
    

รันการตรวจสอบไวยากรณ์ httpd

httpd -n

เปิดใช้งานและเริ่ม httpd

rcctl enable httpd
rcctl start httpd

ขอใบรับรองการเข้ารหัสของ Let's

acme-client -v webmail.example.com

เพิ่มคำจำกัดความเซิร์ฟเวอร์สำหรับ RainLoop /etc/httpd.conf

server "webmail.example.com" {
    listen on egress port 80
    block return 302 "https://$SERVER_NAME$REQUEST_URI"
}

server "webmail.example.com" {
    listen on egress tls port 443
    root "/htdocs/rainloop"
    directory index "index.php"

    tcp { nodelay, backlog 10 }

    tls {
            certificate "/etc/ssl/webmail.example.com.crt"
            key "/etc/ssl/private/webmail.example.com.key"
    }

    hsts {
            max-age 31556952
            preload
    }

    # Value below is 25MB in bytes. 1MB = 1048576 bytes
    connection max request body 26214400

    location "/data*" {
            block return 403
    }

    location "*.php*" {
            fastcgi socket "/run/php-fpm.sock"
    }
}

กำหนดค่า PHP เพื่อให้สามารถแนบได้สูงสุด 25 เมกะไบต์ ทำการเปลี่ยนแปลงต่อไปนี้ใน/etc/php-7.3.ini:

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 25M
...
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 29M

เปิดใช้งานโมดูล PHP ที่จำเป็นโดยการคัดลอกไฟล์กำหนดค่าไปที่ /etc/php-7.3/

cp /etc/php-7.3.sample/* /etc/php-7.3/.

ตรวจสอบไวยากรณ์ของ /etc/httpd.conf

httpd -n

เปิดใช้งานและเริ่มต้น httpd และ php-fpm

rcctl reload httpd
rcctl enable php73_fpm
rcctl start php73_fpm

สอบปลายภาค

https://webmail.example.com/?adminเรียกดูเพื่อ

ชื่อผู้ใช้เริ่มต้นคือ: ผู้ดูแลระบบ
รหัสผ่านเริ่มต้นคือ: 12345

เรียกดูแต่ละส่วนการกำหนดค่าและทำการเปลี่ยนแปลงที่คุณต้องการ เมื่อคุณตั้งค่าเสร็จแล้วให้เข้าสู่เว็บเมลที่https://webmail.example.com



Leave a Comment

ReactOS: นี่คืออนาคตของ Windows หรือไม่?

ReactOS: นี่คืออนาคตของ Windows หรือไม่?

ReactOS ซึ่งเป็นโอเพ่นซอร์สและระบบปฏิบัติการฟรีพร้อมเวอร์ชันล่าสุดแล้ว สามารถตอบสนองความต้องการของผู้ใช้ Windows ยุคใหม่และล้ม Microsoft ได้หรือไม่? มาหาข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบเก่านี้ แต่เป็นประสบการณ์ OS ที่ใหม่กว่ากัน

AI สามารถต่อสู้กับการโจมตีของแรนซัมแวร์ที่เพิ่มขึ้นได้หรือไม่

AI สามารถต่อสู้กับการโจมตีของแรนซัมแวร์ที่เพิ่มขึ้นได้หรือไม่

การโจมตีของ Ransomware กำลังเพิ่มขึ้น แต่ AI สามารถช่วยจัดการกับไวรัสคอมพิวเตอร์ตัวล่าสุดได้หรือไม่? AI คือคำตอบ? อ่านที่นี่รู้ว่า AI boone หรือ bane

เชื่อมต่อผ่าน WhatsApp Desktop App 24*7

เชื่อมต่อผ่าน WhatsApp Desktop App 24*7

ในที่สุด Whatsapp ก็เปิดตัวแอพเดสก์ท็อปสำหรับผู้ใช้ Mac และ Windows ตอนนี้คุณสามารถเข้าถึง Whatsapp จาก Windows หรือ Mac ได้อย่างง่ายดาย ใช้ได้กับ Windows 8+ และ Mac OS 10.9+

AI จะนำกระบวนการอัตโนมัติไปสู่อีกระดับได้อย่างไร

AI จะนำกระบวนการอัตโนมัติไปสู่อีกระดับได้อย่างไร

อ่านข้อมูลนี้เพื่อทราบว่าปัญญาประดิษฐ์กำลังได้รับความนิยมในหมู่บริษัทขนาดเล็กอย่างไร และเพิ่มโอกาสในการทำให้พวกเขาเติบโตและทำให้คู่แข่งได้เปรียบ

การอัปเดตเสริม macOS Catalina 10.15.4 ทำให้เกิดปัญหามากกว่าการแก้ปัญหา

การอัปเดตเสริม macOS Catalina 10.15.4 ทำให้เกิดปัญหามากกว่าการแก้ปัญหา

เมื่อเร็ว ๆ นี้ Apple เปิดตัว macOS Catalina 10.15.4 การอัปเดตเสริมเพื่อแก้ไขปัญหา แต่ดูเหมือนว่าการอัปเดตทำให้เกิดปัญหามากขึ้นที่นำไปสู่การสร้างเครื่อง Mac อ่านบทความนี้เพื่อเรียนรู้เพิ่มเติม

13 เครื่องมือดึงข้อมูลเชิงพาณิชย์ของ Big Data

13 เครื่องมือดึงข้อมูลเชิงพาณิชย์ของ Big Data

13 เครื่องมือดึงข้อมูลเชิงพาณิชย์ของ Big Data

ระบบไฟล์บันทึกคืออะไรและทำงานอย่างไร

ระบบไฟล์บันทึกคืออะไรและทำงานอย่างไร

คอมพิวเตอร์ของเราจัดเก็บข้อมูลทั้งหมดในลักษณะที่เรียกว่าระบบไฟล์บันทึก เป็นวิธีการที่มีประสิทธิภาพที่ช่วยให้คอมพิวเตอร์สามารถค้นหาและแสดงไฟล์ได้ทันทีที่คุณกดค้นหาhttps://wethegeek.com/?p=94116&preview=true

ภาวะเอกฐานทางเทคโนโลยี: อนาคตอันห่างไกลของอารยธรรมมนุษย์?

ภาวะเอกฐานทางเทคโนโลยี: อนาคตอันห่างไกลของอารยธรรมมนุษย์?

ในขณะที่วิทยาศาสตร์มีวิวัฒนาการไปอย่างรวดเร็ว โดยรับช่วงต่อความพยายามของเราอย่างมาก ความเสี่ยงในการทำให้ตัวเองตกอยู่ในภาวะภาวะเอกฐานที่อธิบายไม่ได้ก็เพิ่มขึ้นเช่นกัน อ่านว่าภาวะเอกฐานอาจมีความหมายสำหรับเราอย่างไร

ข้อมูลเชิงลึกเกี่ยวกับ 26 เทคนิคการวิเคราะห์ข้อมูลขนาดใหญ่: ตอนที่ 1

ข้อมูลเชิงลึกเกี่ยวกับ 26 เทคนิคการวิเคราะห์ข้อมูลขนาดใหญ่: ตอนที่ 1

ข้อมูลเชิงลึกเกี่ยวกับ 26 เทคนิคการวิเคราะห์ข้อมูลขนาดใหญ่: ตอนที่ 1

ผลกระทบของปัญญาประดิษฐ์ในการดูแลสุขภาพ 2021

ผลกระทบของปัญญาประดิษฐ์ในการดูแลสุขภาพ 2021

AI ในการดูแลสุขภาพได้ก้าวกระโดดอย่างมากจากทศวรรษที่ผ่านมา ดังนั้นอนาคตของ AI ในการดูแลสุขภาพจึงยังคงเติบโตทุกวัน