Apache 2.4 + PHP-FPM + ProxyPassMatch


31

ฉันเพิ่งติดตั้ง Apache 2.4 บนเครื่องท้องถิ่นของฉันพร้อมกับ PHP 5.4.8 โดยใช้ PHP-FPM

ทุกอย่างค่อนข้างราบรื่น (หลังจากนั้นไม่นาน ... ) แต่ก็ยังมีข้อผิดพลาดแปลก ๆ อยู่:

ฉันกำหนดค่า Apache สำหรับ PHP-FPM เช่นนี้:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "/Users/apfelbox/WebServer"
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1
</VirtualHost>

มันใช้งานได้เช่นถ้าฉันเรียกhttp://localhost/info.phpฉันว่าถูกต้องphpinfo()(มันเป็นแค่ไฟล์ทดสอบ)

ถ้าฉันเรียกไดเรกทอรี แต่ฉันได้รับ 404 ที่มีเนื้อหาFile not found.และในบันทึกข้อผิดพลาด:

[Tue Nov 20 21:27:25.191625 2012] [proxy_fcgi:error] [pid 28997] [client ::1:57204] AH01071: Got error 'Primary script unknown\n'

ปรับปรุง

ตอนนี้ฉันพยายามทำพร็อกซี่ด้วย mod_rewrite:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "/Users/apfelbox/WebServer"

    RewriteEngine on    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>

แต่ปัญหาคือมันเปลี่ยนเส้นทางเสมอเนื่องจากมีการร้องขอเปิดhttp://localhost/โดยอัตโนมัติhttp://localhost/index.phpเพราะ

DirectoryIndex index.php index.html

อัปเดต 2

ตกลงดังนั้นฉันคิดว่า "อาจตรวจสอบว่ามีไฟล์ให้พร็อกซี่ก่อนหรือไม่:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "/Users/apfelbox/WebServer"

    RewriteEngine on    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>

ตอนนี้การเขียนใหม่ทั้งหมดไม่ทำงานอีกต่อไป ...

อัปเดต 3

ตอนนี้ฉันมีทางออกนี้:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "/Users/apfelbox/WebServer"

    RewriteEngine on    
    RewriteCond /Users/apfelbox/WebServer/%{REQUEST_FILENAME} -f
    RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>

ตรวจสอบก่อนว่ามีไฟล์ที่จะส่งไปยัง PHP-FPM (พร้อมพา ธเต็มและสัมบูรณ์ ) จากนั้นทำการเขียนใหม่

สิ่งนี้ไม่ทำงานเมื่อใช้การเขียน URL ซ้ำในไดเรกทอรีย่อย แต่ก็ล้มเหลวสำหรับ URL เช่นนั้นhttp://localhost/index.php/test/ กลับไปเป็นรูปสี่เหลี่ยมจัตุรัส


ความคิดใด ๆ

คำตอบ:


34

หลังจากเวลาผ่านไปหลายชั่วโมงในการค้นหาและอ่านเอกสาร Apache ฉันคิดวิธีแก้ปัญหาที่อนุญาตให้ใช้พูลและอนุญาตให้ Rewrite directive ใน. htaccess ทำงานแม้ว่า url จะมีไฟล์. php อยู่

<VirtualHost ...>

 ...

 # This is to forward all PHP to php-fpm.
 <FilesMatch \.php$>
   SetHandler "proxy:unix:/path/to/socket.sock|fcgi://unique-domain-name-string/"
 </FilesMatch>

 # Set some proxy properties (the string "unique-domain-name-string" should match
 # the one set in the FilesMatch directive.
 <Proxy fcgi://unique-domain-name-string>
   ProxySet connectiontimeout=5 timeout=240
 </Proxy>

 # If the php file doesn't exist, disable the proxy handler.
 # This will allow .htaccess rewrite rules to work and 
 # the client will see the default 404 page of Apache
 RewriteCond %{REQUEST_FILENAME} \.php$
 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
 RewriteRule (.*) - [H=text/html]

</VirtualHost>

ตามเอกสารของ Apache พารามิเตอร์พร็อกซี SetHandler ต้องใช้ Apache HTTP Server 2.4.10

ฉันหวังว่าโซลูชันนี้จะช่วยคุณได้เช่นกัน


2
นี่เป็นคำตอบที่แน่นอนสำหรับปี 2015 ทุกอย่างที่นี่เป็นอึสำหรับการตั้งค่าที่ทันสมัย ​​(สมมติว่าเดเบียนมีเสถียรภาพ)
Dmitri DB

1
ฉันตีหัวของฉันกับกำแพงในปัญหาเดียวกันนี้มาระยะหนึ่งแล้ว คุณช่วยกรุณาโพสต์คำสั่งการเขียนซ้ำ. htaccess ของคุณได้ไหม? จากสิ่งที่ฉันเข้าใจทุกอย่างในคำตอบนี้เป็นเพียงสิ่งที่คุณมีในไฟล์ httpd.d / site.conf ของคุณ
David W

1
ในขณะนี้การใช้ RewriteRule นี้ค่อนข้างอันตรายเนื่องจากสามารถเปิดเผยconfig.php ไฟล์ในแบบธรรมดาหากอยู่ในไดเรกทอรีที่มีชื่อแทนดังนั้นจึงไม่มีอยู่ใน% {DOCUMENT_ROOT} /% {REQUEST_URI}
Zulakis

1
รหัสที่น่าอัศจรรย์ 9 บรรทัด นี่คือจอกศักดิ์สิทธิ์และสิ่งเดียวที่ทำงานได้ 100% สำหรับฉัน เพียง sidenote: หากคุณเปลี่ยนจากโซลูชันโดยใช้ LocationMatch คุณไม่จำเป็นต้องผนวกพา ธ ไฟล์สัมบูรณ์เข้ากับ fcgi url เปิดพร็อกซีและเขียนใหม่ใน apache เพื่อระวังสิ่งนี้
Phil

1
+1 เนื่องจากโพสต์นี้ไม่เหมือนกับทรัพยากรอื่น ๆ ที่ฉันเคยเห็นช่วยให้ฉันเข้าใจว่า "unique-domain-name-string" ควรเป็นตัวแทนอะไร
สาม

10

ฉันเจอปัญหานี้เมื่อวานนี้เช่นกัน - Apache 2.4 ย้ายจากDebian / ทดลองไปเป็นDebian / ไม่แน่นอนบังคับให้ฉันต้องจัดการกับสิ่งใหม่นี้ ไม่ได้อยู่ในเซิร์ฟเวอร์การผลิตของเราแน่นอน)

หลังจากอ่านสิ่งที่รู้สึกเหมือนไซต์นับล้าน ๆ แห่งเอกสาร Apache รายงานข้อผิดพลาดและผลลัพธ์การดีบักในบันทึกข้อผิดพลาดในที่สุดฉันก็สามารถใช้งานได้ ไม่มีมีการสนับสนุนสำหรับ FPM กับซ็อกเก็ตไม่มียัง การตั้งค่าเริ่มต้นของ Debian ได้ใช้ซ็อกเก็ตมาระยะหนึ่งแล้วดังนั้นผู้ใช้ Debian ก็จะต้องทำการเปลี่ยนแปลงเช่นกัน

นี่คือสิ่งที่ใช้ได้กับไซต์ CakePHP และ PHPMyAdmin (ส่วนหลังต้องการการกำหนดค่าบางอย่างหากคุณใช้แพ็คเกจ Debian) ดังนั้นฉันสามารถยืนยันได้ว่าmod_rewriteยังคงใช้งานได้ตามที่คาดไว้ในการเขียน URL แฟนซี

แจ้งให้ทราบDirectoryIndex index.phpซึ่งอาจเป็นสาเหตุที่การกำหนดค่าของคุณไม่ทำงานสำหรับ "โฟลเดอร์" (อย่างน้อยนั่นคือสิ่งที่ไม่ทำงานที่นี่)

ฉันยังคงได้รับFile not found.ไดเรกทอรี แต่ถ้าไม่มีไฟล์ดัชนีก็สามารถแยก ชอบที่จะกำจัดสิ่งนั้นด้วย แต่ก็ไม่สำคัญเท่านี้ในตอนนี้


<VirtualHost *:80>
    ServerName site.localhost

    DocumentRoot /your/site/webroot
    <Directory />
            Options FollowSymlinks
            DirectoryIndex index.php
            AllowOverride All
            Require all granted
    </Directory>

    <LocationMatch "^(.*\.php)$">
            ProxyPass fcgi://127.0.0.1:9000/your/site/webroot
    </LocationMatch>

    LogLevel debug
    ErrorLog /your/site/logs/error.log
    CustomLog /your/site/logs/access.log combined
</VirtualHost>

vhost ด้านบนใช้งานได้ดีกับ. htaccess ในรูทดังนี้:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

URL rewriting inside a subdirectoryแม้ว่าฉันจะไม่ได้รับสิ่งที่คุณหมายถึง(ฉันแค่เขียนใหม่ไปที่ดัชนีของ root.php)


(โอ้และคุณต้องทำให้แน่ใจว่า Xdebug จะไม่ขัดแย้งกับ FPM ในระบบของคุณออกจากกล่องที่พวกเขาต้องการใช้พอร์ตเดียวกัน)


นี่เป็นวิธีแก้ปัญหาที่ดี แต่น่าเสียดายที่วิธีการนี้ใช้ไม่ได้เมื่อ url ที่มี. php จำเป็นต้องเขียนใหม่เช่นสำหรับ WordPress multisite /ms_blog_1/wp-admin/load-scripts.php?blah=blah
Phil

สำหรับฉันเพียงแค่เพิ่มการแทนที่DirectoryIndex index.htmlใน vhost ที่เป็นปัญหาได้รับการแก้ไข ถ้าฉันมีDirectoryIndex index.phpก็ดูเหมือนว่าไฟล์ PHP อื่น ๆ ท้ายทำให้เกิดข้อผิดพลาด 'ไม่พบไฟล์' และ 'ไม่ทราบสคริปต์หลัก' ในกรณีของฉันฉันมีแต่ไฟล์index.html PHP ได้หรือ test.php
geerlingguy

4

สิ่งที่คุณต้องทำคือการตั้งค่า:

 ProxyErrorOverride on

และอย่าลืมตั้งค่าหน้าลูกค้าด้วย:

ErrorDocument 404 /path/to/error_page_file    

2

นี่คือสิ่งที่ฉันมี ดูเหมือนว่าจะทำงานได้ดี ฉันวาง Drupal ไว้ในไดเรกทอรีย่อยและเขียนใหม่ทำงานดัชนีไดเรกทอรีทำงานและ PATH_INFO ทำงาน

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} ^/((.*\.php)(/.*)?)$
RewriteCond %2 -f
RewriteRule . fcgi://127.0.0.1:9000/%1 [L,P]
RewriteOptions Inherit

ฉันพยายามทำสิ่งนี้โดยไม่เขียนใหม่ ("ถ้า" และเช่นนั้น) แต่ฉันไม่สามารถทำงานอะไรได้

แก้ไข: โปรดทราบว่าหากคุณต้องการใช้สิ่งนี้เป็นผู้ให้บริการโฮสต์ที่ใช้ร่วมกันอาจเป็นปัญหาด้านความปลอดภัย มันจะช่วยให้ผู้ใช้สามารถส่งสคริปต์ PHP ไปยังพร็อกซี fcgi ตามอำเภอใจ หากคุณมีพูลแยกต่างหากสำหรับผู้ใช้ทุกคนนั่นจะช่วยยกระดับการโจมตีของสิทธิ์


2

วิธีการแก้ปัญหาอื่น (ต้องใช้ Apache> = 2.4.10) - ภายใน vhost:

# define worker
<Proxy "unix:/var/run/php5-fpm-wp.bbox.nuxwin.com.sock|fcgi://domain.tld" retry=0>
    ProxySet connectiontimeout=5 timeout=7200
</Proxy>

<If "%{REQUEST_FILENAME} =~ /\.php$/ && -f %{REQUEST_FILENAME}">
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    SetHandler proxy:fcgi://domain.tld
</If>

ดังนั้นที่นี่ตัวจัดการ fcgi สำหรับ PHP จะถูกตั้งค่าต่อเมื่อไฟล์นั้นมีอยู่และถ้าชื่อนั้นตรงกับนามสกุลไฟล์ PHP

BTW:สำหรับผู้ที่จะมีความคิดในการตั้งค่าProxyErrorOverrideเป็นOnโปรดระวังว่านี่เป็นความคิดที่เลวจริงๆ การใช้คำสั่งนี้ไม่ได้ทำให้เกิดปัญหาใด ๆ ตัวอย่างเช่นแอปพลิเคชัน PHP ที่ส่งรหัส HTTP เช่น 503 จะนำไปสู่ผลลัพธ์ที่ไม่คาดคิด ตัวจัดการข้อผิดพลาดเริ่มต้นจะมีส่วนร่วมในทุกกรณีและสำหรับแอปพลิเคชัน PHP ที่ให้บริการ API ซึ่งเป็นพฤติกรรมที่ไม่ดี


น่าเสียดายที่ยังคงมี "AH01071: มีข้อผิดพลาด 'ไม่ทราบสคริปต์หลัก \ n'" ข้อผิดพลาดโดยใช้วิธีนี้
klor

1

วิธีที่ดีที่สุดในการแก้ปัญหานี้คือการเปิดบันทึกการแก้ไขข้อบกพร่องสำหรับ mod_proxy และ mod_rewrite และ php-fpm ใน apache 2.4 ตอนนี้คุณสามารถเปิดบันทึกการดีบักสำหรับโมดูลเฉพาะเท่านั้น http://httpd.apache.org/docs/current/mod/core.html#loglevel การกำหนดค่าต่อโมดูลและต่อไดเรกทอรีมีอยู่ใน Apache HTTP Server 2.3.6 และใหม่กว่า

บางทีคุณอาจได้เครื่องหมายทับสองเท่าในไดเรกทอรี

นี่คือสิ่งที่ฉันใช้และใช้งานได้ดี:

<LocationMatch ^(.*\.php)$>
  ProxyPass fcgi://127.0.0.1:9000/home/DOMAINUSER/public_html$1
</LocationMatch>

1

สิ่งหนึ่งที่ฉันได้พบในการจัดการกับปัญหานี้คือถ้าคุณใช้การรวมกันของ:

chroot = /path/to/site
chdir = /

ในการกำหนดค่าพูล fpm ของคุณอย่าส่งเส้นทางแบบเต็มไปยังProxyPassคำสั่ง

ProxyPass fcgi://127.0.0.1:9020/$1

แต่ - เฉพาะ - หากพูลบนพอร์ตนั้น chrooted


1

ฉันไม่แน่ใจว่าปัญหาเกี่ยวข้องกันหรือไม่ แต่ฉันพบวิธีแก้ปัญหาการทำงานบางส่วนที่นี่:

https://stackoverflow.com/questions/44054617/mod-rewrite-in-2-4-25-triggering-fcgi-primary-script-unknown-error-in-php-fpm

เคล็ดลับน่าจะเพิ่ม? ถ่านใน. htaccess RewriteRule เช่นใช้:

RewriteRule ^(.*)$ index.php?/$1 [L,NS]

แทน:

RewriteRule ^(.*)$ index.php/$1 [L,NS]

แหล่งที่มาของปัญหาน่าจะเป็นการเปลี่ยนแปลงใน mod_rewrite ของ Apache 2.4.25 ฉันใช้ Apache log1 ระดับการบันทึกเพื่อสังเกต "วน" ที่ผ่าน $ 1 ถึง php-fpm หลังจาก index.php / $ 1 ผ่านไปแล้ว $ 1 สร้างข้อผิดพลาด "AH01071: มีข้อผิดพลาด 'ไม่ทราบสคริปต์หลัก \ n'"

หวังว่าชิ้นอาหารอันโอชะน้อยนี้จะช่วยให้คนแก้ปัญหาของพวกเขา



0

ฉันมีข้อผิดพลาดหลังจากเปลี่ยนเป็น php-fpm + apache 2.4.6 สำหรับอินสแตนซ์ drupal

แต่ฉันกำลังใช้ตัวแก้ไขเหตุการณ์ mpm

เพียงแค่ใส่

DirectoryIndex index.php ทำงานได้สำหรับฉัน

การตั้งค่า Vhost ของฉันจะมีลักษณะดังนี้

<VirtualHost *:8080>
  ServerAdmin webmaster@localhost
  ServerName sever.com
  DocumentRoot /var/www/html/webroot
    ErrorLog logs/web-error_log
    CustomLog logs/web-access_log common
<IfModule mpm_event_module>
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/webroot/$1
</IfModule>
  <Directory /var/www/html/webroot>
     Options FollowSymlinks
     DirectoryIndex index.php
     AllowOverride All
     Require all granted
  </Directory>
</VirtualHost>

ขอบคุณ

ไม่จำเป็นต้องแก้ไขไฟล์. htaccess ที่เป็นค่าเริ่มต้นของ drupal


[พุธ 25 เมษายน 01: 41: 31.526781 2018] [proxy_fcgi: ข้อผิดพลาด] [pid 2012: tid 140181155772160] (70007) การหมดเวลาที่ระบุได้หมดอายุแล้ว: [ลูกค้า 127.0.0.1:60308] AH01075: ข้อผิดพลาดในการส่งคำขอไปที่: ผู้อ้างอิง: www / ผู้ดูแลระบบ / รายงาน
ปิดผนึก

0

ฉันประสบปัญหาเดียวกันบนเซิร์ฟเวอร์ของฉัน (centos 7.3.16 docker) หลังจากติดตามบันทึก php-fpm ฉันพบ miss sys lib WARNING: [pool www] child 15081 said into stderr: "php-fpm: pool www: symbol lookup error: /lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure" จากนั้นฉันจะเรียกคืน nspr มันใช้งานได้หากคุณไม่สามารถหาวิธีแก้ไขได้หลังจากลองวิธีการใด ๆ คุณอาจลองวิธีนี้ yum -y install/reinstall nspr


0

ใช้งานได้กับ Wordpress 5.1.1 และใหม่กว่าพร้อมกับ PHP 7.3, FastCGI, พร็อกซีและ MariaDB / MySQL ตรวจสอบสองครั้งบนเซิร์ฟเวอร์ของฉัน ทำงานเหมือนจับใจ

ที่หนึ่งใน CentOS / Fedora / Red Hat

sudo yum remove php*
sudo yum --enablerepo=extras install epel-release
sudo yum install php-fpm php-mysql php-gd php-imap php-mbstring 
sudo grep -E '(proxy.so|fcgi)' /etc/httpd/conf.modules.d/00-proxy.conf
sudo mv /etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf_bak

แก้ไขไฟล์นี้:

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

วางสิ่งนี้:

[www]

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9000
listen = /run/php-fcgi.sock

sudo ll /run/php-fcgi.sock

ควรให้ srw-rw-rw-

หรือวิธีการตั้งค่าบน Debian / Ubuntu

กวดวิชา:

แหล่งที่มา: https://emi.is/?page=articles&article=php-7-installation-and-configuration-for-apache-2.4-using-php-fpm-(debian,-repository)


sudo apt purge 'php*' or sudo apt-get purge 'php*'
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt install php7.3 php7.3-fpm php-mysql php-mbstring php-gd php-imap libapache2-mod-security2 modsecurity-crs
systemctl status php7.3-fpm
systemctl stop php7.3-fpm.service

sudo a2dismod php7.0 php7.1 php7.2 mpm_event mpm_worker
sudo a2enmod mpm_prefork
sudo a2enmod php7.3
sudo systemctl restart apache2 (httpd in CentOS)

ปัญหาคือ php 7.3 จาก Ondrej repo ใช้ได้กับโหมด mpm_prefork เท่านั้น เขามี repo คอมไพล์ดังนั้นคุณสามารถหาเขาในเน็ตและถามเขาเขาจะทำ php 7.3 สำหรับ mpm_worker และ mpm_event การกำหนดค่าส่วนที่เหลือสำหรับ Distros ตระกูล Debian อยู่ด้านล่าง:


sudo apt --assume-yes install php7.3-fpm
sudo systemctl stop php7.3-fpm.service
sudo rm /var/log/php7.0-fpm.log
sudo mkdir /var/log/php7.3-fpm/
sudo touch /var/log/php7.3-fpm/error.log
sudo mkdir /var/log/php7.3/
sudo touch /var/log/php7.3/error.log
sudo mkdir /var/tmp/php7.3/
sudo > /etc/php/7.3/fpm/php.ini
sudo > /etc/php/7.3/fpm/php-fpm.conf
sudo rm /etc/php/7.3/fpm/pool.d/www.conf
sudo touch /etc/php/7.3/fpm/pool.d/example.com.conf
sudo useradd --comment "PHP" --shell "/usr/sbin/nologin" --system --user-group php

sudo nano /etc/php/7.3/fpm/php.ini

วาง


[PHP]
date.timezone = Europe/Prague
display_errors = Off
error_log = /var/log/php7.3/error.log
error_reporting = 32767
log_errors = On
register_argc_argv = Off
session.gc_probability = 0
short_open_tag = Off
upload_tmp_dir = /var/tmp/php7.3/

sudo nano /etc/php/7.3/fpm/php-fpm.conf

วาง


[global]
error_log = /var/log/php7.3-fpm/error.log
include = /etc/php/7.3/fpm/pool.d/*.conf

sudo nano /etc/php/7.3/fpm/pool.d/example.com.conf

วาง


[example.com]
group = php
listen = 127.0.0.1:9000
pm = ondemand
pm.max_children = 5
pm.max_requests = 200
pm.process_idle_timeout = 10s
user = php

sudo nano /etc/logrotate.d/php7.3-fpm

คัดลอกไปยังไฟล์ txt:

/var/log/php7.3-fpm.log {
    rotate 12
    weekly
    missingok
    notifempty
    compress
    delaycompress
    postrotate
            /usr/lib/php/php7.3-fpm-reopenlogs
    endscript
}

ลบออกแล้ววางสิ่งนี้แทนการด้านบน:

/var/log/php7.3/*.log /var/log/php7.3-fpm/*.log
{
copytruncate
maxage 365
missingok
monthly
notifempty
rotate 12
}

เพิ่มคำสั่ง

sudo nano /etc/apache2/sites-available/example.com.conf


<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias example.com
    ServerAdmin admin@example.com
    DocumentRoot /var/www/html/example.com/public_html
    DirectoryIndex index.php index.htm index.html index.xht index.xhtml
    LogLevel info warn
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <FilesMatch "^\.ht">
    Require all denied
    </FilesMatch>

    <files readme.html>
    order allow,deny
    deny from all
    </files>

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =example.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/example.com/public_html

    <Directory /var/www/html/example.com/public_html>
        Options Indexes FollowSymLinks Includes IncludesNOEXEC SymLinksIfOwnerMatch
        AllowOverride None
    </Directory>
</VirtualHost>

จากนั้นเปิดใช้งานไซต์:

sudo a2ensite /etc/apache2/sites-available/example.com.conf

แก้ไขไซต์ SSL ถัดไป (ในกรณีนี้ certbot จาก Let's Encrypt ได้รับการติดตั้งและกำหนดค่าไว้ก่อนหน้านี้ที่จุดเริ่มต้นของการกำหนดค่าใบรับรอง SSL)

sudo nano /etc/apache2/sites-available/example.com-le-ssl.conf

<IfModule mod_ssl.c>
    #headers for security man in the middle attack find how to enable this mod in Google
    LoadModule headers_module modules/mod_headers.so
    <VirtualHost *:443>
        Header always set Strict-Transport-Security "max-age=15768000"
        SSLEngine On
        ServerName example.com
        ServerAdmin admin@example.com
        DocumentRoot /var/www/html/example.com/public_html
        <Directory /var/www/html/example.com/public_html>
        Options Indexes FollowSymLinks Includes IncludesNOEXEC SymLinksIfOwnerMatch
        AllowOverride All
        Require all granted
        DirectoryIndex index.php
        RewriteEngine On
         <FilesMatch ^/(.*\.php(/.*)?)$>
           SetHandler "fcgi://example.com:9000/var/www/html/example.com/public_html"
          </FilesMatch>
        </Directory>
    # Log file locations
    #LogLevel info ssl:warn
    LogLevel debug
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # modern configuration
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    #SSLCipherSuite HIGH:!aNULL:!MD5
    SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM$
    SSLHonorCipherOrder on
    SSLCompression off
    SSLSessionTickets off

    <FilesMatch "^\.ht">
    Require all denied
    </FilesMatch>

    <files readme.html>
       order allow,deny
       deny from all
    </files>

</VirtualHost>
    #Stapling OCSP for Let's Encrypt certs.
    SSLUseStapling          on
    SSLStaplingResponderTimeout     5
    SSLStaplingReturnResponderErrors        off
    SSLStaplingCache        shmcb:/var/run/ocsp(128000)
</IfModule>

sudo a2enmod proxy proxy_fcgi setenvif
sudo systemctl reload apache2.service
sudo chown --recursive root:adm /etc/php/
sudo chmod --recursive 0770 /etc/php/
sudo chown --recursive php:adm /var/log/php7.3/
sudo chown --recursive php:adm /var/log/php7.3-fpm/
sudo chmod --recursive 0770 /var/log/php7.3/
sudo chmod --recursive 0770 /var/log/php7.3-fpm/
sudo chown --recursive php:php /var/tmp/php7.3/
sudo chmod --recursive 0770 /var/tmp/php7.3/
sudo a2enconf php7.3-fpm
sudo systemctl enable php7.3-fpm.service
sudo systemctl start php7.3-fpm.service

อย่าลืมเพิ่มพอร์ต 9000 ลงในไฟร์วอลล์บน Debian / Ubuntu

sudo ufw allow 9000/tcp
sudo ufw status

บน CentoOS / Fedora / Red Hat

sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
sudo firewall-cmd --state 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.