สิทธิ์ / ความเป็นเจ้าของในการตั้งค่าในโฟลเดอร์ PHP Sessions เมื่อใช้งาน FastCGI / PHP-FPM (ในฐานะผู้ใช้“ ไม่มีใคร”)


17

ฉันมีปัญหาในการเรียกใช้สคริปต์จำนวนมากเนื่องจาก PHP-FPM ไม่สามารถเขียนไปยังโฟลเดอร์เซสชันของฉัน:

"2009/10/01 23:54:07 [ข้อผิดพลาด] 17830 # 0: * 24 FastCGI ส่งเป็น stderr:" คำเตือน PHP:
    ไม่รู้จัก: เปิด (/ var / lib / php / เซสชัน / sess_cskfq4godj4ka2a637i5lq41o5, O_RDWR)
    ล้มเหลว: การอนุญาตถูกปฏิเสธ (13) ในไม่รู้จักในบรรทัด 0
คำเตือน PHP: ไม่ทราบ: ไม่สามารถเขียนข้อมูลเซสชัน (ไฟล์) กรุณายืนยัน
    การตั้งค่าปัจจุบันของ session.save_path ถูกต้อง
    (/ var / lib / php / เซสชัน) ใน Unknown on line 0 "ขณะอ่าน upstream"

เห็นได้ชัดว่านี่เป็นปัญหาสิทธิ์ เจ้าของ / กลุ่มโฟลเดอร์เซสชั่นของฉันคือผู้ใช้ NGINX ของเว็บเซิร์ฟเวอร์ PHP-FPM รันเหมือนnobodyกันดังนั้นการเพิ่มไปยังกลุ่ม nginx จึงไม่น่ารำคาญ

วิธีแก้ปัญหาชั่วคราวคือการตั้งค่าการอนุญาต/var/lib/php/sessionให้777- ฉันมีความรู้สึกที่ไม่ใช่ "การปฏิบัติที่ดีที่สุด" แม้ว่า

แนวปฏิบัติที่ดีที่สุดคืออะไรเมื่อคุณจำเป็นต้องกำหนดสิทธิ์การเขียน daemon ให้กับโฟลเดอร์ แต่ทำงานเป็นnobodyอย่างไร

คำตอบ:


24

สิทธิ์ที่ถูกต้องสำหรับเราอยู่ที่ไหน

chown -R nobody:nogroup /var/lib/php/session

เหมือนกับphp-cgiที่ใช้nobodyงานแม้ว่า NGinx จะทำงานเป็นผู้ใช้nginx


ในกรณีของฉันมันไม่ใช่คำถามของการเป็นเจ้าของ / สิทธิ์ ลบ "3;" จาก session.save_path = "3; / var / lib / php / รอบ"
John Doe

1
ฉันได้รับข้อผิดพลาดต่อไปนี้: กลุ่มไม่ถูกต้อง << ไม่มีใคร: nogroup >> :(
Pathros

ฉันสามารถดูnobodyว่าผู้ใช้ของฉันคนไหนที่รัน php ด้วยรหัสของบรรทัดนี้: <?php echo exec('whoami'); ?>(ในกรณีของฉันข้อมูล www) และหลังจากนั้นมันง่ายเหมือนเพิ่งเขียนchown -R www-data:www-data /var/lib/php/sessionsนี่เป็นผล google underrated เพราะมันเป็นคำตอบเดียวที่ช่วย ฉันหลังจากชั่วโมงของการค้นหา! ขอบคุณ!
ดิมิทาร์

9

หากคุณใช้nginxคุณอาจพบปัญหานี้เมื่อรันการอัปเดตระบบ

บางครั้งเมื่อคุณอัปเดตระบบกลุ่มของ/var/lib/php/sessionถูกเปลี่ยนเป็น apache

ลองดำเนินการsudo chgrp nginx /var/lib/php/*แทนการตั้งค่าการอนุญาตเป็น 777 ซึ่งเป็นการปฏิบัติที่ไม่ดี

ที่ทำงานให้ฉันอย่างน้อย


1
ควรทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับได้
Yuda Prawira

3

ใช้คำสั่ง/etc/php.ini session.save_path

วิธีแก้ปัญหาชั่วคราวคือการตั้งค่าการอนุญาตของ / var / lib / php / session เป็น 777 - ฉันมีความรู้สึกว่าไม่ใช่ "วิธีปฏิบัติที่ดีที่สุด"

"ถ้าคุณปล่อยให้ชุดนี้เป็นไดเรกทอรีที่อ่านได้ทั่วโลกผู้ใช้รายอื่นบนเซิร์ฟเวอร์อาจสามารถขโมยเซสชันได้โดยรับรายชื่อไฟล์ในไดเรกทอรีนั้น"


ขออภัยฉันคิดว่าฉันยังไม่ชัดเจน: session.save_path ตั้งค่าเป็น / var / lib / php / session แล้ว ปัญหาคือฉันไม่สามารถระบุได้ว่าสิทธิ์และความเป็นเจ้าของในการกำหนดให้กับไดเรกทอรีเซสชันพา ธ เพื่อให้ทั้ง PHP-FPM สามารถใช้เขียนและเก็บไว้อย่างปลอดภัย มีชุดไดเรกทอรีเป็นเจ้าของ / กลุ่ม "Nginx" (ที่เว็บเซิร์ฟเวอร์ของฉันทำงาน) และสิทธิ์ 755 ดูเหมือนจะไม่ทำเคล็ดลับ
ศาสตราจารย์ Frink

4
1. ใช้ผู้ใช้เดียวกัน: กลุ่มสำหรับ nginx และ php-fpm (ผ่านอย่างใดอย่างหนึ่งnginx.confหรือphp-fpm.conf), เพื่อให้คุณสามารถเก็บไดเรกทอรีนี้ 700 2. ใช้chown -R nginx:nobody /var/lib/php/session && chmod -R 770 /var/lib/php/sessionดังนั้นฉันคิดว่าทั้ง nginx และ php-fpm สามารถใช้งานได้
SaveTheRbtz

2
ฉันสามารถยืนยันได้ว่าการใช้ nginx: none (หรือ nginx: nogroup ในบางสถานการณ์) ใช้งานได้ ถ้าเป็นไปได้ฉันจะพึ่งพาตัวเลือก SaveTheRbtz '1
Michael Johnson

3

ฉันต้องสร้างโฟลเดอร์ที่มีสิทธิ์ 0700 ใน / var / lib / php / เซสชันสำหรับแต่ละพูล php-fpm

เจ้าของโฟลเดอร์นี้คือผู้ใช้และกลุ่มจากกลุ่ม php-fpm

และ / var / lib / php / session ทันที 0777

ฉันคิดว่าวิธีนี้ปลอดภัยที่สุด ผู้ใช้พูล php-fpm เท่านั้นที่จะเห็นเซสชันนี้


1

ฉันมีปัญหาเดียวกันและฉันแก้ไขมัน ฉันไปที่/tmp(นั่นคือที่ไฟล์ ses_ * ของฉัน) และลบทั้งหมด หลังจากนั้นทุกอย่างก็โอเค

อย่างที่ฉันบอกได้ว่าระบบกำลังพยายามเขียนไฟล์ที่ถูกล็อคเก่า

php.iniปัญหาที่เกิดขึ้นหลังจากที่ผมกำลังเล่นกับ ฉันเสียชีวิตไปสองสามปี แต่ในที่สุดฉันก็พบทางออก


1

วิธีที่ถูกต้องควรเปลี่ยนความเป็นเจ้าของโฟลเดอร์เซสชั่นเป็น nginx อย่างไรก็ตาม PHP-FPM ไม่ได้ทำงานโดยใช้ผู้ใช้ nginx โดยค่าเริ่มต้น มันใช้ Apache เป็นค่าเริ่มต้น

กับที่กล่าวว่าคุณต้องเปลี่ยนผู้ใช้ที่ใช้งานโดย PHP-FPM /etc/php-fpm.d/www.confโดยการแก้ไข

; 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 Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

รีสตาร์ท PHP-FPM และคุณน่าจะดี

service php-fpm restart


PHP ตั้งเส้นทางเซสชั่นสามารถพบได้ในภายใต้/etc/php.ini เป็นค่าเริ่มต้นsession.save_path/var/lib/php/session

คำสั่งเพื่ออัพเดทความเป็นเจ้าของและกลุ่มของโฟลเดอร์เซสชั่น php

chown -R nginx:nginx /var/lib/php/session

และคุณควรจะดีไปแม้จะมีการ chmod 700ของ


1

ไดเรกทอรี / var / lib / php / เซสชันควรมีสิทธิ์บิตเหนียว

sudo chmod 1773 /var/lib/php/sessions

ls -al /var/lib/php/
drwxr-xr-x  4 root root   .
drwxr-xr-x 51 root root   ..
drwxr-xr-x  3 root root   modules
drwx-wx-wt  2 root root   sessions

0

ตามคำตอบของ@ Judderเพื่อให้ทำงานได้ฉันต้องเพิ่มคำสั่งต่อไปนี้เพื่อให้สิทธิ์ในการอ่านและเขียนแก่ใครและnogroup :

chown -R nobody:nogroup /var/lib/php/session

sudo chmod -R ug+rw /var/lib/php/sessions

chmodจะเปลี่ยนการอนุญาตในโฟลเดอร์ที่กำหนด -
Rจะใช้สิทธิ์เดียวกันกับโฟลเดอร์และไฟล์ที่สร้างขึ้น ภายในกำหนดโฟลเดอร์
Uสำหรับผู้ใช้
กรัมสำหรับกลุ่ม
Rอนุญาตอ่าน
Wสำหรับเขียนได้รับอนุญาต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.