vapor-docs/build/2.0/deploy/nginx/index.html

2121 lines
48 KiB
HTML

<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="lang:clipboard.copy" content="Copy to clipboard">
<meta name="lang:clipboard.copied" content="Copied to clipboard">
<meta name="lang:search.language" content="en">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="No matching documents">
<meta name="lang:search.result.one" content="1 matching document">
<meta name="lang:search.result.other" content="# matching documents">
<meta name="lang:search.tokenizer" content="[\s\-]+">
<link rel="shortcut icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-0.17.3, mkdocs-material-2.7.0">
<title>Nginx - Vapor Docs</title>
<link rel="stylesheet" href="../../assets/stylesheets/application.78aab2dc.css">
<link rel="stylesheet" href="../../assets/stylesheets/application-palette.6079476c.css">
<script src="../../assets/javascripts/modernizr.1aa3b519.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
</head>
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="purple">
<svg class="md-svg">
<defs>
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448"
viewBox="0 0 416 448" id="github">
<path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19-18.125
8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19 18.125-8.5
18.125 8.5 10.75 19 3.125 20.5zM320 304q0 10-3.125 20.5t-10.75
19-18.125 8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19
18.125-8.5 18.125 8.5 10.75 19 3.125 20.5zM360
304q0-30-17.25-51t-46.75-21q-10.25 0-48.75 5.25-17.75 2.75-39.25
2.75t-39.25-2.75q-38-5.25-48.75-5.25-29.5 0-46.75 21t-17.25 51q0 22 8
38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0
37.25-1.75t35-7.375 30.5-15 20.25-25.75 8-38.375zM416 260q0 51.75-15.25
82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5-41.75
1.125q-19.5 0-35.5-0.75t-36.875-3.125-38.125-7.5-34.25-12.875-30.25-20.25-21.5-28.75q-15.5-30.75-15.5-82.75
0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25
30.875q36.75-8.75 77.25-8.75 37 0 70 8 26.25-20.5
46.75-30.25t47.25-9.75q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34
99.5z" />
</svg>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
<label class="md-overlay" data-md-component="overlay" for="drawer"></label>
<a href="#deploying-with-nginx" tabindex="1" class="md-skip">
Skip to content
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="../.." title="Vapor Docs" class="md-header-nav__button md-logo">
<img src="../../images/droplet-white.svg" width="24" height="24">
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
Vapor Docs
</span>
<span class="md-header-nav__topic">
Nginx
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
&#xE5CD;
</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
Type to start searching
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="http://github.com/vapor/vapor/" title="Go to repository" class="md-source" data-md-source="github">
<div class="md-source__icon">
<svg viewBox="0 0 24 24" width="24" height="24">
<use xlink:href="#github" width="24" height="24"></use>
</svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="drawer">
<span class="md-nav__button md-logo">
<img src="../../images/droplet-white.svg" width="48" height="48">
</span>
Vapor Docs
</label>
<div class="md-nav__source">
<a href="http://github.com/vapor/vapor/" title="Go to repository" class="md-source" data-md-source="github">
<div class="md-source__icon">
<svg viewBox="0 0 24 24" width="24" height="24">
<use xlink:href="#github" width="24" height="24"></use>
</svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." title="Overview" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
<label class="md-nav__link" for="nav-2">
Getting started
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-2">
Getting started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../getting-started/install-on-macos/" title="Install: macOS" class="md-nav__link">
Install: macOS
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/install-on-ubuntu/" title="Install: Ubuntu" class="md-nav__link">
Install: Ubuntu
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/toolbox/" title="Toolbox" class="md-nav__link">
Toolbox
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/hello-world/" title="Hello, World" class="md-nav__link">
Hello, World
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/manual/" title="Manual" class="md-nav__link">
Manual
</a>
</li>
<li class="md-nav__item">
<a href="../../getting-started/xcode/" title="Xcode" class="md-nav__link">
Xcode
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
<label class="md-nav__link" for="nav-3">
Vapor
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-3">
Vapor
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../vapor/folder-structure/" title="Folder Structure" class="md-nav__link">
Folder Structure
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/droplet/" title="Droplet" class="md-nav__link">
Droplet
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/views/" title="Views" class="md-nav__link">
Views
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/controllers/" title="Controllers" class="md-nav__link">
Controllers
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/provider/" title="Provider" class="md-nav__link">
Provider
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/hash/" title="Hash" class="md-nav__link">
Hash
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/log/" title="Log" class="md-nav__link">
Log
</a>
</li>
<li class="md-nav__item">
<a href="../../vapor/commands/" title="Commands" class="md-nav__link">
Commands
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
<label class="md-nav__link" for="nav-4">
Configs
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-4">
Configs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../configs/config/" title="Config" class="md-nav__link">
Config
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
<label class="md-nav__link" for="nav-5">
JSON
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-5">
JSON
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../json/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../json/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
<label class="md-nav__link" for="nav-6">
Routing
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-6">
Routing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../routing/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../routing/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../routing/parameters/" title="Parameters" class="md-nav__link">
Parameters
</a>
</li>
<li class="md-nav__item">
<a href="../../routing/group/" title="Group" class="md-nav__link">
Group
</a>
</li>
<li class="md-nav__item">
<a href="../../routing/collection/" title="Collection" class="md-nav__link">
Collection
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
<label class="md-nav__link" for="nav-7">
Fluent
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-7">
Fluent
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../fluent/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/model/" title="Model" class="md-nav__link">
Model
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/database/" title="Database" class="md-nav__link">
Database
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/query/" title="Query" class="md-nav__link">
Query
</a>
</li>
<li class="md-nav__item">
<a href="../../fluent/relations/" title="Relations" class="md-nav__link">
Relations
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
<label class="md-nav__link" for="nav-8">
Cache
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-8">
Cache
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../cache/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../cache/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
<label class="md-nav__link" for="nav-9">
MySQL
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-9">
MySQL
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mysql/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../mysql/provider/" title="Provider" class="md-nav__link">
Provider
</a>
</li>
<li class="md-nav__item">
<a href="../../mysql/driver/" title="Driver" class="md-nav__link">
Driver
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
<label class="md-nav__link" for="nav-10">
Redis
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-10">
Redis
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../redis/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../redis/provider/" title="Provider" class="md-nav__link">
Provider
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
<label class="md-nav__link" for="nav-11">
Auth
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-11">
Auth
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../auth/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/provider/" title="Provider" class="md-nav__link">
Provider
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/helper/" title="Helper" class="md-nav__link">
Helper
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/password/" title="Password" class="md-nav__link">
Password
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/persist/" title="Persist" class="md-nav__link">
Persist
</a>
</li>
<li class="md-nav__item">
<a href="../../auth/redirect-middleware/" title="Redirect Middleware" class="md-nav__link">
Redirect Middleware
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
<label class="md-nav__link" for="nav-12">
JWT
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-12">
JWT
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../jwt/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../jwt/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-13" type="checkbox" id="nav-13">
<label class="md-nav__link" for="nav-13">
Sessions
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-13">
Sessions
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../sessions/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../sessions/sessions/" title="Sessions" class="md-nav__link">
Sessions
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-14" type="checkbox" id="nav-14">
<label class="md-nav__link" for="nav-14">
HTTP
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-14">
HTTP
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../http/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../http/request/" title="Request" class="md-nav__link">
Request
</a>
</li>
<li class="md-nav__item">
<a href="../../http/response/" title="Response" class="md-nav__link">
Response
</a>
</li>
<li class="md-nav__item">
<a href="../../http/middleware/" title="Middleware" class="md-nav__link">
Middleware
</a>
</li>
<li class="md-nav__item">
<a href="../../http/body/" title="Body" class="md-nav__link">
Body
</a>
</li>
<li class="md-nav__item">
<a href="../../http/response-representable/" title="ResponseRepresentable" class="md-nav__link">
ResponseRepresentable
</a>
</li>
<li class="md-nav__item">
<a href="../../http/responder/" title="Responder" class="md-nav__link">
Responder
</a>
</li>
<li class="md-nav__item">
<a href="../../http/client/" title="Client" class="md-nav__link">
Client
</a>
</li>
<li class="md-nav__item">
<a href="../../http/server/" title="Server" class="md-nav__link">
Server
</a>
</li>
<li class="md-nav__item">
<a href="../../http/cors/" title="CORS" class="md-nav__link">
CORS
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-15" type="checkbox" id="nav-15">
<label class="md-nav__link" for="nav-15">
Leaf
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-15">
Leaf
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../leaf/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../leaf/provider/" title="Provider" class="md-nav__link">
Provider
</a>
</li>
<li class="md-nav__item">
<a href="../../leaf/leaf/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-16" type="checkbox" id="nav-16">
<label class="md-nav__link" for="nav-16">
Validation (WIP)
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-16">
Validation (WIP)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../validation/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../validation/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-17" type="checkbox" id="nav-17">
<label class="md-nav__link" for="nav-17">
Node
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-17">
Node
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../node/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../node/getting-started/" title="Getting Started" class="md-nav__link">
Getting Started
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-18" type="checkbox" id="nav-18">
<label class="md-nav__link" for="nav-18">
Core
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-18">
Core
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../core/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../core/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-19" type="checkbox" id="nav-19">
<label class="md-nav__link" for="nav-19">
Bits
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-19">
Bits
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../bits/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../bits/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-20" type="checkbox" id="nav-20">
<label class="md-nav__link" for="nav-20">
Debugging
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-20">
Debugging
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../debugging/package/" title="Package" class="md-nav__link">
Package
</a>
</li>
<li class="md-nav__item">
<a href="../../debugging/overview/" title="Overview" class="md-nav__link">
Overview
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-21" type="checkbox" id="nav-21" checked>
<label class="md-nav__link" for="nav-21">
Deploy
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-21">
Deploy
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../cloud/" title="Cloud" class="md-nav__link">
Cloud
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
<label class="md-nav__link md-nav__link--active" for="toc">
Nginx
</label>
<a href="./" title="Nginx" class="md-nav__link md-nav__link--active">
Nginx
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#overview" title="Overview" class="md-nav__link">
Overview
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#more-detail" title="More Detail" class="md-nav__link">
More Detail
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#install-nginx" title="Install Nginx" class="md-nav__link">
Install Nginx
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#apt" title="APT" class="md-nav__link">
APT
</a>
</li>
<li class="md-nav__item">
<a href="#service" title="Service" class="md-nav__link">
Service
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#booting-vapor" title="Booting Vapor" class="md-nav__link">
Booting Vapor
</a>
</li>
<li class="md-nav__item">
<a href="#configure-proxy" title="Configure Proxy" class="md-nav__link">
Configure Proxy
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#serving-files" title="Serving Files" class="md-nav__link">
Serving Files
</a>
</li>
<li class="md-nav__item">
<a href="#tls" title="TLS" class="md-nav__link">
TLS
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../apache2/" title="Apache2" class="md-nav__link">
Apache2
</a>
</li>
<li class="md-nav__item">
<a href="../supervisor/" title="Supervisor" class="md-nav__link">
Supervisor
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-22" type="checkbox" id="nav-22">
<label class="md-nav__link" for="nav-22">
Version (2.0)
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-22">
Version (2.0)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../version/1_5/" title="1.5" class="md-nav__link">
1.5
</a>
</li>
<li class="md-nav__item">
<a href="../../version/2_0/" title="2.0" class="md-nav__link">
2.0
</a>
</li>
<li class="md-nav__item">
<a href="../../version/3_0/" title="3.0-rc" class="md-nav__link">
3.0-rc
</a>
</li>
<li class="md-nav__item">
<a href="../../version/support/" title="Support" class="md-nav__link">
Support
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="toc">Table of contents</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#overview" title="Overview" class="md-nav__link">
Overview
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#more-detail" title="More Detail" class="md-nav__link">
More Detail
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#install-nginx" title="Install Nginx" class="md-nav__link">
Install Nginx
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#apt" title="APT" class="md-nav__link">
APT
</a>
</li>
<li class="md-nav__item">
<a href="#service" title="Service" class="md-nav__link">
Service
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#booting-vapor" title="Booting Vapor" class="md-nav__link">
Booting Vapor
</a>
</li>
<li class="md-nav__item">
<a href="#configure-proxy" title="Configure Proxy" class="md-nav__link">
Configure Proxy
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#serving-files" title="Serving Files" class="md-nav__link">
Serving Files
</a>
</li>
<li class="md-nav__item">
<a href="#tls" title="TLS" class="md-nav__link">
TLS
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/vapor/documentation/edit/master/2.0/docs/deploy/nginx.md" title="Edit this page" class="md-icon md-content__icon">&#xE3C9;</a>
<h1 id="deploying-with-nginx">Deploying with Nginx<a class="headerlink" href="#deploying-with-nginx" title="Permanent link">&para;</a></h1>
<p>Nginx is an extremely fast, battle tested, and easy-to-configure HTTP server and proxy. While Vapor supports directly serving HTTP requests with or without TLS, proxying behind Nginx can provide increased performance, security, and ease-of-use. </p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>We recommend proxying Vapor HTTP servers behind Nginx.</p>
</div>
<h2 id="overview">Overview<a class="headerlink" href="#overview" title="Permanent link">&para;</a></h2>
<p>What does it mean to proxy an HTTP server? In short, a proxy acts as a middleman between the public internet and your HTTP server. Requests come to the proxy and then it sends them to Vapor. </p>
<p>An important feature of this middleman proxy is that it can alter or even redirect the requests. For instance, the proxy can require that the client use TLS (https), rate limit requests, or even serve public files without talking to your Vapor application.</p>
<p><img alt="nginx-proxy" src="https://cloud.githubusercontent.com/assets/1342803/20184965/5d9d588a-a738-11e6-91fe-28c3a4f7e46b.png" /></p>
<h3 id="more-detail">More Detail<a class="headerlink" href="#more-detail" title="Permanent link">&para;</a></h3>
<p>The default port for receiving HTTP requests is port <code>80</code> (and <code>443</code> for HTTPS). When you bind a Vapor server to port <code>80</code>, it will directly receive and respond to the HTTP requests that come to your server. When adding a proxy like Nginx, you bind Vapor to an internal port, like port <code>8080</code>. </p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Ports greater than 1024 do not require <code>sudo</code> to bind.</p>
</div>
<p>When Vapor is bound to a port besides <code>80</code> or <code>443</code>, it will not be accessible to the outside internet. You then bind Nginx to port <code>80</code> and configure it to route requests to your Vapor server bound at port <code>8080</code> (or whichever port you've chosen).</p>
<p>And that's it. If Nginx is properly configured, you will see your Vapor app responding to requests on port <code>80</code>. Nginx proxies the requests and responses invisibly.</p>
<h2 id="install-nginx">Install Nginx<a class="headerlink" href="#install-nginx" title="Permanent link">&para;</a></h2>
<p>The first step is installing Nginx. One of the great parts of Nginx is the tremendous amount of community resources and documentation surrounding it. Because of this, we will not go into great detail here about installing Nginx as there is almost definitely a tutorial for your specific platform, OS, and provider.</p>
<p>Tutorials:</p>
<ul>
<li><a href="https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-14-04-lts">How To Install Nginx on Ubuntu 14.04 LTS</a></li>
<li><a href="https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04">How To Install Nginx on Ubuntu 16.04</a></li>
<li><a href="https://blog.codeship.com/how-to-deploy-nginx-on-heroku/">How to Deploy Nginx on Heroku</a></li>
<li><a href="https://www.digitalocean.com/community/tutorials/how-to-run-nginx-in-a-docker-container-on-ubuntu-14-04">How To Run Nginx in a Docker Container on Ubuntu 14.04</a></li>
</ul>
<h3 id="apt">APT<a class="headerlink" href="#apt" title="Permanent link">&para;</a></h3>
<p>Nginx can be installed through APT.</p>
<div class="codehilite"><pre><span></span>sudo apt-get update
sudo apt-get install nginx
</pre></div>
<p>Check whether Nginx was installed correctly by visiting your server's IP address in a browser</p>
<div class="codehilite"><pre><span></span>http://server_domain_name_or_IP
</pre></div>
<h3 id="service">Service<a class="headerlink" href="#service" title="Permanent link">&para;</a></h3>
<p>The service can be started or stopped.</p>
<div class="codehilite"><pre><span></span>sudo service nginx stop
sudo service nginx start
sudo service nginx restart
</pre></div>
<h2 id="booting-vapor">Booting Vapor<a class="headerlink" href="#booting-vapor" title="Permanent link">&para;</a></h2>
<p>Nginx can be started an stopped with the <code>sudo service nginx ...</code> commands. You will need something similar to start and stop your Vapor server.</p>
<p>There are many ways to do this, and they depend on which platform you are deploying to. Check out the <a href="../supervisor/">Supervisor</a> instructions to add commands for starting and stopping your Vapor app.</p>
<h2 id="configure-proxy">Configure Proxy<a class="headerlink" href="#configure-proxy" title="Permanent link">&para;</a></h2>
<p>The configuration files for enabled sites can be found in <code>/etc/nginx/sites-enabled/</code>.</p>
<p>Create a new file or copy the example template from <code>/etc/nginx/sites-available/</code> to get started.</p>
<p>Here is an example configuration file for a Vapor project called <code>Hello</code> in the home directory.</p>
<div class="codehilite"><pre><span></span>server <span class="o">{</span>
server_name hello.com<span class="p">;</span>
listen <span class="m">80</span><span class="p">;</span>
root /home/vapor/Hello/Public/<span class="p">;</span>
location @proxy <span class="o">{</span>
proxy_pass http://127.0.0.1:8080<span class="p">;</span>
proxy_pass_header Server<span class="p">;</span>
proxy_set_header Host <span class="nv">$host</span><span class="p">;</span>
proxy_set_header X-Real-IP <span class="nv">$remote_addr</span><span class="p">;</span>
proxy_set_header X-Forwarded-For <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
proxy_pass_header Server<span class="p">;</span>
proxy_connect_timeout 3s<span class="p">;</span>
proxy_read_timeout 10s<span class="p">;</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
<p>This configuration file assumes the <code>Hello</code> project binds to port <code>8080</code> when started in production mode.</p>
<h3 id="serving-files">Serving Files<a class="headerlink" href="#serving-files" title="Permanent link">&para;</a></h3>
<p>Nginx can also serve public files without asking your Vapor app. This can improve performance by freeing up the Vapor process for other tasks under heavy load.</p>
<div class="codehilite"><pre><span></span>server <span class="o">{</span>
...
<span class="c1"># Serve all public/static files via nginx and then fallback to Vapor for the rest</span>
try_files <span class="nv">$uri</span> @proxy<span class="p">;</span>
location @proxy <span class="o">{</span>
...
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
<h3 id="tls">TLS<a class="headerlink" href="#tls" title="Permanent link">&para;</a></h3>
<p>Adding TLS is relatively straightforward as long as the certificates have been properly generated. To generate TLS certificates for free, check out <a href="https://letsencrypt.org/getting-started/">Let's Encrypt</a>.</p>
<div class="codehilite"><pre><span></span>server <span class="o">{</span>
...
listen <span class="m">443</span> ssl<span class="p">;</span>
ssl_certificate /etc/letsencrypt/live/hello.com/fullchain.pem<span class="p">;</span>
ssl_certificate_key /etc/letsencrypt/live/hello.com/privkey.pem<span class="p">;</span>
ssl_protocols TLSv1 TLSv1.1 TLSv1.2<span class="p">;</span>
ssl_prefer_server_ciphers on<span class="p">;</span>
ssl_dhparam /etc/ssl/certs/dhparam.pem<span class="p">;</span>
ssl_ciphers <span class="s1">&#39;ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA&#39;</span><span class="p">;</span>
ssl_session_timeout 1d<span class="p">;</span>
ssl_session_cache shared:SSL:50m<span class="p">;</span>
ssl_stapling on<span class="p">;</span>
ssl_stapling_verify on<span class="p">;</span>
add_header Strict-Transport-Security max-age<span class="o">=</span><span class="m">15768000</span><span class="p">;</span>
...
location @proxy <span class="o">{</span>
...
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
<p>The configuration above are the relatively strict settings for TLS with Nginx. Some of the settings here are not required, but enhance security.</p>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="../cloud/" title="Cloud" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
Cloud
</span>
</div>
</a>
<a href="../apache2/" title="Apache2" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Apache2
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright &copy; 2017 Qutheory, LLC
</div>
powered by
<a href="http://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
<div class="md-footer-social">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<a href="https://twitter.com/@codevapor" class="md-footer-social__link fa fa-twitter"></a>
<a href="http://vapor.team/" class="md-footer-social__link fa fa-slack"></a>
</div>
</div>
</div>
</footer>
</div>
<script src="../../assets/javascripts/application.8eb9be28.js"></script>
<script>app.initialize({version:"0.17.3",url:{base:"../.."}})</script>
<script>!function(e,a,t,n,o,c,i){e.GoogleAnalyticsObject=o,e.ga=e.ga||function(){(e.ga.q=e.ga.q||[]).push(arguments)},e.ga.l=1*new Date,c=a.createElement(t),i=a.getElementsByTagName(t)[0],c.async=1,c.src="https://www.google-analytics.com/analytics.js",i.parentNode.insertBefore(c,i)}(window,document,"script",0,"ga"),ga("create","UA-76177358-4","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");if(Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var a=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",a,e.href)})}),document.forms.search){var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})}</script>
</body>
</html>