systemd: nginx를 시작하기 전에 사용자 정의 쉘 스크립트 실행을 완료합니다.

systemd: nginx를 시작하기 전에 사용자 정의 쉘 스크립트 실행을 완료합니다.

Debian 9 stable을 사용하여 NGINX 프로세스와 해안벽 방화벽을 시작하기 전에 사용자 정의 셸 스크립트를 시작하고 싶습니다.

  • 초기화 작업 수행
  • /etcNGINX 구성, 해안벽 구성 및 오버레이 를 오버레이하기 위해 디렉터리(overlayfs)를 마운트합니다./etc/hosts
  • 스크립트도 로 끝납니다 sync. 좋은 생각인지 확실하지 않습니다.

systemctl 목록 종속성
default.target
● ├─display-manager.service
● ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
● ├─console-setup.service
● ├─cron.service
● ├ ─dbus.service
● ├─dropbear.service
● ├─myservice.service <-- 내 서비스(systemctl을 사용하여 생성된 링크 활성화)
● ├─networking.service
● ├─nginx.service <-- myservice
[ . ..]
● ├─basic.target
● │ ├─-.mount
● │ ├─myservice.service <-- 내 서비스(systemctl 활성화를 사용하여 생성된 링크)
● │ ├─shorewall.service <-- 내 서비스 수행 후

myservice.service 시도 1

[단위]
설명=내 시작 serviceRequires
=shorewall.service nginx.service
Before=shorewall.service nginx.service

[서비스]
RemainAfterExit=yes
ExecStart=/usr/local/bin/myservice start
ExecStop=/usr/local/bin /myservice 중지

[설치]
WantedBy=multi-user.target
WantedBy=basic.target

통나무:

Journalctl [...]
10월 12일 11:31:43 server-dev nginx[448]: nginx: /etc/nginx/sites-enabled/default의 업스트림 "server-dev.com"에 있는 [emerg] 호스트를 찾을 수 없습니다: 10월 12일 33
11:31:43 server-dev nginx[448]: nginx: 구성 파일 /etc/nginx/nginx.conf 테스트 실패 <== NGINX: BAD
10월 12일 11:31:43 server-dev systemd[1] : nginx.service: 제어 프로세스가 종료되었습니다. code=exited status=1
Oct 12 11:31:43 server-dev systemd[1]: 고성능 웹 서버 및 역방향 프록시 서버를 시작할 수 없습니다.
10월 12일 11:31:43 server-dev systemd[1]: nginx.service: 장치가 실패 상태로 전환되었습니다.
10월 12일 11:31:43 server-dev systemd[1]: nginx.service: '종료 코드'로 인해 실패했습니다.
Oct 12 11:31:43 server-dev systemd[1]: 대상 다중 사용자 시스템에 도달했습니다.
10월 12일 11:31:43 server-dev systemd[1]: 대상 그래픽 인터페이스에 도달했습니다.
10월 12일 11:31:43 server-dev systemd[1]: 시스템 실행 레벨 변경에 대한 UTMP 업데이트를 시작합니다...
10월 12일 11:31:43 server-dev systemd[1]: 런레벨 변경에 대한 시스템 UTMP 업데이트를 시작합니다.
10월 12일 11:31:43 server-dev server[423]: DO: 서버 시작됨 DONE <== 스크립트 종료 myservice
10월 12일 11:31:43 server-devshorewall[449]: Shorewall 5.0.15.6 컴파일 중.. < == SHOREWALL: 확인
10월 12일 11:31:44 server-devshorewall[449]: /etc/shorewall/shorewall.conf 처리 중...
10월 12일 11:31:44 server -devshorewall[449]: 모듈을 로드하는 중입니다. ..

myservice를 실행한 후 Shorewall 시스템이 올바르게 시작됩니다. Nginx는 myservice 실행 중에 적절하게 덮어쓰기(덮어쓰기?)되기 전에 대부분 시작되므로 /etc제대로 초기화되지 않습니다.

myservice.service 2번 시도

나도 바꿔보려고 했는데

[설치]
WantedBy=default.target

그리고 변화

[단위]
before=multiuser.target

그것도 작동하지 않습니다.

myservice가 실행된 후 nginx와shorewall이 시작되는지 확인하는 방법은 무엇입니까?

답변1

systemd 서비스 유형을 지정하지 않으면 기본값은 입니다 Type=simple. 이는 기본 서비스 프로세스가 분기될 때(아직 명령을 실행하지 않은 시점에서 ExecStart) 서비스가 시작된 것으로 간주됨을 의미합니다. 대신 서비스가 시작된 것을 고려하기 전에 명령이 종료될 때 Type=oneshot까지 기다리는 이 방법을 사용할 수 있습니다 . 자세한 내용은 ExecStart참조하십시오 .man systemd.service

답변2

ExecStartPre=별도의 옵션을 사용하는 대신(또는 Requires=shorewall.servicenginx 서비스 단위에 추가하는 것을 권장하지만) 플러그인 조각 구성의 옵션 을 사용하여 Nginx 서비스 단위에 옵션을 추가할 수 있습니다 .

이 명령을 사용하십시오( sudo systemctl edit nginx.service포함된 조각 구성이 있는 디렉터리가 생성됩니다)./etc/systemd/system/nginx.service.d

유형:

[Unit]
Requires=shorewall.service
After=shorewall.service

또는:

[Service]
ExecStartPre=/usr/bin/your_script

이는 nginx 서비스 단위를 시작하기 전에 항상 스크립트를 실행합니다. IgnoreSIGPIPE=no서비스 섹션에 추가해야 합니다(셸 스크립트이고 기본적으로 리디렉션을 지원하지 않기 때문에) . 그렇지 않으면 Systemd는 리디렉션, 파이프 및 신호를 무시합니다.

용도: /etcNGINX 구성, 해안벽 구성 및 /etc/hosts를 재정의하기 위해 디렉터리(overlayfs)를 마운트합니다.

서비스 섹션에 추가:

TemporaryFileSystem=/etc:ro,nodev,noexec,nosuid

그러면 디렉토리 상단에 빈 tmpfs 마운트 지점이 마운트됩니다 /etc. 필요한 모든 파일 BindReadOnlyPaths=(디렉터리 2개, 파일 5개) 을 바인드 마운트( , 사용)해야 합니다 .BindPaths=/etc

호스트 파일을 바인드 마운트하려면 다음을 수행하십시오.

BindReadOnlyPaths=/etc/hosts

(openssl, ca 인증서 및 이름 서비스를 ;)에 추가하십시오.

systemd.exec스크립팅 없이 환경, 컨테이너화, 네임스페이스, 샌드박싱, MAC/IPS를 설정합니다.

관련 정보