/vagrant 安装后如何 运行 nginx.service
How to run nginx.service after /vagrant is mounted
我想做什么?
我正在尝试从 /vagrant
由 vagrant 自动安装的 nginx 加载配置。
所以我编辑了 nginx.service 以使其在安装共享文件夹后启动,但它不起作用。
当然 nginx 在 virtualbox-guest-utils.service 之后启动,但是,它似乎在 vagrant.mount (/vagrant) 之前启动。
因为 nginx 无法从 /vagrant 加载配置,并且它在 运行ning 命令 systemctl restart nginx.service
手动后工作。
自动生成.mount单元启动后如何运行.service单元?
环境
- Vagrant 1.8.1
- Ubuntu 服务器 15.10 (ubuntu/wily64)
- 虚拟盒子 5.0.14
systemctl cat nginx.service
模式 1:无效
# /lib/systemd/system/nginx.service
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/nginx.service.d/override.conf
[Unit]
Requires=virtualbox-guest-utils.service vagrant.mount
After=virtualbox-guest-utils.service vagrant.mount
模式 2:无效
# /lib/systemd/system/nginx.service
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/nginx.service.d/override.conf
[Unit]
RequiresMountsFor=/vagrant
我写了一个post how I'm using udev
event to restart nginx and php5-fpm.
简而言之,我添加 /etc/udev/rules.d/50-vagrant-mount.rules
规则:
SUBSYSTEM=="bdi",ACTION=="add",RUN+="/bin/bash /root/.udev-mount-restart-services.sh"
脚本 /root/.udev-mount-restart-services.sh
是:
sleep 5 # wait for a bit for NFS to make sure resources are available
systemctl restart php5-fpm > /dev/null 2>&1
systemctl restart nginx > /dev/null 2>&1
使用 mount.target 单位似乎可行。
流浪文件:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/wily64"
config.vm.provision :shell, path: "bootstrap.sh"
# Disabling mounting of the /vagrant directory to make sure ngnix is blocked
# Comment this out to allow the shared folder
config.vm.synced_folder ".", "/vagrant", disabled: true
end
bootstrap.sh:
#!/usr/bin/env bash
apt-get update
apt-get install -y nginx
# Make vagrant.mount loosely dependent on nginx.service
sed -i 's/WantedBy=multi-user.target/WantedBy=vagrant.mount/' /lib/systemd/system/nginx.service
systemctl daemon-reload
# Update service symlinks
systemctl disable nginx.service
systemctl enable nginx.service
通过 运行 vagrant reload
进行测试,使 VM 在没有安装 /vagrant 目录的情况下启动。登录虚拟机,发现 nginx 不是 运行:
vagrant@vagrant-ubuntu-wily-64:~$ sudo systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: inactive (dead)
然后注释掉禁用共享文件夹的Vagrantfile 行并再次vagrant reload
。再次登录虚拟机,看到nginx是运行:
vagrant@vagrant-ubuntu-wily-64:~$ systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2016-07-25 04:28:00 UTC; 42s ago
Process: 1152 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 1146 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 1156 (nginx)
Memory: 7.4M
CPU: 17ms
CGroup: /system.slice/nginx.service
├─1156 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─1157 nginx: worker process
编辑 /lib/systemd/system/nginx.service
并更改 Install
部分下的 WantedBy
指令...
WantedBy=vagrant.mount
您可以通过 systemctl list-units vagrant.mount
检查 vagrant.mount
事件是否存在。你应该看到这个:
UNIT LOAD ACTIVE SUB DESCRIPTION
vagrant.mount loaded active mounted /vagrant
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
1 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
Ansible 以前的回答和评论总结(如果用于提供):
- name: Copy Nginx Systemd unit to /etc/
copy:
src: /lib/systemd/system/nginx.service
dest: /etc/systemd/system/nginx.service
remote_src: yes
- name: Change Nginx Systemd unit
lineinfile:
path: /etc/systemd/system/nginx.service
regexp: '^WantedBy='
line: 'WantedBy={{ vagrant_mount_unit }}'
state: present
- name: Systemd daemon reload
systemd:
daemon_reload: yes
- name: Disable Nginx
service:
name: nginx
enabled: no
- name: Enable Nginx
service:
name: nginx
enabled: yes
将{{ vagrant_mount_unit }}
替换为Vagrant挂载单位名称。这取决于挂载点,例如如果挂载点是 /home/vagrant/app
,单元名称将是 home-vagrant-app.mount
.
我想在这里留下我自己的答案,因为看起来每个答案都有部分正确答案,一些细节只能在评论中找到。
在此示例中,我在 /var/www/mymount1 和 /var/www/mymount2
中安装了 2 个文件系统
我的 Vagrantfile 的这一部分:
config.vm.provision "shell", path: "docs/vagrant/init-vagrant.sh"
config.vm.synced_folder "mymount1", "/var/www/mymount1", type: "nfs"
config.vm.synced_folder "mymount2", "/var/www/mymount2", type: "nfs"
我将下面的脚本放在 /docs/vagrant/init-vagrant.sh 作为我的配置文件。
# Copy nginx systemd script and make edits in /etc/systemd/system, as updates might change the original in /lib/systemd/system/nginx.service
cp /lib/systemd/system/nginx.service /etc/systemd/system/
# These tell that nginx should not be started before file system mounts are available
echo WantedBy=var-www-mymount1.mount >> /etc/systemd/system/nginx.service
echo WantedBy=var-www-mymount2.mount >> /etc/systemd/system/nginx.service
# Update service symlinks
systemctl daemon-reload
systemctl disable nginx.service
systemctl enable nginx.service
我想做什么?
我正在尝试从 /vagrant
由 vagrant 自动安装的 nginx 加载配置。
所以我编辑了 nginx.service 以使其在安装共享文件夹后启动,但它不起作用。
当然 nginx 在 virtualbox-guest-utils.service 之后启动,但是,它似乎在 vagrant.mount (/vagrant) 之前启动。
因为 nginx 无法从 /vagrant 加载配置,并且它在 运行ning 命令 systemctl restart nginx.service
手动后工作。
自动生成.mount单元启动后如何运行.service单元?
环境
- Vagrant 1.8.1
- Ubuntu 服务器 15.10 (ubuntu/wily64)
- 虚拟盒子 5.0.14
systemctl cat nginx.service
模式 1:无效
# /lib/systemd/system/nginx.service
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/nginx.service.d/override.conf
[Unit]
Requires=virtualbox-guest-utils.service vagrant.mount
After=virtualbox-guest-utils.service vagrant.mount
模式 2:无效
# /lib/systemd/system/nginx.service
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/nginx.service.d/override.conf
[Unit]
RequiresMountsFor=/vagrant
我写了一个post how I'm using udev
event to restart nginx and php5-fpm.
简而言之,我添加 /etc/udev/rules.d/50-vagrant-mount.rules
规则:
SUBSYSTEM=="bdi",ACTION=="add",RUN+="/bin/bash /root/.udev-mount-restart-services.sh"
脚本 /root/.udev-mount-restart-services.sh
是:
sleep 5 # wait for a bit for NFS to make sure resources are available
systemctl restart php5-fpm > /dev/null 2>&1
systemctl restart nginx > /dev/null 2>&1
使用 mount.target 单位似乎可行。
流浪文件:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/wily64"
config.vm.provision :shell, path: "bootstrap.sh"
# Disabling mounting of the /vagrant directory to make sure ngnix is blocked
# Comment this out to allow the shared folder
config.vm.synced_folder ".", "/vagrant", disabled: true
end
bootstrap.sh:
#!/usr/bin/env bash
apt-get update
apt-get install -y nginx
# Make vagrant.mount loosely dependent on nginx.service
sed -i 's/WantedBy=multi-user.target/WantedBy=vagrant.mount/' /lib/systemd/system/nginx.service
systemctl daemon-reload
# Update service symlinks
systemctl disable nginx.service
systemctl enable nginx.service
通过 运行 vagrant reload
进行测试,使 VM 在没有安装 /vagrant 目录的情况下启动。登录虚拟机,发现 nginx 不是 运行:
vagrant@vagrant-ubuntu-wily-64:~$ sudo systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: inactive (dead)
然后注释掉禁用共享文件夹的Vagrantfile 行并再次vagrant reload
。再次登录虚拟机,看到nginx是运行:
vagrant@vagrant-ubuntu-wily-64:~$ systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2016-07-25 04:28:00 UTC; 42s ago
Process: 1152 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 1146 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 1156 (nginx)
Memory: 7.4M
CPU: 17ms
CGroup: /system.slice/nginx.service
├─1156 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─1157 nginx: worker process
编辑 /lib/systemd/system/nginx.service
并更改 Install
部分下的 WantedBy
指令...
WantedBy=vagrant.mount
您可以通过 systemctl list-units vagrant.mount
检查 vagrant.mount
事件是否存在。你应该看到这个:
UNIT LOAD ACTIVE SUB DESCRIPTION
vagrant.mount loaded active mounted /vagrant
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
1 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
Ansible 以前的回答和评论总结(如果用于提供):
- name: Copy Nginx Systemd unit to /etc/
copy:
src: /lib/systemd/system/nginx.service
dest: /etc/systemd/system/nginx.service
remote_src: yes
- name: Change Nginx Systemd unit
lineinfile:
path: /etc/systemd/system/nginx.service
regexp: '^WantedBy='
line: 'WantedBy={{ vagrant_mount_unit }}'
state: present
- name: Systemd daemon reload
systemd:
daemon_reload: yes
- name: Disable Nginx
service:
name: nginx
enabled: no
- name: Enable Nginx
service:
name: nginx
enabled: yes
将{{ vagrant_mount_unit }}
替换为Vagrant挂载单位名称。这取决于挂载点,例如如果挂载点是 /home/vagrant/app
,单元名称将是 home-vagrant-app.mount
.
我想在这里留下我自己的答案,因为看起来每个答案都有部分正确答案,一些细节只能在评论中找到。
在此示例中,我在 /var/www/mymount1 和 /var/www/mymount2
中安装了 2 个文件系统我的 Vagrantfile 的这一部分:
config.vm.provision "shell", path: "docs/vagrant/init-vagrant.sh"
config.vm.synced_folder "mymount1", "/var/www/mymount1", type: "nfs"
config.vm.synced_folder "mymount2", "/var/www/mymount2", type: "nfs"
我将下面的脚本放在 /docs/vagrant/init-vagrant.sh 作为我的配置文件。
# Copy nginx systemd script and make edits in /etc/systemd/system, as updates might change the original in /lib/systemd/system/nginx.service
cp /lib/systemd/system/nginx.service /etc/systemd/system/
# These tell that nginx should not be started before file system mounts are available
echo WantedBy=var-www-mymount1.mount >> /etc/systemd/system/nginx.service
echo WantedBy=var-www-mymount2.mount >> /etc/systemd/system/nginx.service
# Update service symlinks
systemctl daemon-reload
systemctl disable nginx.service
systemctl enable nginx.service