Nginx bị treo khi sử dụng dịch vụ của nginx


12

Tôi đã biên dịch nginx với các đường dẫn tùy chỉnh cho máy chủ sản xuất của mình và khi tôi cố gắng bắt đầu / khởi động lại dịch vụ bằng cách sử dụng:

service nginx start

hoặc là

service nginx restart

Nó đi vào một dòng mới mà không trả lại vỏ: Hình ảnh của thiết bị đầu cuối khi chạy lệnh

Vì vậy, vấn đề là tôi không thể kiểm soát nginx bằng servicelệnh. Dịch vụ thực sự chạy nhưng nó sẽ không trả lại vỏ cho tôi vì vậy tôi luôn phải nhấn ctrl+ cđể lấy lại.

Tôi cũng phải đề cập rằng nginx chỉ chạy tốt khi gọi nó bằng nginxlệnh riêng của nó và dừng hoặc tải lại dễ dàng bằng cách sử dụng nginx -s stop/reload.

Vấn đề này vẫn tồn tại systemctl start nginxkhi sử dụng , nhưng systemctl stop nginxhoạt động tốt.

Thông tin:

$ lsb_release -a
    Distributor ID: Ubuntu
    Description:    Ubuntu 15.10
    Release:    15.10
    Codename:   wily

$ uname -r
    4.2.0-27-generic

$ nginx -V
    nginx version: nginx/1.9.11
    built by gcc 5.2.1 20151010 (Ubuntu 5.2.1-22ubuntu2) 
    built with OpenSSL 1.0.2d 9 Jul 2015
    TLS SNI support enabled
    configure arguments: --sbin-path=/usr/bin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-debug --with-pcre --with-http_ssl_module

$ cat /etc/default/nginx
    NGINX_CONF_FILE=/etc/nginx/nginx.conf
    DAEMON=/usr/bin/nginx

$ cat /etc/init.d/nginx
    NGINX_BIN=/usr/bin/nginx
    test -x $NGINX_BIN || { echo "$NGINX_BIN not installed"; 
        if [ "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }
    NGINX_PID=/var/run/nginx.pid

    # Check for existence of needed config file and read it
    #NGINX_CONFIG=/etc/sysconfig/nginx
    #test -r $NGINX_CONFIG || { echo "$NGINX_CONFIG not existing";
    #   if [ "$1" = "stop" ]; then exit 0;
    #   else exit 6; fi; }
    #
    # Read config   
    #. $NGINX_CONFIG

    # Source LSB init functions
    # providing start_daemon, killproc, pidofproc, 
    # log_success_msg, log_failure_msg and log_warning_msg.
    # This is currently not used by UnitedLinux based distributions and
    # not needed for init scripts for UnitedLinux only. If it is used,
    # the functions from rc.status should not be sourced or used.
    #. /lib/lsb/init-functions

    # Shell functions sourced from /etc/rc.status:
    #      rc_check         check and set local and overall rc status
    #      rc_status        check and set local and overall rc status
    #      rc_status -v     be verbose in local rc status and clear it afterwards
    #      rc_status -v -r  ditto and clear both the local and overall rc status
    #      rc_status -s     display "skipped" and exit with status 3
    #      rc_status -u     display "unused" and exit with status 3
    #      rc_failed        set local and overall rc status to failed
    #      rc_failed <num>  set local and overall rc status to <num>
    #      rc_reset         clear both the local and overall rc status
    #      rc_exit          exit appropriate to overall rc status
    #      rc_active        checks whether a service is activated by symlinks
    . /etc/rc.status

    # Reset status of this service
    rc_reset

    # Return values acc. to LSB for all commands but status:
    # 0   - success
    # 1       - generic or unspecified error
    # 2       - invalid or excess argument(s)
    # 3       - unimplemented feature (e.g. "reload")
    # 4       - user had insufficient privileges
    # 5       - program is not installed
    # 6       - program is not configured
    # 7       - program is not running
    # 8--199  - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
    # 
    # Note that starting an already running service, stopping
    # or restarting a not-running service as well as the restart
    # with force-reload (in case signaling is not supported) are
    # considered a success.

    case "$1" in
        start)
        echo -n "Starting nginx "
        ## Start daemon with startproc(8). If this fails
        ## the return value is set appropriately by startproc.
        /sbin/startproc -p $NGINX_PID $NGINX_BIN

        # Remember status and be verbose
        rc_status -v
        ;;
        stop)
        echo -n "Shutting down nginx "
        ## Stop daemon with killproc(8) and if this fails
        ## killproc sets the return value according to LSB.

        /sbin/killproc -p $NGINX_PID -TERM $NGINX_BIN

        # Remember status and be verbose
        rc_status -v
        ;;
        try-restart|condrestart)
        ## Do a restart only if the service was active before.
        ## Note: try-restart is now part of LSB (as of 1.9).
        ## RH has a similar command named condrestart.
        if test "$1" = "condrestart"; then
            echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
        fi
        $0 status
        if test $? = 0; then
            $0 restart
        else
            rc_reset    # Not running is not a failure.
        fi
        # Remember status and be quiet
        rc_status
        ;;
        restart)
        ## Stop the service and regardless of whether it was
        ## running or not, start it again.
        $0 stop
        $0 start

        # Remember status and be quiet
        rc_status
        ;;
        force-reload)
        ## Signal the daemon to reload its config. Most daemons
        ## do this on signal 1 (SIGHUP).
        ## If it does not support it, restart the service if it
        ## is running.

        echo -n "Reload service nginx "
        ## if it supports it:
        /sbin/killproc -p $NGINX_PID -HUP $NGINX_BIN
        #touch /run/nginx.pid
        rc_status -v

        ## Otherwise:
        #$0 try-restart
        #rc_status
        ;;
        reload)
        ## Like force-reload, but if daemon does not support
        ## signaling, do nothing (!)

        # If it supports signaling:
        echo -n "Reload service nginx "
        /sbin/killproc -p $NGINX_PID -HUP $NGINX_BIN
        #touch /run/nginx.pid
        rc_status -v

        ## Otherwise if it does not support reload:
        #rc_failed 3
        #rc_status -v
        ;;
        reopen)
            echo -n "Reopen the logfiles "
            /sbin/killproc -p $NGINX_PID -USR1 $NGINX_BIN
            rc_status -v
            ;;

        status)
        echo -n "Checking for service nginx "
        ## Check status with checkproc(8), if process is running
        ## checkproc will return with exit status 0.

        # Return value is slightly different for the status command:
        # 0 - service up and running
        # 1 - service dead, but /run/  pid  file exists
        # 2 - service dead, but /var/lock/ lock file exists
        # 3 - service not running (unused)
        # 4 - service status unknown :-(
        # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)

        # NOTE: checkproc returns LSB compliant status values.
        /sbin/checkproc -p $NGINX_PID $NGINX_BIN
        # NOTE: rc_status knows that we called this init script with
        # "status" option and adapts its messages accordingly.
        rc_status -v
        ;;
        probe)
        ## Optional: Probe for the necessity of a reload, print out the
        ## argument to this init script which is required for a reload.
        ## Note: probe is not (yet) part of LSB (as of 1.9)

        test /etc/nginx/nginx.conf -nt /run/nginx.pid && echo reload
        ;;
        *)
        echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
        exit 1
        ;;
    esac
    rc_exit

CẬP NHẬT : Vấn đề cũng vẫn tồn tại trong khi sử dụng Docker container trên CoreOS alpha.

CẬP NHẬT 2 : Dưới đây là các đầu ra cho strace -o log -f service nginx startjournalctl -xe:

strace -o log -f service nginx start Đăng nhập đầu ra [quá dài để đăng ở đây]


    journalctl -xe
    Feb 26 07:25:38 lucifer polkitd(authority=local)[870]: Registered Authentication Agent for unix-process:8181:8813595 (system bus name :1.77 [/usr/bin/pkttyagent --notify-fd 5 --fallback], o
Feb 26 07:25:38 lucifer systemd[1]: Starting The NGINX HTTP and reverse proxy server...
-- Subject: Unit nginx.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit nginx.service has begun starting up.
Feb 26 07:25:38 lucifer nginx[8211]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Feb 26 07:25:38 lucifer nginx[8211]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Feb 26 07:25:38 lucifer systemd[1]: nginx.service: PID file /var/run/nginx.pid not readable (yet?) after start: No such file or directory
Feb 26 07:25:43 lucifer polkitd(authority=local)[870]: Unregistered Authentication Agent for unix-process:8181:8813595 (system bus name :1.77, object path /org/freedesktop/PolicyKit1/Authen

1
nginxđang hoạt động tốt khi tự mình bắt đầu từ một cli, bạn cần gỡ lỗi kịch bản dịch vụ của nó .
drookie

Cố gắng để giải quyết vấn đề. Nó sẽ cho bạn thấy hệ thống nào gọi là không thể hoàn thành. Chỉ cần cài đặt strace, sau đó strace -ff dịch vụ nginx bắt đầu.
lắng

@drookie @anx Tôi đã đăng kết quả journalctlstraceở đây nhưng thành thật mà nói tôi không biết làm thế nào để hiểu vấn đề từ đầu ra của strace. tôi sẽ đánh giá cao một chút giúp đỡ, nếu có thể.
T0M XeOn LuCiFeR

@ T0M XeOn LuCiFeR bạn đã khắc phục vấn đề này chưa?
Bhargav Patel

Có thể liên quan đến lỗi này: bug.launchpad.net/ubfox/+source/nginx/+orms/1581864
Elliott B

Câu trả lời:


9

Tôi gặp vấn đề tương tự với Ubuntu 16.04, systemd và NginX 1.10.1 từ nguồn.

Tôi đang sử dụng tệp nginx.service mặc định: https://www.nginx.com/resource/wiki/start/topics/examples/systemd/

Vấn đề là sự thay đổi nginx.pid, để sửa nó:

Đã kích hoạt Nginx mà không có dịch vụ

sudo nginx start

Đã cập nhật định vị db:

sudo updatedb

Tìm thấy vị trí của tệp pid

locate "nginx.pid"

Và cập nhật tệp nginx.service đến vị trí tôi tìm thấy

PIDFile=/usr/local/nginx/logs/nginx.pid

(Không biết tại sao nó được lưu trong thư mục nhật ký của tôi ...)

Sau đó chạy daemon-reload để tải lại tệp nginx.service

systemctl daemon-reload

Sau đó, "systemctl start nginx" hoạt động như một lá bùa. Hi vọng điêu nay co ich.


Đưa ra /usr/local/nginx/logs/nginx.pidlàm đường dẫn cho PIDFiletôi làm việc (sử dụng máy chủ Ubuntu 16.04.2 và nginx 1.12.1). Thx
youssman

Nó làm việc cho tôi. Khi xây dựng nginx từ nguồn tôi đã cấu hình nó với "--pid-path = / usr / local / nginx / nginx.pid". Khi tôi thiết lập nginx.service, tôi đã sử dụng sai đường dẫn và gây ra vấn đề tương tự. Khi sửa chữa, nó không gây ra treo và chấm dứt sau đó. Cảm ơn!
Geeth

3

Nó bị treo vì lỗi này:

PID file /var/run/nginx.pid not readable (yet?) after start

Các bản phân phối Linux mới hơn đi kèm với systemd . Nếu bạn sử dụng một dịch vụ đi kèm với bản phân phối của mình, bạn sẽ nhận được dịch vụ đã được cấu hình cho systemd.

Vì bạn đang biên dịch nginx từ các nguồn và bạn đang sử dụng tệp init SysV ( /etc/init.d/nginx ), systemd sẽ sử dụng một trình tạo để phân tích cú pháp ( systemd-sysv-Generator ).

Trong tập lệnh SysV của bạn, bạn xác định tệp pid và bắt đầu quá trình với:

NGINX_PID=/var/run/nginx.pid
...
/sbin/startproc -p $NGINX_PID $NGINX_BIN

Nếu tôi không sai, bạn đang sử dụng tập lệnh init SUSE Linux trên Ubuntu (vì lệnh startproc ), lệnh startproc đó chỉ đọc tệp pid (được chỉ định bởi tham số -p ), do đó, nó không tạo ra nó, do đó systemd không thể tìm thấy một tập tin pid và nó bị treo.

Trong trường hợp của bạn, giải pháp là tạo tệp pid trong tập lệnh init SysV của bạn (trên vị trí /var/run/nginx.pid ), sử dụng tập lệnh init SysV của Ubuntu hoặc tập lệnh systemd.

Điều này cũng có thể xảy ra (không phải những gì đang xảy ra với bạn) khi bạn có một tập lệnh init SysV chính xác tạo ra tệp pid, nhưng nó khác với tập lệnh được nhận xét ở đầu tệp. Trình tạo systemd đọc các bình luận, ví dụ như cái này:

# pidfile: /var/run/nginxd.pid

Và sử dụng pidfile được định nghĩa ở đó.

Thêm thông tin:


2

Nghe có vẻ như /usr/lib/systemd/system/nginx.servicelà dị hình. Đảm bảo dòng này được đặt:

PIDFile=/var/run/nginx.pid

Ngoài ra, bạn có thể sao chép [Service]phần vào một tập tin mới được gọi là /etc/systemd/system/nginx.service. Các tệp đơn vị được đặt trong /etc/systemd/systemcho phép bạn ghi đè các phần mà không cần sao chép toàn bộ tệp được cài đặt bởi trình quản lý gói.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.