私はUbuntu 18.10で、vmwareの下で実行していて、nginxサービスを開始できません-「nginx.service:Ca n't open PID file/run/nginx」というエラーが表示されます。
乗客を使用してソースからnginxをコンパイルしました。 1台のマシンでは問題ありませんでしたが、私のvmでそれを試してもnginxサービスを開始できません。 PIDファイルを開けない(または作成できない)ため、上記のエラーが発生します。 systemctl enable&startを実行するとハングします。
/etc/sytemd/system/nginx.serviceスクリプトを次のように使用しました:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
/ runを/ var/runに置き換えてみましたが、同じエラーが発生します。
Nginx.confにはPIDへの参照はありません(必要があるとは思いませんか?)。
誰かが私にこれをトラブルシューティングまたは修正する方法の指針を教えてもらえますか?
私はこれを修正する方法という意味で答えがありますが、誰かがこれがそうである理由についてコメントすることができるように、少しだけ開いたままにしておきます。
PID行を変更して、インストールされたnginxフォルダーのログフォルダー(/ opt/nginx/logs)にPIDファイルが書き込まれるようにしました。他の場所では、PIDファイルの書き込みが拒否されます!!!
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/opt/nginx/logs/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
私はこの動作の理由が何であるかわからないので、Ubuntu Linuxの専門家が、通常の実行場所/ runおよび/ var/run(またはtmp)たとえば、プログラムのすべての引用された起動スクリプトでは通常です。これはソースから作成された場合にのみ発生すると思います。
あなたの質問を偶然見つけ、短い答えを残そうと考えました:
SystemdはitsefによってPIDファイルを作成しません。実行可能ファイルがそれを作成することを期待しています(通常、/run
内、または特にUbuntuの場合は/var/run
フォルダー内)。 Systemdは、サービスの開始後に作成されたかどうかのみをチェックします。また、サービスを強制終了すると、PIDファイルも削除されます。 参考
フォークプロセスとしてのNginxサーバーは、PIDファイルの作成をサポートしています。その場所を変更するには、標準パッケージのnginx.conf
フォルダにある/etc/nginx
ファイルでpid
ディレクティブを使用できます。このpid
ディレクティブのデフォルトはlogs/nginx.pid
です。 参考
Nginxサービスを手動で作成する場合は、Systemd nginx.service
ファイル内とNginx nginx.conf
構成ファイル内の両方の場所が一致していることを確認する必要があります。
/ runは利用できますか?/runにcdしてファイルにタッチできますか?
cd /run && touch hello.txt && ls -lash
そうでない場合は、おそらくnginxがPIDファイルを使用できない場所に配置することを意味します。 2つのことができます。