How to run nginx.service after /vagrant is mounted

前端 未结 5 609
青春惊慌失措
青春惊慌失措 2021-02-06 07:25

What I want to do?

I\'m trying to make nginx load configurations from /vagrant mounted by vagrant automatically.

So I edited nginx.service to make

相关标签:
5条回答
  • 2021-02-06 07:42

    edit /lib/systemd/system/nginx.service and change WantedBy directive under Install section...

    WantedBy=vagrant.mount
    

    You can check if the vagrant.mount event exists via: systemctl list-units vagrant.mount. You should see this:

    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'.
    
    0 讨论(0)
  • 2021-02-06 07:50

    I wrote a post how I'm using udev event to restart nginx and php5-fpm.

    In short I'm adding /etc/udev/rules.d/50-vagrant-mount.rules with rule:

    SUBSYSTEM=="bdi",ACTION=="add",RUN+="/bin/bash /root/.udev-mount-restart-services.sh"
    

    And the script /root/.udev-mount-restart-services.sh is:

    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
    
    0 讨论(0)
  • 2021-02-06 07:57

    Using the mount.target unit seems to work.

    Vagrantfile:

    # -*- 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
    

    Test this by running vagrant reload to cause the VM to boot without the /vagrant directory mounted. Log into the VM and see that nginx isn't running:

    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)
    

    Then comment out the Vagrantfile line that disables the shared folder and vagrant reload again. Log into the VM again and see that nginx is running:

    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
    
    0 讨论(0)
  • 2021-02-06 08:02

    Summarization previous answers and comments in terms of Ansible (if used for provision):

    - 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
    

    Replace {{ vagrant_mount_unit }} by Vagrant mount unit name. It depends from mount point, e.g. if mount point is /home/vagrant/app, unit name would be home-vagrant-app.mount.

    0 讨论(0)
  • 2021-02-06 08:04

    I wanted to drop my own answer here as it did seem each answer has parts of a correct answer and some details can be found in comments only.

    In this example I have 2 file system mounts in /var/www/mymount1 and /var/www/mymount2

    This part of my 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"
    

    I am placing the script below in /docs/vagrant/init-vagrant.sh as its my provisioner file.

    # 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
    
    0 讨论(0)
提交回复
热议问题