Archive for the ‘Web Servers’ Category

Generarea si instalarea unui certificat SSL cu Nginx si openSSL

misc-cookiePrimul pas este crearea unui folder in care vom stoca certificatul: /etc/nginx/ssl

mkdir /etc/nginx/ssl

cd /etc/nginx/ssl

Acum creem Server Key si Certificate Signing Request pentru certificat:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/server.key -out /etc/nginx/ssl/server.crt

Aici urmeaza un wizzard pe care il vom parcurge si la care cea mai importanta linie este cea a common name-ului unde tebuie introdus domeniul pentru carte am generat certificatul.

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:NYC
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Awesome Inc
Organizational Unit Name (eg, section) []:Dept of Merriment
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:webmaster@awesomeinc.com

Acum ca am terminat cu generarea efectiva a certificatului urmeaza configurarea lui din nginx. Asadar in VirtualHost-ul siteului example.com pentru care am creat certificatul, adaugam:

# HTTPS server
server {
listen 443;
server_name example.com;

root /usr/share/nginx/www;
index index.html index.htm;

ssl on;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
}

Acum o alta problema care apare este aceea ca pagina functioneaza si cu http si cu https, iar noi vrem sa mearga doar cu https, asa ca mai adaugam un:

rewrite ^ https://$server_name$request_uri? permanent;

in bucla unde este pus „listen 80”. Ca sa imi fie mai simplu eu am facut in felul urmator; Pentru inceput am modificat listen 80 in 443 fara sa mai adaug liniile de configurare pentru portul 443, air dupa ce am restartat nginx si am vazut ca functioneaza, deasupra buclei server listen 443 am mai adaugat un server listen 80 cu conditie de redirectare 80 -> 443 astfel:

server {
listen 80;
server_name my.domain.com;
rewrite ^ https://$server_name$request_uri? permanent;
}

Restart la Nginx si totul ar trebui sa functioneze corect.

Rulare VirtualHosts ca useri separati (pool-uri separate) in Nginx cu php5-FPM si Ubuntu 12.04 LTS

nginx_logoIn tutorialul anterior am prezentat instalarea Nginx cu php5-FPM in Ubuntu 12.04 LTS. Procedura instalarii este destul de simpla, insa ceva mai complicata este rularea Virtualhost-urilor ca si useri separati, mai precis pentru fiecare user un pool in care va rula php-ul. Totusi fata de Apache, procedura este mai simpla, intrucat Nginx din start a fost gandit sa functioneze usor ca si proxy & load balancing server si sa ruleze la fel de usor php-ul ca si useri separati pentru ca dupa cum stim, este destul de outdated sa rulam toate siteurile de pe un server ca si userul www-data.

Astfel, configurarile pentru php-fpm se afla in folderul /etc/php5/fpm/pool.d. Daca ne uitam acolo avem deja creat www.conf care este atribuit sa ruleze cu userul www-data, respectiv 127.0.0.1:9000.

Daca vrem ca un alt VirtualHost sa ruleze ca si alt user afla tin alt grup, prima data trebuie sa creem userul si grupul. Voi creea grupul web si userul web_test ca si parte din grupul web:

groupadd web
useradd -s /bin/false -d /home/web_test -m -g web web_test

Acum trebuie sa creem virtualhost pentru siteul care va rula cu userul web_test.

vim /etc/nginx/sites-available/web_test

care trebuie sa arate cam asa:

server {
listen 80; ## listen for ipv4; this line is default and implied
# listen [::]:80 default ipv6only=on; ## listen for ipv6

root /home/web_test/www;
index index.html index.htm;

# Make site accessible from http://localhost/
server_name webtest.com www.web_test.com;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to index.html
try_files $uri $uri/ /index.html;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9001
#
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# try_files $uri =404;
# # NOTE: You should have „cgi.fix_pathinfo = 0;” in php.ini
#
# # With php5-cgi alone:
fastcgi_pass 127.0.0.1:9001;
# With php5-fpm:
#fastcgi_pass unix:/var/run/php5-fpm/web_test.sock;
fastcgi_index index.php;
include fastcgi_params;
}

# deny access to .htaccess files, if Apache’s document root
# concurs with nginx’s one
#
location ~ /\.ht {
deny all;
}
}

Acum trebuie sa creem folderul php5-fpm unde se va crea socketul pentru siteul respectiv:

mkdir -p /var/run/php5-fpm

Urmeaza sa creem pool-ul pentru siteul web_test:

vim /etc/php5/fpm/pool.d/web_test.conf

unde adaugam:

[web_test]
listen = 127.0.0.1:9001
user = web_test
group = web
;request_slowlog_timeout = 5s
;slowlog = /var/log/php-fpm/slowlog-blog.log
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 4
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 200
listen.backlog = -1
pm.status_path = /status
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

este important aici sa fie definit un port diferit fata de cel implicit, mai precis pentru fiecare VirtualHost sa existe un port separat pe care fcgi sa asculte. Cel default, dupa cum se vede ruleaza fcgi cu 127.0.0.1:9000, iar pentru acesta web_test am alocat: 9001. Portul trebuie sa fie definit atat in pool cat si in VirtualHost.

Odata finalizate configurarile trebuie restartat atat nginx cat si php5-fpm:

/etc/init.d/nginx restart && /etc/init.d/php5-fpm restart

Testarea:

O putem face fie din phpinfo, sau ruland whoami.

Pentru phpinfo: vim /home/web_test/www/info.php unde adaugam:

<?php phpinfo(); ?>

Pentru whoami: vim /home/web_test/www/whoami.php unde adaugam:

<?php
echo exec('whoami');
?>

Instalare Nginx cu php5-FPM in Ubuntu 12.04 LTS

Instalarea Nginx:

apt-get install nginx

Instalarea php5-FPM:

apt-get install php5-common php5-cli php5-fpm

Pornirea Nginx:

/etc/init.d/nginx start

Enable php-FPM:

vim /etc/nginx/sites-available/default

unde trebuie sa decomentam liniile referitoare la „location ~ \.php$ {” astfel incat sa arate asa:

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}

La final restartam nginx si php-fpm ruland:

/etc/init.d/nginx restart
/etc/init.d/php5-fpm restart

Testarea se face cu un info.php sau ruland whoami din php.

In ubuntu 12.10 sau o distributie mai noua trebuie inlocuita linia: fastcgi_pass 127.0.0.1:9000; cu fastcgi_pass unix:/var/run/php5-fpm.sock;

Rularea VirtualHost-urilor ca useri separati folosind Apache-MPM-ITK in Ubuntu/Debian

apacheTrebuie sa mentionez de la bun inceput ca fastCGI este o alternativa mult mai buna poentru ca virtualhosturile sa ruleze ca useri separati. Eu am adoptat aceasta metoda si o adopt in cotninuare pe serverele care sunt in productie, ruleaza multe aplicatii si nu permit downtime decat unul foarte mic pentru aceasta implementare. MPM (Multi Processing Module) ajuta la separarea VirtualHost-urilor astfel ca ele sa ruleze ca useri separati si sa nu mai apara problema ca toate siteurile sa ruleze ca www-data.

Instalarea se face astfel (presupunand ca avem deja Apache2 instalat):

apt-get install apache-mpm-itk

Dupa instalarea modulului urmeaza crearea grupurilor si a userilor. Presupunem creare grupului web cu userul web_test care va fi folosit pentru un anumit VirtualHost.

groupadd web

useradd -s /bin/false -d /var/www/web_test -m -g web web_test #creare userului web_test care va fi inclus in grupul web

In VirtualHost mai trebuie adaugate urmatoarele linii, inainte de </VirtualHost>:

<IfModule mpm_itk_module>
AssignUserId web_test web
</IfModule>

Dupa aceasta procedura se da restart la Apache si ar trebui sa functioneze corect:

service apache2 restart

Evident acum fisierele trebuie sa aiba userul web_test si sa se afle in grupul web:

chown -R web_test:web /var/www/web_test/

Error 400: Size of a request header field exceeds server limit

Eroarea apare de obicei cand browserul incearca sa trimita mai mult decat serverul web poate. De obicei problema este din cauza cookies-urilor. Se poate rezolva fie prin stergerea cookiesurilor din browserul in care a fost incarcata pagina, dar probleme vor reaparea la refresh sau la selectarea unor resurse si astfel se poate creste numarul de cookiesuri, ceea ce nu e prea ok daca este un site destinat mai multor clienti pe care nu ii putem obliga sa isi modifice din browser aceste setari.

Se mai poate rezolva modificand valoarea lui LimitRequestFieldSize care initial este la 8190, setare care se pune in apache2.conf sau httpd.conf, depinde de distributie.

LimitRequestFieldSize 16380

Instalarea unui certificat SSL generat cu OpenSSL in Apache

Aici procedura este destul de simpla si incepe cu generarea certificatului SSL in conditiile in care presupunem ca Apache are incarcat deja mod_ssl si are creat cel putin un VirtualHost in /etc/apache2/sites-available.

Generarea certificatului se face cu comanda:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

Apoi urmeaza sa completam cateva campuri, unde cel mai important este „Common Name” unde trebuie trecut numele de domeniu pentru care a fost generat certificatul.

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:NYC
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Awesome Inc
Organizational Unit Name (eg, section) []:Dept of Merriment
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:webmaster@domain.tld

Apoi se modifica VirtualHost-ul astfel:

<VirtualHost *:443>
ServerName example.com:443

iar lasfarsitul VirtulHost-ului se adauga liniile prin care apelam certificatul si cheia.

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key

Ultima faza este sa dam reload la apache: service apache2 reload si sa accesam linkul in browser folosind https://example.com

HTTP to HTTPS redirect folosind Apache2 cu un server de reverse proxy in fata

Cand folosim o masina virtuala cu Apache pe care rulam un site si vrem ca acesta sa ruleze folosind protocolul HTTPS impreuna cu un certificat SSL, iar in fata serverului avem un reverse proxy care este pe un alt server, atunci redirectarea si instalarea certificatului SSL trebuie sa fie pe reverse proxy, in zadar fiind pe masina virtuala.

Astfel, redirectarea HTTP to HTTPS permanenta la accesul http://srv.standdupp.ro care sa fie trimis spre https://srv.standdupp.ro trebuie sa se faca din reverse proxy astfel:

<VirtualHost *:80>

ServerName srv.standdupp.ro
# Creem aici redirectarea 80 to 443
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

</VirtualHost>

Apoi creem VirtualHost pentru HTTPS

<VirtualHost *:443>

ServerName srv.standdupp.ro
Order deny,allow
Allow from all

ProxyPreserveHost On
ProxyPass / http://ip_masina_virtuala/
ProxyPassReverse / http://ip_masina_virtuala/

</VirtualHost>

Instalare Redmine in Ubuntu 12.04 LTS folosind Apache cu Mod-Passenger si MySQL

Rularea Redmine in Ubuntu se face folosind Apache cu mod Passenger intrucat este o aplicatie care foloseste Ruby.
Pentru instalare in Ubuntu 12.04 se urmeaza pasii urmatori:

Instalarea Apache, Mod_passenger si MySQL, care bine-nteles ca va instala si Ruby si toate celalate dependinte de care Redmine mai are nevoie:

sudo apt-get install apache2 libapache2-mod-passenger
sudo apt-get install mysql-server mysql-client

Aici se defineste o parola pentru userul root de la MySQL de cae vom avea nevoie mai tarziu la crearea bazei de date si a userului cu care va rula Redmine. Nu este recomandat sa folosim userul root pentru rularea bazei de date Redmine.

Instalarea pachetului Redmine:

sudo apt-get install redmine redmine-mysql

In Wizzardul deschis, alegem Yes, MySQL si definim apoi parola de la userul root al MySQL pentru ca sistemul sa se poata conecta si sa poata crea un user dedicat in MySQL pentru Redmine pentru care ne va cere si o parola.

Acum editam /etc/apache2/mods-available/passenger.conf pentru a adauga linia care defineste userul cu care va rula Redmine: PassengerDefaultUser www-data


PassengerDefaultUser www-data
PassengerRoot /usr
PassengerRuby /usr/bin/ruby

Acum creem un symlink ca sa aiba si el fisierele in /var/www/redmine:

sudo ln -s /usr/share/redmine/public /var/www/redmine

Pentru teste eu am folosit VirtualHost-ul default, asa ca am mai adaugat un


RailsBaseURI /redmine
PassengerResolveSymlinksInDocumentRoot on

Acum ca instalarea a fost dusa la bun sfarsit se poate accesa redmine din browser:

http://hostname/redmine

iar conectarea la admin se face cu userul admin si parola definita in Wizzard.

Fisierul in care este declarata conexiunea la baza de date este: /etc/redmine/default/database.yml in cazul in care la un moment dat se face backup sau se modifica parola userului MySQL.

Pentru o instalare mai complexa se poate urma tutorialul: http://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_in_Ubuntu

Password protect pe un folder folosind Nginx

Proce dura este aproape la fel de usoara ca si pe Apache, doar ca la Nginx presupune urmarea altor pasi.
Metoda care am adoptat-o eu pentru crearea unui .htpasswd cu Nginx este urmatoarea;

In VirtualHostul Nginx adaugam conditia de autentificare cu user si parola astfel:

location / {
auth_basic „Auth Required”;
auth_basic_user_file .htpasswd;
}

Apoi creem .htpasswd unde alocam userul si parola. Aici e putin mai diferit fata de Apache, mai ales daca vrem sa NU folosim pachetul apache-utils.

touch .htpasswd
chown root:www-data .htpasswd
chmod 640 .htpasswd #Nu trebuie sa fie citibil decat de proces

Apoi adaugam userii in .htpasswd. De cate ori se ruleaza comanda, se adauga un user in fisier.

printf „User_Name:$(openssl passwd -apr1 Parola_dorita)\n” >> .htpasswd # Acest model foloseste Apache MD5 Encryption

sau

printf „User_Name:$(openssl passwd -1 Parola_dorita)\n” >> .htpasswd # Acest model foloseste MD5 encryption

Metoda aceasta se urmeaza daca dorim sa stocam fisierul .htpasswd in acelasi folder cu DocumentRoot-ul declarat in Virtualhost.
Daca dorim sa stocam .htpasswd in /etc/nginx atunci in VirtualHost, in interiorul

Server{

}

adaugam:

auth_basic „Auth Required”;
auth_basic_user_file .htpasswd;

In acest caz ar fi indicat sa stocam htpaswd-ul sub forma Nume_Virtualhost.htpasswd ca sa nu le incurcam.

Password protect pe un folder folosind Apache

In cazul in care vrem ca un domeniu sau un folder sa fie protejat cu user si parola, trebuie sa urmam urmatorii pasi:

In .htaccess se adauga conditia de autentificare:

AuthUserFile /var/www/.htpasswd
AuthType Basic
AuthName „Auth Required”
Require valid-user

Dupa ce am modificat .htaccess, urmeaza creearea unui user si implicit a fisierul .htpasswd unde se stocheaza userii si parolele criptate.

htpasswd -c .htpasswd user_name

Sistemul ne va cere o parola, alocam aceasta parola, iar apoi vom putea accesa linkul folosind userul si parola definite aici.

Daca vrem sa protejam doar unele fisiere, in .htaccess conditia se modifica putin:

AuthUserFile /var/www/.htpasswd
AuthType Basic
AuthName „Auth Required”
<Files „nume_fisier.html”>
Require valid-user
</Files></blockquote>

srv StandDuPp
Articole recente