การแก้จุดบกพร่องเป็นบิตของศิลปะ แต่สิ่งที่สามารถเข้าใจได้ง่ายโดยทำตามระบบการปกครองแบบง่าย ๆ
ทำตามแต่ละจุดจนกว่าคุณจะถึงทางออก
เปิดใช้งานข้อผิดพลาด PHP
นี่คือกุญแจสู่ปัญหาส่วนใหญ่ เพื่อความปลอดภัยหรือด้วยเหตุผลอื่นการแสดงข้อผิดพลาด PHP อาจถูกปิดใช้งานโดยค่าเริ่มต้นจากการกำหนดค่า PHP ของคุณ
คุณสามารถเปิดใช้งานข้อผิดพลาดด้วยวิธีแก้ไขปัญหาที่ถาวรมากขึ้นหรือเป็นเพียงสิ่งชั่วคราวเท่านั้น
ทางออกถาวร
สำหรับผู้ใช้ Apache / mod_php
ใน.htaccess
ไฟล์ของรูทเอกสารของคุณ- เพียงแค่วางสิ่งนี้ไว้ที่ด้านบน
php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag log_errors on
php_value error_log /home/path/public_html/var/log/system.log
สำหรับผู้ใช้ Nginx / FastCGI
ในการกำหนดค่า Nginx virtualhost ของคุณทั้งในlocation .php {
คำสั่งสุดท้ายหรือในfastcgi_params
ไฟล์ (ถ้าคุณมีหนึ่งที่ระบุไว้)
fastcgi_param PHP_VALUE display_startup_errors=on;
fastcgi_param PHP_VALUE display_errors=on;
fastcgi_param PHP_VALUE html_errors=on;
fastcgi_param PHP_VALUE log_errors=on;
fastcgi_param PHP_VALUE error_log=/home/path/public_html/var/log/system.log;
โซลูชั่นชั่วคราว / สากล
สำหรับแพลตฟอร์มใด ๆ
แก้ไขแถบบู๊ต Magento index.php
ในรูทเอกสารของคุณและยกเลิกหมายเหตุบรรทัดต่อไปนี้:
#ini_set('display_errors', 1);
เปิดใช้งานโหมดนักพัฒนาซอฟต์แวร์
เมื่อคุณมีข้อผิดพลาดและทันใดนั้นก็พบหน้า "รายงานข้อผิดพลาด" และได้รับสตริงข้อผิดพลาดที่ดูเหมือนไร้ประโยชน์เช่น1184257287824
- คุณมีตัวเลือกน้อย
ทางออกถาวร
สำหรับผู้ใช้ Apache / mod_php
ใน.htaccess
ไฟล์รูทเอกสารของคุณ- เพียงแค่วางที่ด้านบน
SetEnv MAGE_IS_DEVELOPER_MODE true
สำหรับผู้ใช้ Nginx / fastcgi
ในการกำหนดค่า Nginx virtualhost ของคุณทั้งในlocation .php {
คำสั่งสุดท้ายหรือในfastcgi_params
ไฟล์ (ถ้าคุณมีหนึ่งที่ระบุไว้)
fastcgi_param MAGE_IS_DEVELOPER_MODE true;
โซลูชั่นชั่วคราว / สากล
แก้ไข bootstrap ของ Magento index.php
ในรูทเอกสารของคุณและทำให้if
คำสั่งเป็นจริงเสมอหรือเปิดใช้งานสำหรับ IP เฉพาะของคุณ
if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) || true) {
Mage::setIsDeveloperMode(true);
}
หรือ
if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE']) || $_SERVER['REMOTE_ADDR'] == 'my.ip.add.ress') {
Mage::setIsDeveloperMode(true);
}
ตรวจสอบการอนุญาตของคุณ
การอนุญาตที่ไม่ถูกต้องจะทำให้เกิดปัญหามากมายซึ่งส่วนใหญ่ไม่สามารถหาได้ง่ายในตอนแรก
ตัวอย่างเช่น.
ถ้า PHP ไม่สามารถเขียนไปยัง./media
ไดเรกทอรีและคุณเปิดใช้งานการรวม JS - วีโอไอพีไม่สามารถสร้างไฟล์รวมและ URI ที่ไม่ซ้ำกันที่เกี่ยวข้องสำหรับสื่อ ดังนั้นสิ่งที่คุณจะพบในซอร์สโค้ดของเบราว์เซอร์คือเส้นทางเซิร์ฟเวอร์แบบเต็มไปยังไฟล์มีเดีย
/home/path/public_html/media/xxx
มิฉะนั้นไซต์อาจทำงานเป็นปกติโดยไม่มีข้อผิดพลาดร้ายแรงที่มองเห็นได้
โปรดจำไว้ว่าการปฏิบัตินี้มีความปลอดภัยสำหรับการโฮสต์โดยเฉพาะ แต่อาจมีปัญหาด้านความปลอดภัยกับการโฮสต์ที่ใช้ร่วมกันหากกระบวนการ Apache ไม่ได้ chroot'ed ต่อผู้ใช้
ในตัวอย่างของเราผู้ใช้ SSH / FTP คือsonassi
ผู้ใช้ Apache apache
และกลุ่มคือapache
เพิ่มผู้ใช้ FTP / SSH ไปยังกลุ่ม Apache
สิ่งสำคัญที่สุดคือเราต้องให้แน่ใจว่าผู้ใช้ FTP / SSH เป็นส่วนหนึ่งของกลุ่ม Apache ในตัวอย่างของเรามันapache
(แต่ก็เป็นเรื่องปกติด้วยwww-data
)
usermod -a -G apache sonassi
เพิ่มผู้ใช้เป็นกลุ่มให้มากที่สุดเท่าที่คุณมีสำหรับ FTP / SSH
รีเซ็ตการอนุญาตดั้งเดิม
ดังนั้นก่อนที่เราจะเริ่มให้แน่ใจว่าสิทธิ์ทั้งหมดถูกต้อง
chown -R sonassi:apache /home/path/public_html/
find /home/path/public_html/ -type d -exec chmod 775 {} \;
find /home/path/public_html/ -type f -exec chmod 664 {} \;
ทำการเปลี่ยนแปลงอย่างถาวร
ACLs และ Sticky Bits
ACLs ใน Linux อนุญาตให้เรากำหนดกฎเฉพาะในกรณีของเราไฟล์สิทธิ์ที่ควรสืบทอดเมื่อสร้าง เหนียวเล็กน้อย (ดังกล่าวในภายหลัง) ดูแลกลุ่มมรดก แต่ไม่ได้ช่วยให้มีสิทธิ์ซึ่งเป็นเหตุผลที่เราใช้ ACL ของ
เริ่มต้นด้วยการเปิดใช้งานการสนับสนุน ACL ในพาร์ทิชันที่ใช้งานอยู่โปรดตรวจสอบเคอร์เนลของคุณถูกรวบรวมด้วยการสนับสนุนของ ACL
พาร์ทิชันของคุณอาจจะ/
, /home
, /var
หรือสิ่งอื่นแทนตามความเหมาะสม
mount -o remount,acl /home
ตอนนี้เปิดใช้งาน ACL แล้วเราสามารถตั้งค่ากฎ ACL และบิตกลุ่มเหนียว:
setfacl -d -m u::rwx,g::rwx,o::rx /home/path/public_html/
chmod g+s /home/path/public_html/
แต่ฉันไม่ได้รับการสนับสนุนจาก ACL
หากเคอร์เนลของคุณไม่รองรับ ACL คุณสามารถใช้umask
(ซึ่งเป็นการตั้งค่าเวลาทำงานสำหรับ BASH, FTP และ PHP) เพื่อตั้งค่าการอนุญาตไฟล์เริ่มต้น วีโอไอพีมักจะกำหนดumask(0)
ในindex.php
แต่มันจะอยู่ในความสนใจของคุณที่จะเปลี่ยนแปลงนี้
ในindex.php
การเปลี่ยนแปลงของคุณumask
สายที่จะ
umask(022);
และในสภาพแวดล้อม BASH ของคุณสำหรับ SSH ให้ตั้งค่านี้ในของคุณ.bashrc
หรือ.bash_profile
umask 022
สำหรับเซิร์ฟเวอร์ FTP ของคุณคุณจะต้องอ่านเอกสารประกอบ แต่หลักการก็เหมือนกัน
เปลี่ยนธีมกลับเป็นค่าเริ่มต้น
เป็นไปได้ว่าชุดรูปแบบหรือแพคเกจของคุณเป็นผู้รับผิดชอบปัญหานี้ การย้อนกลับไปใช้ธีมวานิลลาวีโอไอพีเป็นวิธีที่รวดเร็วในการค้นหา
** สิ่งนี้มาพร้อมกับข้อแม้ที่บางโมดูลอาจขึ้นอยู่กับคุณสมบัติของธีม *
แทนที่จะเปลี่ยนอะไรผ่านแผงการดูแลระบบมันง่ายกว่ามากที่จะเปลี่ยนชื่อไดเรกทอรีที่ละเมิด
ผ่าน SSH
mv ./app/design/frontend/myBrokenTheme{,.tmp}
mv ./skin/frontend/myBrokenTheme{,.tmp}
หรือผ่านไคลเอนต์ FTP ของคุณสำรวจและเปลี่ยนชื่อแพคเกจของคุณเป็นอย่างอื่น เช่น.myBrokenTheme.tmp
หากสามารถแก้ไขปัญหาของคุณได้
จากนั้นคุณต้องขุดให้ลึกลงไปอีกเล็กน้อยเพื่อดูว่าส่วนใดของแม่แบบที่มีปัญหา ดังนั้นคืนค่าแพคเกจของคุณและลองต่อไปนี้ทดสอบระหว่าง
เป็นหลักกระบวนการคือการเปิดใช้งานไดเรกทอรีในขณะที่คุณทยอยลงต้นไม้ไฟล์ - จนกว่าคุณจะสามารถหาไฟล์ที่ละเมิด
- เปลี่ยนชื่อไดเรกทอรีเค้าโครงเป็น
.tmp
- เปลี่ยนชื่อไดเรกทอรีแม่แบบเป็น
.tmp
จากนั้นหากมีการแก้ไขให้เปลี่ยนชื่อไฟล์ทั้งหมดภายในไดเรกทอรีโครงร่างเป็น.tmp
- (สำหรับผู้ใช้ SSH ls | xargs -I {} mv {} {}.tmp
หรือrename 's/^/.tmp/' *
)
จากนั้นค่อยเปิดใช้งานแต่ละไฟล์ 1 ต่อ 1 จนกระทั่งได้รับการแก้ไข
หากไม่สามารถแก้ปัญหาของคุณได้
มีความเป็นไปได้ที่ไดเรกทอรีของคุณbase/default
หรือenterprise/default
อาจมีการปนเปื้อน - และจะถูกแทนที่ด้วยเวอร์ชั่นใหม่ที่รู้จักกันดีที่สุด
คุณสามารถทำได้โดยการดาวน์โหลดไฟล์วีโอไอพีรุ่นใหม่และแทนที่ไดเรกทอรีของคุณตามความจำเป็น ผ่าน SSH คุณสามารถทำได้:
cd /home/path/public_html/
mkdir clean_mage
cd clean_mage
MAGENTO_VERSION=1.7.0.0
wget -O magento.tgz http://www.magentocommerce.com/downloads/assets/$MAGENTO_VERSION/magento-$MAGENTO_VERSION.tar.gz
tar xvfz magento.tgz
cd /home/path/public_html/app/design/frontend
mv base{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/app/design/frontend/base .
cd /home/path/public_html/skin/frontend
mv base{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/skin/frontend/base .
คุณยังสามารถใช้โอกาสนี้diff
ในสองไดเรกทอรีหากคุณต้องการตรวจสอบการเปลี่ยนแปลงใด ๆ
diff -r base base.tmp
NB วิธีการนี้จะทำให้เกิดข้อผิดพลาดมากขึ้นในระหว่างกระบวนการเนื่องจากการพึ่งพาโมดูลสั่งการดำรงอยู่ของไฟล์ที่เฉพาะเจาะจง น่าเสียดายที่มันเป็นที่ตราไว้สำหรับหลักสูตร
ปิดใช้งานโมดูลโลคัล
โดยปกติวีโอไอพีจะกำหนดเส้นทางการรวม PHP เพื่อโหลดคลาสตามลำดับต่อไปนี้
Local > Community > Core
หากไฟล์อยู่ในท้องถิ่นให้โหลดและไม่ต้องทำเพิ่มเติม
หากไฟล์อยู่ในชุมชนให้โหลดและไม่ทำอีกต่อไป
หากไม่พบไฟล์อื่นให้โหลดจากคอร์
อีกครั้งแทนที่จะปิดใช้งานโมดูลผ่านแผงผู้ดูแลระบบ Magento มันเป็นจริงมากขึ้นในการทำเช่นนี้ในระดับไฟล์
โดยทั่วไปเมื่อต้องการปิดการใช้งานโมดูลในแบบ "เหมาะสม" คุณจะต้องแก้ไข./app/etc/modules/MyModule.xml
ไฟล์และการตั้งค่าตามลำดับ<active>false</active>
อย่างไรก็ตามนี่ไม่ได้เป็นการป้องกันคลาสไม่ให้ทำการโหลด
หากคลาสอื่นขยายคลาสที่กำหนดในโมดูล (ละเว้นการประกาศการพึ่งพา Magento ใด ๆ ) คลาสนั้นจะยังคงถูกโหลด - ไม่ว่าจะปิดใช้งานส่วนขยายหรือไม่ก็ตาม
ดังนั้นวิธีที่ดีที่สุดในการปิดการใช้งานส่วนขยายคือการเปลี่ยนชื่อไดเรกทอรี
เริ่มต้นด้วยการปิดการใช้งานในท้องถิ่น
เพียงเปลี่ยนชื่อไดเรกทอรีผ่าน FTP หรือใช้คำสั่ง SSH ต่อไปนี้
mv ./app/code/local{,.tmp}
จากนั้นปิดใช้งานชุมชน
mv ./app/code/community{,.tmp}
หากปัญหาได้รับการแก้ไขจากทั้ง
จากนั้นเป็นกรณีของการทำความเข้าใจว่าโมดูลใดที่ข้อผิดพลาดเกิดขึ้นโดยเฉพาะ เช่นเดียวกับตัวอย่างที่ระบุไว้ด้านบนสำหรับการวิเคราะห์บรรจุภัณฑ์กระบวนการเดียวกันจะถูกนำมาใช้
ดังนั้นเรียกคืนไดเร็กทอรี X และลองทำสิ่งต่อไปนี้ทดสอบระหว่างแต่ละไฟล์
เป็นหลักกระบวนการคือการเปิดใช้งานไดเรกทอรี (โมดูล) ค่อยๆทีละคนจนกว่าข้อผิดพลาดเกิดขึ้นอีกครั้ง
- เปลี่ยนชื่อโมดูลทั้งหมดในไดเรกทอรีเป็น
.tmp
(สำหรับผู้ใช้ SSH ls | xargs -I {} mv {} {}.tmp
หรือrename 's/^/.tmp/' *
)
- เปิดใช้งานแต่ละโมดูลทีละหนึ่งโดยค่อยๆลบออก
.tmp
จากชื่อไฟล์
หากปัญหายังไม่ได้รับการแก้ไข
จากนั้นก็เป็นไปได้ที่แกนตัวเองจะปนเปื้อน แกนหลักของวีโอไอพี PHP ประกอบด้วย
./app/code/core
./lib
ดังนั้นอีกครั้งเปลี่ยนชื่อไดเรกทอรีเหล่านี้และคัดลอกในตัวแปรที่สะอาด สมมติว่าคุณได้ดาวน์โหลดเวอร์ชั่นวีโอไอพีเวอร์ชั่นใหม่ทั้งหมดข้างต้นผ่าน SSH คุณสามารถทำได้ดังนี้:
cd /home/path/public_html/app/code
mv core{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/app/code/core .
ถ้าปัญหายังไม่ได้รับการแก้ไขให้เปลี่ยนlib
ไดเรกทอรีด้วย
cd /home/path/public_html
mv lib{,.tmp}
cp -par /home/path/public_html/clean_mage/magento/lib .
ณ จุดนี้ร้านค้า Magento ของคุณจะไม่มีอะไรมากไปกว่าการติดตั้งวานิลลาพร้อมฐานข้อมูลที่ถูกดัดแปลง
บางรุ่นยังคงถูกเก็บไว้ในฐานข้อมูล (เช่นการเพิ่มคำสั่งซื้อ) - ดังนั้น ณ จุดนี้มันจะกลายเป็นกรณีของการแก้ไขด้วยตนเอง จนถึงขั้นตอนทั้งหมดข้างต้นสามารถย้อนกลับได้โดยไม่มีความเสียหายยาวนาน แต่ถ้าเรานำเข้าฐานข้อมูลวีโอไอพีที่สะอาดเช่นกัน - มันสามารถพิสูจน์ได้ว่ากลับไม่ได้ (ขาดการกู้คืนข้อมูลสำรอง)
คำแนะนำข้างต้นทำหน้าที่ให้คุณทราบวิธีการระบุข้อผิดพลาด ไม่แก้ไขข้อผิดพลาดผลลัพธ์
เนื้อหาที่มาจากwww.sonassi.com/knowledge-base/magento-debug-processและwww.sonassi.com/knowledge-base/stop-magento-permissions-errman-permanently