-
Notifications
You must be signed in to change notification settings - Fork 1
/
servers.html
225 lines (223 loc) · 12 KB
/
servers.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
<!DOCTYPE html>
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Full Stack Clojure explains each layer of the web application stack, from the server up through the rendering in a user's browser.">
<meta name="author" content="Matt Makai">
<link rel="shortcut icon" href="theme/img/fsc-fav.png">
<title>Servers - Full Stack Clojure</title>
<link href="theme/css/fsc.css" rel="stylesheet">
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<style>
</style>
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-19910497-9', 'fullstackclojure.com');
ga('send', 'pageview');
</script>
</head>
<body>
<a href="https://github.com/makaimc/fullstackclojure.github.io" class="github">
<img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" />
</a>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="logo-header-section">
<a href="/" style="text-decoration: none; border: none;"><img src="theme/img/fsc.png" height="52" width="52" class="logo-image" style="padding-top: 1px;"/></a>
<span class="logo-title"><a href="/">Full Stack Clojure</a></span>
</div>
</div>
</div>
<div class="row">
<div class="col-md-8">
<h1>Servers</h1>
<p>Servers are the physical infrastructure to run all the layers of software
so your web application can respond to requests from clients such as web
browsers.</p>
<h2>Why are servers necessary?</h2>
<p>Your web application must live somewhere other than your own desktop or
laptop. Servers should ideally be accessible 24 hours a day, 7 days a week,
with no unplanned downtime. The servers that host your web application for
actual users (as opposed to test users) are known as <em>production</em> servers.
Production servers hold real data (again as opposed to test data) and must be
secure against unauthorized access.</p>
<h2>Servers learning checklist</h2>
<p><i class="fa fa-check-square-o"></i>
Understand the difference between bare metal servers, virtual private servers
(VPS) and infrastructure-as-a-service. </p>
<p><i class="fa fa-check-square-o"></i>
Sign up for a hosting provider. I recommend getting a
<a href="https://www.linode.com/?r=bfeecaf55a83cd3dd224a5f2a3a001fdf95d4c3d">Linode VPS</a>
to set up your initial infrastructure and deploy your web application there.
<a href="https://www.digitalocean.com/">Digital Ocean</a> and
<a href="http://prgmr.com/xen/">prgrmr</a> are other VPS options. You can change
hosting providers later after learning how to deploy web apps.</p>
<p><i class="fa fa-check-square-o"></i>
Provision your first server and move on to the
<a href="/operating-systems.html">operating systems section</a>.</p>
<h2>"Bare metal" servers</h2>
<p>The term <em>bare metal</em> refers to purchasing the actual hardware and hooking
it up to the Internet either through a business-class internet service
provider (ISP) or
<a href="http://webdesign.about.com/od/colocation/a/what_colocation.htm">co-locating the server</a>
with other servers. A "business-class" ISP is necessary because
most residential Internet service agreements explicitly prohibit running
web servers on their networks. You may be able to get away with low traffic
volume but if your site serves a lot of traffic it will alert an ISP's
filters.</p>
<p>The bare metal option offers the most control over the server configuration,
usually has the highest performance for the price, but also is the most
expensive upfront option and the highest ongoing maintenance. With bare
metal servers the ongoing operating cost is the electricity the server(s)
use as well as handling repairs when server components malfunction. You're
taking on manual labor working with hardware as well as the rest of the
software stack.</p>
<p>Buy actual hardware from a vendor either pre-built or as a collection of
components that you assemble yourself. You can also buy
pre-configured servers from Dell or HP. Those servers tend to be in
smaller case form factors (called "blades") but are correspondingly more
expensive than putting off-the-shelf components together yourself in a
standard computer case.</p>
<h2>Virtualized servers</h2>
<p>Virtual private servers (VPSs) are slices of hardware on top of a larger
bare metal server. Virtualization software such as
<a href="http://www.xen.org/">Xen</a> and
<a href="http://www.vmware.com/virtualization/what-is-virtualization.html">VMWare</a>
allow providers such as <a href="http://www.linode.com/">Linode</a> and
<a href="http://prgmr.com/xen/">prgmr</a> (as well as a many others) to provide
fractions of a full server that appear as their own instances. For example,
a server with an 8-core Xeon processor and 16 gigabytes of memory can be
sliced into 8 pieces with the equivalent of 1-core and 2 gigabytes of
memory.</p>
<p>The primary disadvantage of virtualized servers is that there is resource
overhead in the virtualization process. In addition, physical constraints
such as heavy I/O operations by a single virtualized instance on persistent
storage can cause performance bottlenecks for other virtualized instances on
the shared server. Choosing virtualized server hosting should be based on
your needs for urgency of service ticket requests and the frequency you
require for ongoing maintenance such as persistent storage backups.</p>
<h3>Virtualized servers resources</h3>
<ul>
<li>
<p><a href="http://blog.redfern.me/choosing-a-low-cost-vps/">Choosing a low cost VPS</a>
reviews the factors that you should weigh when deciding on hosting
providers.</p>
</li>
<li>
<p>This post covers hosting types and host to
<a href="http://www.purefiremedia.com/choose-a-web-host/">choose a web host</a>.</p>
</li>
<li>
<p><a href="http://feross.org/how-to-setup-your-linode/">How to set up your Linode for maximum awesomeness</a>
shows how to work with a VPS once you've got the server up and running.</p>
</li>
</ul>
<h2>Infrastructure-as-a-service</h2>
<p>Infrastructure-as-a-service (IaaS) overlaps with virtualized servers
because the resources are often presented in the same way. The
difference between virtualized servers and IaaS is the granularity of the
billing cycle. IaaS generally encourages a finer granularity based on minutes
or hours of server usage instead of on monthly billing cycles.</p>
<p>IaaS can be used in combination with virtualized servers to provide
dynamic upscaling for heavy traffic. When traffic is low then virtualized
servers can solely be used. This combination of resources reduces cost at
the expense of greater complexity in the dynamically scaled infrastructure. </p>
<p>The most common IaaS platforms are
<a href="http://aws.amazon.com/">Amazon Web Services</a> and
<a href="http://www.rackspace.com/cloud/">Rackspace Cloud</a>.</p>
<p>The disadvantage to IaaS platforms is the lock-in if you have to write
custom code to deploy, dynamically scale, and generally understand your
infrastructure. Every platform has its quirks. For example,
Amazon's standard <a href="http://aws.amazon.com/ebs/">Elastic Block Store</a> storage
infrastructure has at least an order of magnitude worse I/O throughput
than working with your local disk. Your application's database queries may
work great locally but then when you deploy the performance is inadequate.
Amazon has <a href="http://aws.amazon.com/about-aws/whats-new/2012/07/31/announcing-provisioned-iops-for-amazon-ebs/">higher throughput EBS instances</a>
but you will pay correspondingly more for them. EBS throughput is just
one of many quirks you need to understand before committing to an
IaaS platform.</p>
<h3>Infrastructure-as-a-service resources</h3>
<ul>
<li><a href="http://www.screamingatmyscreen.com/2012/12/the-cloud-vs-dedicated-servers/">The cloud versus dedicated servers</a></li>
</ul>
<h3>Keep going with a server or try a PaaS option?</h3>
<div class="row">
<div class="col-md-4">
<div class="well select-next">
<a href="/operating-systems.html" class="btn btn-success btn-full"><i class="fa fa-linux fa-inverse fa-2x"></i></a>
<p class="under-btn">
What operating system should I use once the server is set up?
</p>
</div>
</div>
<div class="col-md-4">
<div class="well select-next">
<a href="/platform-as-a-service.html" class="btn btn-success btn-full"><i class="fa fa-puzzle-piece fa-inverse fa-2x"></i></a>
</a>
<p class="under-btn">
Forget servers. Give me the easier platform-as-a-service option.
</p>
</div>
</div>
<div class="col-md-4">
<div class="well select-next">
<a href="/web-servers.html" class="btn btn-success btn-full"><i class="fa fa-exchange fa-inverse fa-2x"></i></a>
<p class="under-btn">
I'll install Linux as my OS. Which web server should I use?
</p>
</div>
</div>
</div> </div>
<div class="col-md-offset-1 col-md-3" id="sidebar">
<div class="panel panel-success">
<div class="panel-heading"><h3 class="panel-head">Servers</h3></div>
<div class="panel-body">
<a href="/">Full Stack Clojure</a> is an open book that explains
each Clojure web application stack layer and provides the
best web resources for those topics.
<hr/>
<a href="http://twitter.com/mattmakai">Matt Makai</a> designed and
wrote this site with assistance from community pull
requests. If you're on GitHub you can
<a href="https://github.com/makaimc">follow him</a>
to see what daily changes are made or
<a href="https://github.com/makaimc/fullstackclojure.github.io">star the repository</a> for future reference.
</div>
</div>
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-head">Table of Contents</h3>
</div>
<div class="list-group">
<a href="/introduction.html" class="list-group-item smaller-item ">Introduction</a>
<a href="/web-frameworks.html" class="list-group-item smaller-item ">Web Frameworks</a>
<a href="/compojure.html" class="list-group-item smaller-item ">Compojure</a>
<a href="/deployment.html" class="list-group-item smaller-item ">Deployment</a>
<a href="/servers.html" class="list-group-item smaller-item active">Servers</a>
<a href="/platform-as-a-service.html" class="list-group-item smaller-item ">Platform-as-a-service</a>
<a href="/best-clojure-resources.html" class="list-group-item smaller-item ">Best Clojure Resources</a>
<a href="/about-author.html" class="list-group-item smaller-item ">About the Author</a>
<a href="/change-log.html" class="list-group-item smaller-item ">Change Log</a>
<a href="/future-directions.html" class="list-group-item smaller-item ">Future Directions</a>
</div>
</div>
</div></div>
<hr/>
<div class="footer pull-right">
<a href="http://www.mattmakai.com/" class="underline">Matt Makai</a>
2014
</div>
</div>
<script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
<script src="theme/js/bootstrap.min.js"></script>
</body>
</html>