2016-02-15 20 views
5

Tôi đã thấy rất nhiều câu hỏi về SO về chủ đề này và tôi đã thử nhiều phương pháp nhất có thể nhưng vẫn chưa giải quyết được vấn đề cho tôi vì vậy tôi hy vọng bài đăng này có thể hữu ích.Nginx + uWsgi + Django 'Quyền bị từ chối trong khi kết nối tới thượng nguồn' (socket)

Tôi đang theo hướng dẫn từ trang web này để thiết lập Django trên Nginx wtih uWSGI: http://www.oliverelliott.org/article/computing/tut_setup_nginx_django/

uwsgi.ini tập tin

[uwsgi] 
chdir=/home/ec2-user/project/awssite 
module=awssite.wsgi 
home=/home/ec2-user/project 
master=true 
processes=2 
socket=/home/ec2-user/project/awssite/awssite.socket 
chmod-socket=666 
vacuum=true 

etc/nginx/sites-enabled/awssite_nginx.conf

upstream django { 
    server unix:///home/ec2-user/project/awssite/awssite.socket; 
} 
server { 
listen   8080; 
    server_name  localhost; 
    charset utf-8; 

    #max upload size 
    client_max_body_size 75M; 

    #Django media 
    location /media { 
      alias /home/ec2-user/project/awssite/awssite/media; 
    } 

    location /static { 
      alias /home/ec2-user/project/awssite/awssite/static; 
    } 

    location /favicon.ico { 
      log_not_found off; 
    } 

    location/{ 
      uwsgi_pass django; 
      include /home/ec2-user/project/awssite/uwsgi_params; 
    } 
} 

Đây là mã lỗi trong /var/log/nginx/error.log

2016/02/15 01:21:22 [crit] 22159#0: *3 connect() to unix:///home/ec2-user/project/awssite/awssite.socket failed (13: Permission denied) while connecting to upstream, client: CLIENT_IP, server: localhost, request: "GET /menu/ HTTP/1.1", upstream: "uwsgi://unix:///home/ec2-user/project/awssite/awssite.socket:", host: "HOST_IP:8080" 

Lưu ý: CLIENT_IP & HOST_IP là giá trị địa chỉ IP.

Đây là những gì tôi đã cố gắng và không làm việc:
1. chmod 755 thư mục home và chạy uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=666

2. Thêm người dùng nginx vào nhóm người dùng của tôi và chạy uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664

3. Thay đổi tệp ini bằng cách thêm các dòng mới này
chown-socket=ec2-user:nginx uid=nginx gid=nginx và sau đó chạy ing uwsgi --ini uwsgi.ini này trả về với 'Permission denied cho chown' nhưng khi tôi chạy lệnh với sudo, tôi nhận được sudo: uwsgi: command not found (uWSGI được cài đặt toàn hệ thống)

4. Đặt tất cả các file trong một thư mục khác nhau (bên ngoài về thành viên ec2-user) nhưng điều đó không cho phép tôi để truy cập chúng trừ khi tôi chạy như root và thậm chí sau đó nó không hoạt động

5. chạy uwsgi --socket awssite.socket --module awssite.wsgi --chmod-socket=664/666 với các thông số --uid nginx--gid nginx--chown-socket=nginx:nginx Lưu ý: 664/666 nghĩa tôi đã cố gắng cả quyền

6. Đổi tên nginx. tệp conf.default và nginx.conf.rpmnew (vì vậy rằng tệp conf duy nhất cho nginx đọc là nginx.conf)

Ai đó có thể làm sáng tỏ một số cách tôi có thể giải quyết vấn đề này? Tôi sẽ tiếp tục thêm vào các phương pháp mà tôi đã thử và không làm việc về câu hỏi này trong khi tôi làm việc trên nó. Cảm ơn :)

EDIT: Cảm ơn câu trả lời @GwynBleidD, cuối cùng tôi đã làm việc đó. Đây là những gì hoạt động:

giữ file socket của tôi trong /tmp
etc/nginx/sites-enabled/awssite_nginx.conf

upstream django { 
    server unix:///tmp/djangosocket/awssite.socket; 
} 
.... 

uwsgi.ini tập tin

[uwsgi] 
chdir=/home/ec2-user/project/awssite 
module=awssite.wsgi 
home=/home/ec2-user/project 
master=true 
processes=2 
socket=/tmp/djangosocket/awssite.socket 
chmod-socket=666 
vacuum=true 

tôi đã thêm tôi ec2-user (đăng nhập người dùng) vào nhóm nginx.
Tôi đã thay đổi các điều khoản tập tin phù hợp
chown -R ec2-user:nginx djangosocket
chmod g+rwx djangosocket

+0

Bạn có thể thử thay đổi chdir thành 'chdir =/home/ec2-user/project' không? – Selcuk

+0

@ Selcuk không có tác dụng. với sự hiểu biết của tôi, 'chdir' là đường dẫn đến ứng dụng trong dự án chứ không phải bản thân dự án. –

+0

Tôi luôn luôn chdir đến thư mục dự án nhưng tôi không bao gồm các đối số nhà. – Selcuk

Trả lời

6

Nếu máy chủ nginx của bạn không thể truy cập uWSGI ổ cắm, hãy cố gắng thực hiện các bước sau:

  1. không đặt chìm bạn trong nhà thư mục của bất kỳ người dùng nào trong hệ thống của bạn, đặc biệt là thư mục gốc! Một số hệ điều hành Unix được chặn theo mặc định truy cập vào thư mục chính cho bất kỳ ai ngoại trừ chủ sở hữu của thư mục đó và thư mục gốc. Thêm người dùng nginx vào nhóm riêng của người dùng đó (đối với hầu hết các hệ thống, mỗi người dùng có nhóm chính, riêng của nó) có thể trợ giúp điều đó, nhưng nó hầu như không bao giờ làm việc cho root.

  2. kiểm tra xem người dùng và nhóm máy chủ nginx của bạn (hoặc bất kỳ máy chủ http nào khác mà bạn đang sử dụng) chạy. Đôi khi là www-data, đôi khi là nginx, đôi khi có điều gì đó khác. Khi tạo socket, hãy chắc chắn rằng tên người dùng sẽ khớp với tên người dùng mà máy chủ uWSGI chạy và nhóm tên phù hợp với nhóm trên uWSGI chạy (hoặc bạn có thể hoán đổi nó).

  3. Kiểm tra xem các quyền của socket của bạn có ít nhất 660. Không cần phải cấp quyền cho bất kỳ ai, do đó, đừng làm điều đó.

  4. Kiểm tra xem cả nginx và uWSGI của bạn có quyền truy cập thư mục trên ổ cắm nào được đặt và tất cả thư mục mẹ hay không.

Vị trí tốt cho tệp ổ cắm của bạn là /var/run thư mục (đối với một số hệ thống là /run hoặc cả hai). Nó thường được gắn kết là ramdisk (tmpfs) và nó có thể ghi được cho bất kỳ ai trong hệ thống, vì vậy mọi người dùng đều có thể tạo các ổ cắm ở đây (và truy cập chúng). Nếu vì lý do nào đó không thể truy cập được trong hệ thống của bạn, bạn cũng có thể thử thư mục /tmp.

Nếu bạn cũng đang phục vụ tệp tĩnh trực tiếp từ nginx từ thư mục chính của mình, hãy cân nhắc thêm nginx vào nhóm cá nhân của bạn, vì vậy nó sẽ có quyền truy cập đọc vào thư mục chính và tệp tĩnh của bạn.

+0

Nó hoạt động! Thư mục '/ var/run' không may là không cho phép ghi, nhưng đặt socket trong'/tmp' đã hoạt động. Tôi cũng phải thêm người dùng 'nginx' vào nhóm người dùng' ec2-user' của mình để nó có thể truy cập vào thư mục mà socket được đặt. Câu hỏi nhanh: có cách nào tôi có thể nhận được điều này để làm việc mà không có 'nginx' trong usergroup của tôi' ec2-user'? (chỉ cần nginx sẽ không có quyền truy cập vào tất cả các tệp và thư mục khác mà 'ec2-user' có quyền truy cập) –

+1

Có, nhưng bạn phải tạo thư mục và tệp ổ cắm, vì vậy người dùng hoặc nhóm sẽ khớp với nginx. – GwynBleidD

+0

Tôi đã thêm người dùng 'ec2-user' vào nhóm' nginx'.và tôi đã chạy 'chown -R nginx: nginx/tmp/testfolder' và tôi đã thêm dòng này vào tập tin uwsgi.ini' sudo chown-socket = nginx: nginx'. đây là lỗi tôi đang nhận được. 'lỗi loại bỏ unix socket, unlink(): Quyền bị từ chối [core/socket.c line 198] bind(): Quyền bị từ chối [core/socket.c line 230]' (Tôi nhận được điều này khi tôi cố gắng chạy ' uwsgi --ini uwsgi.ini') bất kỳ ý tưởng? –

Các vấn đề liên quan