This manual provide information about how to setup Ubuntu server to work as web server. I personally use Python language to bild my applications with Django framework. But you can find useful informaton for your use case, for example - you learn how to setup Postfix to send emails from your server to real users.
NOTE. You can use a script fabfile.py that allows you to run command
fab init_server
to install all required packages on your new Ubuntu server. This script is under development.
On local Linux/Mac:
- generate ssh key (if you don't have one):
ssh-keygen -t rsa
- copy key to use on server
cat ~/.ssh/id_rsa.pub
- connect to server via ssh
ssh username@ip-address
On server (Ubuntu):
- add your SSH key to your server
.ssh/known_hosts
(that you copied before) - disconnect from server and try connect again
ssh username@ip-address
(should not ask for password) sudo apt-get update && sudo apt-get upgrade
sudo apt-get install python-pip python-dev nginx git memcached
sudo apt-get install libjpeg-dev
- to work with images. See other formats
Postgres
sudo apt-get install postgresql postgresql-contrib libpq-dev
# create database for your website
sudo su - postgres
psql
# > CREATE DATABASE `myproject` DEFAULT CHARACTER SET utf8;
# > CREATE USER myprojectuser WITH PASSWORD 'password';
# > GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
# > \q
# return to original user
exit
MySQL
sudo apt-get install mysql-server libmysqlclient-dev
sudo mysql_install_db && sudo mysql_secure_installation
# create database for your website
mysql -u root -p
# > CREATE DATABASE `myproject` DEFAULT CHARACTER SET utf8;
# > CREATE USER myprojectuser@localhost IDENTIFIED BY 'password';
# > GRANT ALL PRIVILEGES ON myproject.* TO myprojectuser@localhost;
# > FLUSH PRIVILEGES;
# > \q
# fix problem with timezone like this "Database returned an invalid value in QuerySet.dates()"
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
You can restore your database from dump if you migrate data from old server.
This allow you to work with multiple projects on a single server. You can install different versions of django or other python packages on the same server. For example, project1 can work on django 1.6 and project2 can work on django 1.8.
Install python virtualenv:
sudo pip install virtualenv virtualenvwrapper
nano ~/.bashrc
# add this line to end of file:
# source /usr/local/bin/virtualenvwrapper.sh
# save and close file (Ctrl + X then Y)
# apply changes to use autocomplitions
source ~/.bashrc
Create new virtual environment for your website: mkvirtualenv projectname
. To switch virtualenv to your project - type workon projectname
.
To create virtual environment with python3
support you need to specify path to specific version of python.
# get path to python3 and use it below
$ which python3
/usr/local/bin/python3
$ mkvirtualenv -p /usr/local/bin/python3 projectname
# or this shortcut
mkvirtualenv projectname --python=$(which python3)
# setup SSH key and add this server public key to github/bitbucket
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub
# clone your project to your user directory
git clone [email protected]:username/projectname.git
cd ~/projectname
pip install -r requirements.txt
pip install gunicorn
Edit 'local_settings.py' of your django project:
- add database settings in
DATABASES
section STATIC_ROOT = os.path.join(BASE_DIR, "static/")
- be sure that your
settings.py
includelocal_settings.py
Make migrations:
chmod +x manage.py
# you don't need to run these commands if you restored database from dump
./manage.py makemigrations
./manage.py migrate
./manage.py createsuperuser
./manage.py collectstatic
Test django project in work. Run ./manage.py runserver 0.0.0.0:8000
and open your website http://ip-address:8000
Run website to be served via gunicorn:
cd ~/myproject
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
Visit your website http://ip-address:8000
to test it in work. After this press Ctrl + X
to exit from gunicorn session. Then run deactivate
to exit from project virtualenv.
Edit file sudo nano /etc/init/gunicorn.conf
and paste this content ()replace projectname
and user
to correct values):
description "Gunicorn application server handling projectname"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid user
setgid www-data
chdir /home/user/projectname
exec /home/user/.virtualenvs/projectname/bin/gunicorn --workers 3 --bind unix:/home/user/projectname/projectname.sock projectname.wsgi:application
Start gunicorn sudo service gunicorn start
.
Paste content to this file sudo nano /etc/nginx/sites-available/projectname
:
server {
listen 80;
server_name server_domain_or_IP;
# limit on upload file (up to 10 MB)
client_max_body_size 10M;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/user/projectname;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/user/projectname/projectname.sock;
}
}
Next steps:
- save this file
- enable this new website with command:
sudo ln -s /etc/nginx/sites-available/projectname /etc/nginx/sites-enabled
- test that nginx configured without errors:
sudo nginx -t
- restart nginx:
sudo service nginx restart
- visit your website
Read:
- How To Set Up Django with Postgres, Nginx, and Gunicorn on Ubuntu 14.04
- How To Add and Delete Users on an Ubuntu 14.04 VPS
sudo apt-get update
sudo apt-get install postfix
Use your real hostname, for example: mywebsite.com
Edit lines (use your hostname): sudo nano /etc/postfix/main.cf
myhostname = mywebsite.com
virtual_alias_maps = hash:/etc/postfix/virtual
# Uncomment these lines:
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
Add mapping for emails that you want to redirect: sudo nano /etc/postfix/virtual
[email protected] admin office
[email protected] admin office sales
[email protected] admin
And add appropriate "aliases" for recipient addresses: sudo nano /etc/aliases
# See man 5 aliases for format
postmaster: root
admin: [email protected]
sales: [email protected]
office: [email protected]
Compile emails database AND restart postfix:
# Build the /etc/aliases.db
sudo newaliases
# Restart the postfix service to have all changes applied
sudo postmap /etc/postfix/virtual
sudo service postfix reload
sudo service postfix restart