View Source Horizon.NginxConfig (horizon v0.2.7)

This module generates an Nginx configuration file using a templating system. Allows for template overrides in the current project. The configuration is based on Horizon.Project and Horizon.Server.

Customizing the Nginx configuration template

To customize your nginx.conf, copy the template from the Horizon package to your project:

$ mkdir -p priv/horizon/templates
$ cp deps/horizon/priv/templates/nginx/nginx.conf.eex priv/horizon/templates/nginx.conf.eex

You can also customize individual blocks of the configuration file:

$ cp deps/horizon/priv/templates/nginx/_upstream.eex priv/horizon/templates/_upstream.eex
$ cp deps/horizon/priv/templates/nginx/_server_http.eex priv/horizon/templates/_server_http.eex
$ cp deps/horizon/priv/templates/nginx/_server_https.eex priv/horizon/templates/_server_https.eex

Nginx Header Options

* `:client_max_body_size` - Maximum allowed size of the client request body (default: "6M")
* `:sendfile` - Enable or disable sendfile usage (default: true)
* `:keepalive_timeout` - Timeout during which a keep-alive client connection will stay open (default: 65)
* `:gzip` - Enable or disable gzip compression (default: true)
* `:access_log` - Enable or disable access logging (default: true)
* `:access_log_path` - Path to the access log file (default: "/var/log/nginx/access.log")
* `:worker_connections` - Maximum number of simultaneous connections that can be opened by a worker process (default: 1024)

Examples

iex> project = %Horizon.Project{
...>   name: "example_project",
...>   server_names: ["example.com", "www.example.com"],
...>   letsencrypt_live: "mydomain.com",
...>   acme_challenge_path: "/apps/challenge/mydomain.com",
...>   http_only: false,
...>   servers: [
...>     %Horizon.Server{internal_ip: "10.0.0.1", port: 4000},
...>     %Horizon.Server{internal_ip: "10.0.0.2", port: 4001}
...>   ]
...> }
iex> Horizon.NginxConfig.generate([project])

With custom options:

iex> Horizon.NginxConfig.generate([project],
...>   client_max_body_size: "20M",
...>   worker_connections: 2048,
...>   gzip: false
...> )
user = "username"
host = "host-address"
remote_path = "/usr/local/etc/nginx/nginx.conf"

projects = [
  %Horizon.Project{
    name: "project-name",
    server_names: ["my.server.com"],
    http_only: true,
    servers: [
      %Horizon.Server{internal_ip: "127.0.0.1", port: 4000},
      %Horizon.Server{internal_ip: "192.168.100.100", port: 4000}
    ]
  }
]

config_output = Horizon.NginxConfig.send(projects)

Summary

Functions

Returns the path for the certificate

Returns the path for the certificate

Sends the Nginx configuration to a remote host and reloads the Nginx service.

Types

nginx_options()

@type nginx_options() :: [
  client_max_body_size: String.t(),
  sendfile: boolean(),
  keepalive_timeout: integer(),
  gzip: boolean(),
  access_log: boolean(),
  access_log_path: String.t(),
  worker_connections: integer()
]

Functions

cert_key_path(project)

@spec cert_key_path(Horizon.Project.t()) :: String.t()

Returns the path for the certificate

Examples

iex> cert_key_path(%Horizon.Project{
...>   certificate: :self,
...>   cert_key_path: "/path/to/cert_key.pem"
...> })
"/path/to/cert_key.pem"

iex> cert_key_path(%Horizon.Project{certificate: :letsencrypt, domain: "example.com"})
"/user/local/etc/letsencrypt/live/example.com/privkey.pem"

cert_path(project)

@spec cert_path(Horizon.Project.t()) :: String.t()

Returns the path for the certificate

Examples

iex> cert_path(%Horizon.Project{certificate: :self, cert_path: "/path/to/cert.pem"})
"/path/to/cert.pem"

iex> cert_path(%Horizon.Project{certificate: :letsencrypt, domain: "example.com"})
"/user/local/etc/letsencrypt/live/example.com/fullchain.pem"

generate(projects, opts \\ [])

@spec generate([Horizon.Project.t()], nginx_options()) :: String.t()

render_partial(partial_name, assigns)

@spec render_partial(String.t(), map()) :: String.t()

send(projects, user, host, opts \\ [])

@spec send([Horizon.Project.t()], String.t(), String.t(), keyword()) ::
  {:ok, any()} | {:error, non_neg_integer(), any()}

Sends the Nginx configuration to a remote host and reloads the Nginx service.

Options

  • :nginxconf_path - Path to nginx.conf on the remote host (default: "/usr/local/etc/nginx/nginx.conf")
  • :action - Action to take on the remote host after updating config (:reload or :restart) (default: :reload)
  • :nginx - Nginx configuration options (see generate/2 for available options)

Examples

iex> user = "me"
...> host = "myhost"
...> projects = [%Horizon.Project{name: "my project", ...}]
...> NginxConfig.send(projects, user, host)

# With custom nginx.conf path and restart action
iex> NginxConfig.send(projects, user, host,
...>   nginxconf_path: "/usr/nginx/nginx.conf",
...>   action: :restart
...> )

# With custom nginx options
iex> NginxConfig.send(projects, user, host,
...>   nginx: [
...>     client_max_body_size: "20M",
...>     worker_connections: 2048
...>   ]
...> )