1B. Django 1.8 Server Build - CentOS 7 hosted on VPS (multi-domain hosting setup)
This is a complementary material to the previous article: 1. Setup CentOS 7 hosted on VPS
In this tutorial, we'll add another domain (einsteinish.com) to the same server with ip 45.79.90.218 where we're already hosting sfvue.com.
The process of adding additional domain is not much different from the one adding an initial domain.
Let's see current status of our server environment.
Select "Remote Access" from the top menu:
LinodeManagerRemoteAccess.pngWe've already setup ssh in our previous tutorial.
See Setting Domain Names to Use Linode's Name Servers.
After we purchase a domain, the next step is setting our domain registrar to use our name servers. Use our domain name registrar's interface to set the name servers for our domain name to the following entries:
ns1.linode.com ns2.linode.com ns3.linode.com ns4.linode.com ns5.linode.com
We can find the list of name servers in the next section when we try to add a new domain zone.
Before we can add any DNS records, we must create a domain zone â a container for DNS records associated with a single domain name. The Linode Manager allows us to add new domain zones, import domain zones from other DNS servers, clone existing zones that we've already created in the DNS Manager, check to make sure that a zone is correctly loaded, view the raw output of a zone file, and permanently remove a zone and all associated DNS records.
If we have just purchased a new domain name, the first step is to add a new domain zone in the DNS Manager. This creates a container for the DNS records for our domain name. If we don't know what DNS records to add, the DNS Manager can insert some basic records when we create the new domain zone.
We've already setup a zone for sfvue.com:
CurrentDNSManager.pngBy clicking the sfvue.com, we can see how our existing setup looks like:
dnsManager-sfvue-com.pngNow, it's time to add a zone for our second domain, einsteinish.com.
From the DNS Manager tab, select the Add a domain zone link.
Enter the domain name in the Domain field, and also enter an administer's email address in the SOA Email field.
AddingMasterZoneEinsteinish.pngClick Add a Master Zone. Then, the following page appears with our domain zone information, and it's virtually identical to the sfvue.com's zone info we saw earlier:
DNS-Records-Einsteinish.pnggUnder normal circumstances, there's no reason to suspect any problem with our domain zones or DNS records, but sometimes things go wrong. We can use the Check zone feature to verify that our domain zone is working correctly.
In order to check the status of our domain zone, from within the DNS Manager, click the Zone file option to the far right of our chosen domain zone.
CheckDNSZonesforTheTwoDomains.png
A webpage with the results of the einsteinish.com domain zone check will then appear:
EinsteinishCheckGood.pngOur first domain zone for sfvue.com stays good as well:
SFvueZoneGood.pngIf we see a message stating that our zone looks good, everything is working correctly; otherwise, check if all of the DNS records in our domain zone are properly configured.
The DNS Manager allows us to view the contents of a domain zone file. This is especially useful should we need to import the zone to a different server, or if we wish to inspect the file.
We can view the contents of the domain zone file through the DNS Manager tab of our Linode Manager. From there, select the Zone file link to the far right column of our chosen domain's name.
CheckDNSZonesforTheTwoDomains.pngTo see the zone file for our new einsteinish.com domain, click the Check option to the far right of our chosen domain zone:
ZoneFIleEinsteinish.pngOnce we've created a domain zone, we can start filling it with DNS records. DNS records are the link between our domain and our virtual private server. We'll see how to add, edit, and remove DNS records.
Should we remove our Linode(s), we will no longer be able to use Linode's DNS Manager to host our domain zones.
Our new domain einsteinish.com is registered via GoDaddy.
Here are the steps:
- Log in to the GoDaddy.com Account Manager.
- Select Manage Domains from the Domain Names drop-down menu or the Manage Your Account list.
- Select the domain name (einsteinish.com) we wish to modify using the checkboxes and then click Set Name Servers.
- Enter our updated name server information in the spaces provided under the Name Servers heading.
NameServerSetting1.png
Click "Enter custom nameservers":
AddNameServerGoDaddy.png
and click OK.
NameServerSettingsSaveGoDaddy.png
Save Changes at the bottom. -
We need to setup DNS Zone file: pointing to Linode. Here is the initial screen shot:
DNSZoneFileGoDaddy1.png
Select "Edit" icon on the right, then put the domain name and ip-address of target host (in our case, it'll be hosted on Linode server with ip 45.79.90.218).
EditZoneRecordGoDaddy.pngClick "Finish". Here is our updated Zone file info:
UpdatedDNSZoneFile.png
GoDaddyDomains.png
If we've just made a DNS change and aren't seeing it reflected yet, try waiting 48 hours. DNS updates will take effect, or propagate, within the time period set by our zone file's TTL. In some cases the new information may not be reflected for up to 48 hours.
While we can't control DNS caching at every point on the internet, we do have control over our web browser. Try holding down the Shift key or the Control key (depending on browser) while we refresh the page to bypass our browser's cache of the old DNS data. We can also try bringing up our site in an alternate browser, or Previewing Our Website Without DNS.
In this sample, we have two domains sfvue.com and einsteinish.com which are using Django framework.
References are:
- 1. Setup CentOS 7 hosted on VPS
- 1B. Setup CentOS 7 hosted on VPS (multi-domain hosting setup) - Name server and Zone File settings (from GoDaddy to Linode)
- A sample production app (sfvue.com) with virtualenv and Apache
In this section, we'll only deal with Apache configuration for name-based multiple domain server.
The configurations are available in /etc/httpd/sites-available folder:
$ ls /etc/httpd/sites-available einsteinish.com.conf sfvue.com.conf
Also, we have aliases for the two domain in /etc/httpd/sites-enabled folder:
$ sudo ln -s /etc/httpd/sites-available/sfvue.com.conf /etc/httpd/sites-enabled/sfvue.com.conf $ sudo ln -s /etc/httpd/sites-available/einsteinish.com.conf /etc/httpd/sites-enabled/einsteinish.com.conf $ ls -la /etc/httpd/sites-enabled total 8 drwxr-xr-x 2 root root 4096 Jan 4 13:34 . drwxr-xr-x 8 root root 4096 Dec 17 20:31 .. lrwxrwxrwx 1 root root 47 Jan 4 13:34 einsteinish.com.conf -> /etc/httpd/sites-available/einsteinish.com.conf lrwxrwxrwx 1 root root 41 Jan 3 17:59 sfvue.com.conf -> /etc/httpd/sites-available/sfvue.com.conf
Note that in /etc/httpd/conf/httpd.conf file, we need to add the following line to tell Apache where it can find configuration:
IncludeOptional sites-enabled/*.conf
The configurations files look like this.
/etc/httpd/sites-available/sfvue.com.conf:
<VirtualHost *:80> ServerAdmin webmaster@sfvue.com ServerName sfvue.com ErrorLog /var/www/sfvue.com/logs/error.log CustomLog /var/www/sfvue.com/logs/access.log combined WSGIDaemonProcess sfvue3 python-path=/var/www/django/sfvue3:/var/www/django/sfvue3/venv/lib/python2.7/site-packages WSGIProcessGroup sfvue3 WSGIScriptAlias / /var/www/django/sfvue3/sfvue/wsgi.py Alias /static/ /var/www/django/sfvue3/static/ </VirtualHost> <Directory /> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> WSGIPythonPath /var/www/django/sfvue3/ <Directory "/var/www/django/sfvue3/sfvue"> <Files wsgi.py> Require all granted </Files> </Directory>
/etc/httpd/sites-available/einsteinish.com.conf:
<VirtualHost *:80> ServerAdmin webmaster@einsteinish.com ServerName einsteinish.com ErrorLog /var/www/einsteinish.com/logs/error.log CustomLog /var/www/einsteinish.com/logs/access.log combined WSGIDaemonProcess einsteinish3 python-path=/var/www/django/einsteinish3:/var/www/django/einsteinish3/venv/lib/python2.7/site-packages WSGIProcessGroup einsteinish3 WSGIScriptAlias / /var/www/django/einsteinish3/einsteinish/wsgi.py Alias /static/ /var/www/django/einsteinish3/static/ </VirtualHost> <Directory /> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> WSGIPythonPath /var/www/django/einsteinish3/ <Directory "/var/www/django/einsteinish3/einsteinish"> <Files wsgi.py> Require all granted </Files> </Directory>
Continued to 2. Django 1.8 Server Build - CentOS 7 hosted on Linode : ssh login and firewall
Ph.D. / Golden Gate Ave, San Francisco / Seoul National Univ / Carnegie Mellon / UC Berkeley / DevOps / Deep Learning / Visualization
Django 1.8
Introduction - Install Django and Project Setup
Creating and Activating Models
Hello World A - urls & views
Hello World B - templates
Hello World C - url dispatcher
Hello World D - Models and SQLite Database
MVC - Hello World
Hello World on a Shared Host A
Hello World on a Shared Host B
Hello World - Admin Site Setup
virtualenv
Creating test project on virtualenv
Test project's settings.py
Creating Blog app and setting up models
Blog app - syncdb A
Blog app - syncdb B
Blog app - views and urls
Blog app - templates
Blog app - class based templates
Image upload sample code - local host
Authentication on Shared Host using FastCGI
User Registration on Shared Host A
User Registration with a Customized Form on Shared Host B
Blogs on Shared Host
Serving Django app with uWSGI and Nginx
Image upload sample code - shared host
Managing (Deploying) Static files (CSS, Images, Javascript) on Shared Host
Forum application on a Shared Host
Django Python Social Auth : Getting App ID (OAuth2) - Facebook, Twitter, and Google
Django: Python social auth, Facebook, Twitter, and Google Auth
Django: Python social auth, Facebook, Twitter, and Google Auth with Static files
...
Django 1.8 hosted on Linode VPS ==>
1. Setup CentOS 7 hosted on VPS
1B. Setup CentOS 7 hosted on VPS (multi-domain hosting setup) - Name server and Zone File settings (from GoDaddy to Linode)
2. ssh login and firewall
3. Apache Install
4. Install and Configure MariaDB Database server & PHP
5. Install and Configure Django
6. Model
7. Model 2 : populate tables, list_display, and search_fields
8. Model 3 (using shell)
9. Views (templates and css)
10. Views 2 (home page and more templates)
11. TinyMCE
12. TinyMCE 2
13. ImageField/FileField : Serving image/video files uploaded by a user
14. User Authentication 1 (register & forms)
15. User Authentication 2 (login / logout)
16. User Authentication 3 (password reset) - Sent from Email (gmail) setup etc.
17. User Authentication 4 (User profile & @login_required decorator)
18. User Authentication 5 (Facebook login)
19. User Authentication 6 (Google login)
20. User Authentication 7 (Twitter login)
21. User Authentication 8 (Facebook/Google/Twitter login buttons)
22. Facebook open graph API timeline fan page custom tab 1
23. Facebook Open Graph API Timeline Fan Page Custom Tab 2 (SSL certificate setup)
24. Facebook open graph API timeline fan page custom tab 3 (Django side - urls.py, settings.py, and views.py)
...
A sample production site Django 1.8.7: sfvue.com / einsteinish.com ==>
A sample production app (sfvue.com) with virtualenv and Apache
2. Upgrading to Django 1.8.7 sfvue.com site sample with virtualenv and Apache
(*) Django 1.8.7 einsteinish.com site - errors and fixes
Django 1.8.12 pytune.com site - local with Apache mod_wsgi
Django 1.8.12 pytune.com site - local with Nginx and uWSGI
Django 1.8.12 pytune.com site - deploy to AWS with Nginx and uWSGI
Django Haystack with Elasticsearch and Postgres
Django Compatibility Cheat Sheet
Python tutorial
Python Home
Introduction
Running Python Programs (os, sys, import)
Modules and IDLE (Import, Reload, exec)
Object Types - Numbers, Strings, and None
Strings - Escape Sequence, Raw String, and Slicing
Strings - Methods
Formatting Strings - expressions and method calls
Files and os.path
Traversing directories recursively
Subprocess Module
Regular Expressions with Python
Regular Expressions Cheat Sheet
Object Types - Lists
Object Types - Dictionaries and Tuples
Functions def, *args, **kargs
Functions lambda
Built-in Functions
map, filter, and reduce
Decorators
List Comprehension
Sets (union/intersection) and itertools - Jaccard coefficient and shingling to check plagiarism
Hashing (Hash tables and hashlib)
Dictionary Comprehension with zip
The yield keyword
Generator Functions and Expressions
generator.send() method
Iterators
Classes and Instances (__init__, __call__, etc.)
if__name__ == '__main__'
argparse
Exceptions
@static method vs class method
Private attributes and private methods
bits, bytes, bitstring, and constBitStream
json.dump(s) and json.load(s)
Python Object Serialization - pickle and json
Python Object Serialization - yaml and json
Priority queue and heap queue data structure
Graph data structure
Dijkstra's shortest path algorithm
Prim's spanning tree algorithm
Closure
Functional programming in Python
Remote running a local file using ssh
SQLite 3 - A. Connecting to DB, create/drop table, and insert data into a table
SQLite 3 - B. Selecting, updating and deleting data
MongoDB with PyMongo I - Installing MongoDB ...
Python HTTP Web Services - urllib, httplib2
Web scraping with Selenium for checking domain availability
REST API : Http Requests for Humans with Flask
Blog app with Tornado
Multithreading ...
Python Network Programming I - Basic Server / Client : A Basics
Python Network Programming I - Basic Server / Client : B File Transfer
Python Network Programming II - Chat Server / Client
Python Network Programming III - Echo Server using socketserver network framework
Python Network Programming IV - Asynchronous Request Handling : ThreadingMixIn and ForkingMixIn
Python Coding Questions I
Python Coding Questions II
Python Coding Questions III
Python Coding Questions IV
Python Coding Questions V
Python Coding Questions VI
Python Coding Questions VII
Python Coding Questions VIII
Python Coding Questions IX
Python Coding Questions X
Image processing with Python image library Pillow
Python and C++ with SIP
PyDev with Eclipse
Matplotlib
Redis with Python
NumPy array basics A
NumPy Matrix and Linear Algebra
Pandas with NumPy and Matplotlib
Celluar Automata
Batch gradient descent algorithm
Longest Common Substring Algorithm
Python Unit Test - TDD using unittest.TestCase class
Simple tool - Google page ranking by keywords
Google App Hello World
Google App webapp2 and WSGI
Uploading Google App Hello World
Python 2 vs Python 3
virtualenv and virtualenvwrapper
Uploading a big file to AWS S3 using boto module
Scheduled stopping and starting an AWS instance
Cloudera CDH5 - Scheduled stopping and starting services
Removing Cloud Files - Rackspace API with curl and subprocess
Checking if a process is running/hanging and stop/run a scheduled task on Windows
Apache Spark 1.3 with PySpark (Spark Python API) Shell
Apache Spark 1.2 Streaming
bottle 0.12.7 - Fast and simple WSGI-micro framework for small web-applications ...
Flask app with Apache WSGI on Ubuntu14/CentOS7 ...
Selenium WebDriver
Fabric - streamlining the use of SSH for application deployment
Ansible Quick Preview - Setting up web servers with Nginx, configure enviroments, and deploy an App
Neural Networks with backpropagation for XOR using one hidden layer
NLP - NLTK (Natural Language Toolkit) ...
RabbitMQ(Message broker server) and Celery(Task queue) ...
OpenCV3 and Matplotlib ...
Simple tool - Concatenating slides using FFmpeg ...
iPython - Signal Processing with NumPy
iPython and Jupyter - Install Jupyter, iPython Notebook, drawing with Matplotlib, and publishing it to Github
iPython and Jupyter Notebook with Embedded D3.js
Downloading YouTube videos using youtube-dl embedded with Python
Machine Learning : scikit-learn ...
Django 1.6/1.8 Web Framework ...