Как запустить bash скрипт из Nginx - PullRequest
2 голосов
/ 19 марта 2020

1) У меня есть stati c сайт и палочка, чтобы установить "autopull" из bitbucket.

2) У меня есть webhook из bitbucket.

3) У меня есть bash скрипт которые делают "git pull"

Как мне запустить этот скрипт, когда nginx перехватить запрос?

server {

    listen   80;
    server_name example.ru;

    root /path/to/root;
    index index.html;

    access_log /path/to/logs/nginx-access.log;
    error_log /path/to/logs/nginx-error.log;

    location /autopull {
        something to run autopull.sh;
    }

    location / {
        auth_basic "Hello, login please";
        auth_basic_user_file /path/to/htpasswd;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header Host $host;
    }
}

Я пробовал службы lua_block и fastcgi, но оба не удаются. lua не запускает os.execute ("/ path / to / script") и не записывает журнал. fastcgi более успешен, но у него нет разрешений, потому что мой www-data пользователь не имеет ключа s sh в моем репозитории bitbuchet.

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

На основе this , создайте скрипт py

#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
from subprocess import call

PORT_NUMBER = 8080
autopull = '/path/to/autopull.sh'
command = [autopull]

#This class will handles any incoming request from
#the browser 
class myHandler(BaseHTTPRequestHandler):

    #Handler for the GET requests
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type','text/html')
        self.end_headers()
        # Send the html message
        self.wfile.write("runing {}".format(autopull))
        call(command)
        return

try:
    #Create a web server and define the handler to manage the
    #incoming request
    server = HTTPServer(('', PORT_NUMBER), myHandler)
    print 'Started httpserver on port ' , PORT_NUMBER

    #Wait forever for incoming htto requests
    server.serve_forever()

except KeyboardInterrupt:
    print '^C received, shutting down the web server'
    server.socket.close()

Запустите его и в nginx config добавьте

location /autopull { proxy_pass http://localhost:8080; }
1 голос
/ 20 марта 2020

Проблема решена.

Я не хотел использовать какой-либо сценарий / процесс на другом порту, потому что у меня есть несколько сайтов и мне нужен порт для каждого.

Моя окончательная конфигурация:

server {

    listen   80;
    server_name example.ru;

    root /path/to/project;
    index index.html;

    access_log /path/to/logs/nginx-access.log;
    error_log /path/to/logs/nginx-error.log;

    location /autopull {
        content_by_lua_block {
            io.popen("bash /path/to/autopull.sh")
        }
    }

    location / {
        auth_basic "Hello, login please";
        auth_basic_user_file /path/to/htpasswd;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header Host $host;
    }
}

Проблема была в разрешении www-data пользователя и его s sh -кей в репо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...