PHP FPM ให้สิทธิ์ปฏิเสธหรือไม่


9

ฉันอ่านหลายรายการว่าทำไม PHP-FPM อาจให้สิทธิ์ฉันถูกปฏิเสธ แต่ฉันไม่สามารถแก้ไขได้

บันทึกข้อผิดพลาดอ่านเช่น:

    2013/04/20 23:33:28 [crit] 15479#0: *6 open() "/var/lib/nginx/tmp/fastcgi
/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 
99.999.999.999, server: example.net, request: "GET /wp-admin/ HTTP/1.1", 
upstream: "fastcgi://unix:/tmp/php-fpm.sock:", host: "example.net", referrer:    
"http://example.net/"

ฉันเล็กน้อย แต่แพ้:

  1. ฉันได้ตั้ง / var / lib / nginx / tmp เป็นผู้ใช้ ec2 (ฉัน +777 ทุกอย่างเพื่อตรวจสอบ)
  2. ฉันได้ตั้งค่า /tmp/php-fpm.sock เป็นผู้ใช้ ec2
  3. ไฟล์ nginx conf ถูกตั้งค่าเป็น ec2-user
  4. php-conf ถูกตั้งค่าเป็นผู้ใช้และกลุ่ม ec2-user
  5. ps aux ให้ผู้ใช้ ec2 ในกระบวนการ php-fpm และ nginx ทั้งหมด

การกำหนดค่า Nginx ของฉันมีไฟล์จำนวนมากสิ่งที่เป็นพื้นฐานคือ

user              ec2-user ec2-user;
worker_processes  5;  
error_log /opt/nginx/error.log;    
pid        /var/run/nginx.pid;    
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /opt/nginx/access.log main;    
    sendfile        on;
    keepalive_timeout  65;
    client_max_body_size 13m;
    index index.php index.html index.htm;
    upstream php {
       server unix:/tmp/php-fpm.sock;
    }
    include /etc/nginx/conf.d/*.conf;
    include /mnt/web/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d/ ของฉันว่างเปล่า /mnt/web/nginx/conf.d ของฉันมีการกำหนดค่าเว็บไซต์จำนวนมากซึ่งทั้งหมดรวมถึง "wordpress.conf":

location / {
    try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 24h;
    log_not_found off;
}
location ~ \.php$ {
    try_files $uri =404;    
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php;
}

/opt/php/etc/php-fpm.conf ของฉัน:

include=/opt/php/etc/fpm.d/*.conf
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-fpm.sock
user = ec2-user
group = ec2-user
pm = dynamic
pm.max_children = 250
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
pm.status_path = /fpm-status
ping.path = /fpm-ping
slowlog = log/$pool.log.slow
catch_workers_output = yes

ปรับปรุง: พบปัญหาใส่ไว้ในคำตอบ


1
selinux เปิดใช้งานหรือไม่ เรียกใช้ getenforce หรือ cat / selinux / enforce หากไม่ได้เปิดใช้งาน 0
silviud

1
การกำหนดค่า nginx ที่เหลือของคุณคืออะไร
Michael Hampton

1
ซ็อกเก็ตของคุณจากล็อกไฟล์คือ /tmp/php-fpm.sock แต่คุณเปลี่ยน / var / lib / nginx / tmp - คุณทำ chroot ใน nginx หรือไม่?
silviud

1
ส่งเอาต์พุตจากคำสั่ง mount
silviud

1
ดูว่าไดเรกทอรีทั้งหมดในบ้านของคุณ ... ดูserverfault.com/questions/170192/…
silviud

คำตอบ:


16

ฉันได้ตั้งค่า / var / lib / nginx / tmpเป็น ec2-user / ec2-user (ฉันถึง +777 ทุกอย่างเพื่อตรวจสอบ)

แต่ ... ฉันต้องตั้งค่า / var / lib / nginxเป็น ec2-user / ec2-user

... หลังจาก chown / chgrp แล้วโฟลเดอร์ nginx หลัก: ไม่มีข้อผิดพลาดอีกต่อไป

เอาฉันชั่วโมง ...


7
chown -Rf www-data:www-data /var/lib/nginxทำงานให้ฉัน ไม่จำเป็นต้องเปลี่ยนอะไรเลย
Chris

การตรวจสอบไฟล์บันทึกช่วยเสมออย่าลืมตรวจสอบพวกเขาก่อนที่อะไร :)
ความเศร้าโศกบทกวี

9

สิ่งนี้มักเกิดขึ้น เมื่อการuserตั้งค่าใน nginx.conf เปลี่ยนจาก

user nginx;

เพื่อสิ่งอื่น ในกรณีนี้,

user ec2-user ec2-user;

คำสั่ง chmod ไม่จำเป็นสำหรับความคิดเห็นของ Chris และสามารถเปิดรูโหว่ได้

สารละลาย:

ตรวจสอบความเป็นเจ้าของผู้ใช้และกลุ่มปัจจุบันบน / var / lib / nginx

$ ls -ld /var/lib/nginx
drwx------ 3 nginx nginx 4096 Aug  5 00:05 /var/lib/nginx

สิ่งนี้จะบอกคุณว่าอาจมีผู้ใช้และกลุ่มที่ไม่มีชื่อที่nginxเป็นเจ้าของโฟลเดอร์นี้ นี่เป็นการป้องกันการอัพโหลดไฟล์

เปลี่ยนความเป็นเจ้าของโฟลเดอร์เป็นผู้ใช้ที่กำหนดใน nginx.conf ในกรณีนี้ec2-user(ไม่จำเป็นต้องใช้ sudo)

$ sudo chown -Rf ec2-user:ec2-user /var/lib/nginx

ตรวจสอบว่ามีการเปลี่ยนแปลงจริง

$ ls -ld /var/lib/nginx
drwx------ 3 ec2-user ec2-user 4096 Aug  5 00:05 /var/lib/nginx

ข้อผิดพลาดที่ได้รับอนุญาตถูกปฏิเสธควรหายไป ตรวจสอบ error.log (อิงตามตำแหน่ง nginx.conf error_log)

$ sudo nano /opt/nginx/error.log

หากไม่ได้ผลคุณอาจต้องโหลด nginx และ php-fpm อีกครั้ง

$ sudo service nginx reload
$ sudo service php-fpm reload

นั่นคือเคล็ดลับในเซิร์ฟเวอร์ google cloud Centos 7 ของฉัน
Damodar Bashyal

3

ไม่มีวิธีแก้ปัญหาอื่นที่ใช้งานได้สำหรับฉัน แต่ฉันพบว่าวิธีนี้ใช้ได้ผล:

$ apt-get install php-pear php5-dev
$ pecl install timezonedb
$ echo 'extension=timezonedb.so'> /etc/php5/mods-available/timezonedb.ini
$ ln -sf /etc/php5/mods-available/timezonedb.ini /etc/php5/conf.d/30-timezonedb.ini
$ service php5-fpm restart

แหล่ง


ตกลงเราลองวิธีแก้ปัญหาหลายวิธีและนี่คือวิธีที่ใช้งานได้ เราไม่รู้ว่าทำไมมันถึงทำงานได้หรือปัญหามันเกิดขึ้นจริง แต่มันก็เป็นเช่นนั้น
Neil Masters

1

ฉันมีปัญหาคล้ายกันกับการอัปโหลดไฟล์ ข้อผิดพลาด nginx 500 2015/07/05 03:50:36 [crit] 3656#0: *7 open() "/var/lib/nginx/tmp/client_body/0000000007" failed (13: Permission denied), client: 10.0.2.2, server: www.test.com, request: "POST /api/v1/users HTTP/1.1", host: "test"

ปัญหาเกี่ยวข้องกับการอนุญาตเท่านั้นฉันเพิ่งตั้งค่าchmod -R 755 /var/lib/nginxและทำงานได้ดี!


0

เพียงแก้ไขปัญหาของฉันด้วยสิทธิ์ วิธีที่ง่ายที่สุดและง่ายที่สุดคือการไม่เรียกใช้ php-fpm หรือ nginx เป็น sudo (ผู้ใช้ระดับสูง) สิ่งที่คุณต้องทำคือ:

  1. chown ตำแหน่งเอาต์พุตบันทึกทั้งหมดสำหรับ nginx ถึง yourUserName: yourUserName ตัวอย่าง :chown yourUserName:yourUserName /var/log/nginx/error.log
  2. เซิร์ฟเวอร์การอัพเดทครั้งต่อไปเป็นตัวอย่าง :chown yourUserName:yourUserName -R /var/www

หากไม่ใช้รูทฉันไม่จำเป็นต้องเปลี่ยนผู้ใช้หรือกลุ่ม php-fpm หรือผู้ใช้หรือกลุ่มที่รับฟัง ตรวจสอบให้แน่ใจว่าคุณแสดงความคิดเห็นด้วย nginx.conf 'user' เพราะจะเป็นชื่อผู้ใช้ปัจจุบัน


กรุณาอย่าโพสต์คำตอบเดียวกันหลายครั้ง นอกจากนี้ปัญหานี้ได้รับการแก้ไขมานานแล้ว
สเวน

0

แทนที่จะแก้ไขสิทธิ์บน / var / lib / nginx / อะไรก็ตามมันจะไม่มีเหตุผลที่จะบอก nginx ให้ใช้เส้นทางอื่นเช่น / tmp / nginx ใช่ไหม การแก้ไขปัญหาสำหรับฉัน:

# create the directory
mkdir /tmp/nginx
chown -R nginx.nginx /tmp/nginx (assumes nginx user is named nginx)
chmod -R 700 /tmp/nginx

/ tmp / nginx ควรมีสิทธิ์ 700 ควร (ซึ่งไม่ควรมีปัญหาตราบใดที่เจ้าของเป็นผู้ใช้เดียวกันกับที่ระบุใน /etc/nginx/nginx.conf คำสั่ง 'user') หรือ 770 ด้วยเหตุผลบางอย่างที่คุณต้องการ มีเจ้าของไฟล์ที่แตกต่างกันและ nginx เพื่อดำเนินการ i / o ผ่านสิทธิ์ของกลุ่ม ไม่เคยเห็นมาก่อน แต่ใครจะรู้

บน centos7 ให้แก้ไข /etc/nginx/nginx.conf เพื่อบอก nginx ให้ใช้ไดเรกทอรีใหม่นั้นสำหรับไคลเอ็นต์เนื้อความ

...

http {
  ...
  client_body_temp_path /tmp/nginx 1 2;
  ...
}

และรีสตาร์ท nginx (อีกครั้ง centos7)

systemctl restart nginx

อย่าทำอะไรเลย 777 โดยเฉพาะอย่างยิ่งไม่แคช! ขณะนี้ผู้ใช้ในพื้นที่สามารถเขียนแคชของคุณใหม่และส่งข้อมูลที่อาจเป็นอันตรายไปยังผู้ใช้ของคุณ สำหรับการอัปโหลดบางคนสามารถแทนที่การอัปโหลดของตัวเองแทน
Michael Hampton

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