2012-02-13 33 views
8

Tôi đang triển khai một ứng dụng django với gunicorn phía sau nginx trên centos 5. Làm cách nào để chạy gunicorn với tư cách người dùng không phải root? Không có tài liệu nào dường như giải quyết vấn đề này. Điều này có lẽ áp dụng cho bất kỳ máy chủ ứng dụng python chạy phía sau nginx cũng ...Làm thế nào để chạy gunicorn/một máy chủ ứng dụng python như một người dùng không phải root?

tôi nên thêm rằng đây không làm việc:

sudo -u nobody gunicorn_django --workers=4 

Nó không thành công với:

raise HaltServer(reason, self.WORKER_BOOT_ERROR) 
    gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3> 

trả lời :

Lỗi của tôi. Tôi đã có tệp settings.py tùy chỉnh nên đã gọi gunicorn bằng:

sudo -u nobody gunicorn_django --workers=4 production_settings.py 
+0

Bạn có chắc đó là lệnh không? Bạn có chắc là bạn có thể thêm '-u nobody' vào đầu lệnh gunicorn_django không? Điều này dường như không hiệu quả với tôi. – Mark

+0

@Mark Chúng đang thêm '-u nobody' vào cuối lệnh' sudo' chứ không phải lệnh bắt đầu của lệnh 'gunicorn_django'. 'sudo -u' cho phép bạn chọn một người dùng khác với root để chạy lệnh sau. – BHSPitMonkey

Trả lời

2

Tôi khuyên bạn nên sử dụng supervisord. Người giám sát bắt đầu ứng dụng của bạn trong tài khoản người dùng mà bạn cho biết khi khởi động.

Dưới đây là my_app.conf của tôi mà tôi đặt dưới /etc/supervisor/conf.d/:

[program:my_app] 
command=/home/some_user/my_app/run_gunicorn 
directory=/home/some_user/my_app 
user=some_user     
redirect_stderr=true    
stdout_logfile=/home/some_user/supervisord_stdout.txt 
stdout_logfile_maxbytes=20MB 
stdout_logfile_backups=10 

kịch bản run_gunicorn của tôi là sau đó:

#!/bin/bash 
source /home/some_user/virtualenvs/my_app_virtualenv/bin/activate 
exec /home/some_user/virtualenvs/my_app_virtualenv/bin/gunicorn -c gunicorn.conf wsgi:application 

tôi có thể tham khảo trực tiếp trong gunicorn my_app .conf, nhưng tôi không phải vì cách này tôi có thể chạy kích hoạt. Tôi đặt DJANGO_SECRET của tôi ở cuối đuôi của tập lệnh kích hoạt của tôi dưới dạng env var. Nó cũng tốt để làm điều đó với các khóa API và các công cụ nhạy cảm khác không thuộc về Git hoặc Mercurial.

gunicorn.conf của tôi là:

backlog = 2048 
bind = "127.0.0.1:9000" 
pidfile = "/home/some_user/gunicorn-my_app.pid" 
daemon = False 
debug = False 
workers = 3 
logfile = "/home/some_user/gunicorn-my_app.log" 
loglevel = "info" 
timeout = 90 

Trên thực tế Tôi chắc rằng có thể được cải thiện, nhưng họ nhận được ứng dụng đang chạy của tôi mà không bị gốc. Giám sát đảm bảo máy chủ ứng dụng vẫn chạy. Sau đó tôi chỉ nginx tại máy chủ ứng dụng của tôi thông qua proxy_pass (có thể chia sẻ điều đó nếu cần).

CHỈNH SỬA: làm rõ tên tệp

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