Linux - Creating User for a Webserver
Updated at 2015-07-25 13:33
It's pretty much common knowledge that you shouldn't run your servers as root. Here are small snippets that help creating webserver user.
groupadd webservers
useradd -m -g webservers webserver-main
# add user to other groups that it needs to function
usermod -a -G docker webserver-main
usermod -a -G crontab webserver-main
passwd webserver-main
# <LONG_AND_SECURE_PASSWORD>
# lock the account so it cannot be accessed with the password
usermod -L webserver-main
su webserver-main # now you can switch to that user
whoami # => webserver-main
groups # => webservers docker crontab
Most likely you want to setup some SSH keys for git repos etc. :
cd ~
mkfile .ssh
cd .ssh
ssh-keygen
# id_source_destination
# Enter, Enter, Enter
touch config
vim config
# Host bitbucket.org
# IdentityFile ~/.ssh/id_source_destination
Now you are ready to install git and clone your server to the server! Keep all files inside ~/ and never sudo
anything inside the user and everything is good.
If you need files that multiple webserver users need to access, you can change the files group and group access permissions.
To setup environment variables premantently:
cd ~
touch .bashrc # for non-login shell
vim .bashrc
# export ENV=production
touch .bash_profile # for login shell
vim .bash_profile
# if [ -f ~/.bashrc ]; then
# source ~/.bashrc
# fi
Now start your server, e.g. with Docker:
docker run \
--name my-webserver \
-p 8080:2368 \
--restart=always \
-d -v /home/webserver-main/my-webserver:/var/lib/webserver \
-e NODE_ENV=production \
<OWNER>/<IMAGE>:<TAG>
And configure nginx:
sudo apt-get install nginx
# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
# /etc/nginx/conf.d/nginx-my-webserver-docker-upstream.conf
upstream docker {
server 127.0.0.1:8080;
keepalive 256;
}
# /etc/nginx/sites-available/my-webserver.conf
# cd /etc/nginx/sites-enabled
# ln -s ../sites-available/my-webserver.conf .
map $http_upgrade $connection_upgrade {
default "upgrade";
"" "";
}
server {
listen 80;
gzip on;
gzip_comp_level 4;
gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
access_log /var/log/nginx/access.log;
location / {
proxy_pass http://docker;
proxy_http_version 1.1;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}