Deployment passanger + ngnx

Napisałem żonie prostą stronkę, chciałem przed dokończeniem jej wrzucić ją na serwer ale napotykam same problemy. Jak w końcu lokalnie udało mi się odpalić serwer w trybie produkcyjnym, to za chiny ludowe nie wiem dlaczego nie mogę na serwerze na digitalocean.

Tak jak ręczny deployment Django to jest sprawa balanalna, tak z railsami nie mogę sobie poradzić. Te co sobie stoi w django jest odpalane przez gunicorna.

Kod jest tu: https://github.com/sztosz/iza

server {
    listen 80;
    server_name iza.sztosz.tk;
    passenger_enabled on;
    rails_env    production;
    root         /_dev/www/iza/public;
    access_log /_dev/logs/iza/ngnix.access.log;
    error_log /_dev/logs/iza/ngnix.error.log info;
    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }
}

To jest część z configu nginx

We're sorry, but something went wrong.
We've been notified about this issue and we'll take a look at it shortly.

A to komunikat który dostaję i zupełnie nie ma nic w logach. Gdzie jest błąd?

Na pewno nie ma nic w logach aplikacji /_dev/www/iza/log/production.log?

Nawet nie ma takiego pliku, a w developement.log jest tylko ślad po moim rake db:migrate i tyle.

a user na którym “chodzi” nginx ma prawa zapisu do /_dev/www/iza/log ?

Tu masz przykładowy konfig nginx “generalny”

a tu dla poszczególnych stron

podmieniasz %domain na nazwę domeny ooczywiście. np poprzez ruby -n -e 'puts $_.gsub(/%domain/, "domena.pl")' < rails > site-domena.pl

Upewnij się że uzytkownik www ma prawa do aplikacji - lub zmień użytkownika z www na innego.

a patrzyles w production.log zamiast development.log?

Wszystko chodzi na końcie root’a. Nie ma tam nic ważnego i serwer jest tylko do developerki, testowania, zabawy i nauki. A production.log to w ogóle nie ma takiego pliku. Posprawdzam configi nginx jak tylko dziecko nakarmię i mi zaśnie.

Ok, sprawdz jeszcze w domyslnych logach nginx-a, /opt/nginx/logs/error.log (/opt moze byc inne, zalezy gdzie masz nginxka) - nginx (rails) jak nie ma dostepu do zdefiniowanych logow to tam wrzuca

Przy okazji sprawdz czy masz ustawiony secret_key_base dla production w pliku config/secrets.yml <- to jest jedna z rzeczy, ktora wywala na produkcji domyslny projekt, gdy nie jest skonfigurowana.

Tam nie szukałem logów, ale w końcu znalazłem przyczynę

[ 2014-08-31 10:43:59.0325 410/b6364b70 agents/HelperAgent/RequestHandler.h:2306 ]: [Client 20] Cannot checkout        session because a spawning error occurred. The identifier of the error is d2e27870. Please see earlier logs for details  about the error.
App 1248 stdout: 
App 1248 stderr: *** ERROR ***: Cannot execute /root/.rbenv/versions/2.1.2/bin/ruby: Permission denied (13)
[ 2014-08-31 10:44:01.0465 410/b5b22b70 Pool2/Implementation.cpp:287 ]: Could not spawn process for application     /_dev/www/iza: An error occurred while starting up the preloader. It exited before signalling successful startup back to     Phusion Passenger.
  Error ID: 100d8dd6
  Error details saved to: /tmp/passenger-error-U01BCw.html
  Message from application: An error occurred while starting up the preloader. It exited before signalling successful     startup back to Phusion Passenger. Please read <a href="https://github.com/phusion/passenger/wiki/Debugging-    application-startup-problems">this article</a> for more information about this problem.<br>
<h2>Raw process output:</h2>
<pre>
*** ERROR ***: Cannot execute /root/.rbenv/versions/2.1.2/bin/ruby: Permission denied (13)
</pre>

[ 2014-08-31 10:44:01.0524 410/b6364b70 agents/HelperAgent/RequestHandler.h:2306 ]: [Client 20] Cannot checkout     session because a spawning error occurred. The identifier of the error is 100d8dd6. Please see earlier logs for details     about the error.

Tylko teraz nie wiem dlaczego, bo /root/.rbenv/versions/2.1.2/bin/ruby istnieje i ma się dobrze, wszystko odpalam z roota więc dostęp powinien być…

Z resztą ps -aux:

root       407  0.0  0.3   5036  1744 ?        Ssl  08:39   0:00 PassengerWatchdog
root       410  0.0  0.6  31936  3100 ?        Sl   08:39   0:00 PassengerHelperAgent
nobody     415  0.0  0.6  12172  3348 ?        Sl   08:39   0:00 PassengerLoggingAgent
root       425  0.0  0.1   7792   960 ?        Ss   08:39   0:00 nginx: master process /usr/sbin/nginx
root       426  0.0  0.2   7940  1440 ?        S    08:39   0:00 nginx: worker process
root       427  0.0  0.2   7940  1440 ?        S    08:39   0:00 nginx: worker process
root       428  0.0  0.3   7940  1928 ?        S    08:39   0:00 nginx: worker process
root       429  0.0  0.2   7940  1440 ?        S    08:39   0:00 nginx: worker process

Jak widać wyraźnie process passengera nie ma uprawnień.

App 1248 stderr: *** ERROR ***: Cannot execute /root/.rbenv/versions/2.1.2/bin/ruby: Permission denied (13)

Generalnie proces nginx zwykle NIE działa z uprawnieniami roota, po starcie zmienia użytkownika na tego zdefiniowanego w nginx,conf. Sprawdź jaki tam jest uzytkownik i nadaj mu uprawnienia do plików.
Z tego co pamiętam nginx po prostu nie wystartuje jak spróbujesz ustawić uzytkownika na root

W ogóle uruchamianie czegokolwiek z prawami roota jest złym pomysłem. Nawet jeżeli to maszyna deweloperska to jak się ktoś do niej dostanie możesz zapłacić drogo za DDoSa którego z niej wyprowadzi ci ktoś. Znam osobiście jeden przypadek gdzie gość zapłacił 2000 dolarów prawie za transfer, więc nawet jak deweloperska maszyna do testów to nie stawiaj NIGDY nic na konice root, ucz się dobrych praktyk.

Pewnie masz rację, właśnie stawiam nową maszynę, instaluję wszystko po kolei i zobaczę czy się uda. Digitalocean ma tak rewelacyjne usługi i ceny że to pewnie będzie mniejszym kłopotem będzie wszystko przerzucić niż próbować naprawiać.

Prawdopodobnie to było to o czym pisał @swistak84 nowy serwer, wszystko odpalane z dedykowanego konta… nie roota i działa bez problemu :slight_smile:

Dziękuję za pomoc :smiley: