пятница, 22 февраля 2013 г.

Сравнение директив Apache и Nginx

Пример файла HOSTS /etc/hosts

192.168.100.1   odin.example.com
192.168.100.80  fenris.asgard.com fenris
192.168.100.10  loki.asgard.com loki

--------------------------------------------------------------------

Apache Конфиг

C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf

Nginx Конфиг

С:\nginx-1.2.6\conf\nginx.conf

--------------------------------------------------------------------

Apache Запись правил

<Directory /home>
    ...
</Directory>

Nginx Запись правил

http {
    ...
}

--------------------------------------------------------------------

Apache Пользователь сервера и его группа

User apache
Group 506

Nginx Пользователь сервера и его группа

user dima rabota; # имя пользователя и его группа

--------------------------------------------------------------------

Apache Ограничение зоны действия директив для файлов внутри папки и ее внутренних подпапок

<Directory /home/site2>
    ...
</Directorr>

<Directory "/home/site[1-3]">
    ...
</Directory>

Nginx Ограничение зоны действия для файлов внутри папки и ее внутренних подпапок

--------------------------------------------------------------------

Apache Ограничение зоны действия директив по URL

<Location /stuff>
    order deny, allow
    deny from all
    allow from 127.0.0.1
</Location>

<LocationMatch "/status[1-3]">
    order deny, allow
    deny from all
    allow from 127.0.0.1
</Location>

Nginx Ограничение зоны действия директив по URL

location /admin/ {
    index.php;
    access_log off;
    access_log log/main.log;
    log_format main '$pid - $nginx_version - $remote_addr';
    log_not_found on;
}

--------------------------------------------------------------------

Apache Ограничение зоны действия применительно к отдельному файлу или к нескольким файлам

<Files .htaccess>
    Order deny, allow
    Deny from all
</Files>

<FilesMatch "/pic[1-3].jpg">
    Order deny, allow
    Deny from all
</FilesMatch>

Nginx Ограничение зоны действия применительно к отдельному файлу или к нескольким файлам

--------------------------------------------------------------------

Apache Используемые директивы внутри скобок <Directory >, <Location >, <Files >

AllowOverride All - разрешить перезаписать сходные директивы в файле .htaccess
AllowOverride None - запретить перезаписать сходные директивы в файле .htaccess

order allow, deny - задать порядок следования ниже лежащих директив (разрешить, затем запретить)
order deny, allow - задать порядок следования ниже лежащих директив (запретить, затем разрешить)

allow - задать IP-адрес или доменное имя, которому будет разрешен запрос к серверу.
deny - задать IP-адрес или доменное имя, которому будет запрещен запрос к серверу.

allow from all - разрешить всем IP-адресам или доменным именам отправлять запрос к серверу.
deny from all - запретить всем IP-адресам или доменным именам отправлять запрос к серверу.

Nginx Используемые директивы внутри скобок location

--------------------------------------------------------------------

Apache Папка, в которой по умолчанию будут располагаться все HTML-файлы

DocumentRoot /opt/apache/htdocs

Nginx Папка, в которой по умолчанию будут располагаться все HTML-файлы

location / {
    root html;
}

--------------------------------------------------------------------

Apache Дефолтные имена файлов, которые будут являться главными HTML-файлами

DirectoryIndex index.html index.htm index.cgi index.shtml

Nginx Дефолтные имена файлов, которые будут являться главными HTML-файлами

location / {
    index index.html index.htm;
}

--------------------------------------------------------------------

Apache MimeType по умолчанию, если MimeType сервер не смог определить

DefaultType text/plain

Nginx MimeType по умолчанию, если MimeType сервер не смог определить

default_type application/octet-stream;

--------------------------------------------------------------------

Apache Alias - Cвязывание соотвествия URL-адреса месту расположения файлов в папке на жестком диске сервера

Alias /адрес/ /папка/на/жестком/диске/с/картинками/например/

Nginx Alias - Cвязывание соотвествия URL-адреса месту расположения файлов в папке на жестком диске сервера

location /admin/ {
    alias /var/www/locked/;
}

--------------------------------------------------------------------

Apache Добавить ассоциацию с Mimetype

AddType application/x-httpd-php .php

Nginx Добавить ассоциацию с Mimetype

types {
    mimetype1 extension1;
    mimetype2 extension2 [extension3…];
    […]
}

location /downloads/ {
    types {
        mimetype1 extension1;
    }
}

--------------------------------------------------------------------

Apache Определение браузера по user-agent

BrowseMatch Mozilla/2 nokeepalive

Nginx Определение браузера по user-agent

$http_user_agent

--------------------------------------------------------------------

Apache Корневой каталог сервера

ServerRoot /opt/apache

Nginx Корневой каталог сервера

root /home/website.com/public_html;

--------------------------------------------------------------------

Apache Задание папки для записи файла логов об ошибках

ErrorLog logs/error_log

Nginx Задание папки для записи файла логов об ошибках

error_log logs/error.log;

--------------------------------------------------------------------

Apache Ограничение времени существования неактивных соединений

Timeout 150 (секунд)

Nginx Ограничение времени существования неактивных соединений

client_body_timeout 3m;
client_body_timeout 180s;

--------------------------------------------------------------------

Apache Разрешить поддержание устойчивых соединений

KeepAlive On
KeepAliveTimeout 15

Nginx Разрешить поддержание устойчивых соединений

http {
    keepalive_timeout 65;
}

--------------------------------------------------------------------

Apache Задание прослушивания IP-адреса и порта

Listen 80
Listen 192.168.1.2:80

Nginx Задание прослушивания IP-адреса и порта

server {
    listen 80;
}

--------------------------------------------------------------------

Apache Виртуальный хостинг

<VirtualHost 192.168.1.1>
    ServerName www.example.org
    DocumentRoot /some/other/directory
</VirtualHost>

<VirtualHost www.idiots.org>
    DocumentRoot /some/other/directory
</VirtualHost>

Что можно добавить внутрь скобок <VirtualHost >

ServerName www.site2.com - доменное имя сайта
DocumentRoot /home/site2 - адрес папки с файлами для сайта
ServerAdmin admin@site2.com -  почтовый адрес администратора сайта
ErrorLog /home/logs - адрсе папки для записи логов сервера для сайта
transferLog /home/trans -  адрес папки для записи логов передачи данных от сервера для сайта

Директивы, которые нельзя прописывать внутри скобок виртуального хостинга
BindAddress
Listen
MaxSpareServers
MinSpareServers
MaxRequestPerChild
PidFile
ServerRoot
ServerType
TypeConfig
NameVirtualHost

Отстальное можно.

Nginx Виртуальный хостинг

http {
    server {
        listen 80;
        server_name www.example1.com;
        location / {
            root /var/www/testapp;
            index index.php index.html index.htm;
        }
    }
}

--------------------------------------------------------------------

Apache Proxy Прокси

Listen 8888
<VirtualHost 192.168.100.1:8888>
    ServerName proxy.asgard.com
    ProxyRequests On
</VirtualHost>

<Directory proxy:*>
    order deny, allow
    deny from список IP-адресов
    allow from список IP-адресов
</Directory>

ProxyPass /distant/mirror http://www.tuchman.edu

Nginx Proxy Прокси

server {
    listen 80;
    server_name example1.com;
    access_log /var/www/example1.com/log/nginx.access.log;
    error_log /var/www/example1.com/log/nginx_error.log debug;

    location / {
        include proxy.conf;
        proxy_pass http://127.0.0.1:8080;
    }
}

--------------------------------------------------------------------

Apache Отказ в подступе при попытке загрузки файлов

<Directory />
    Order deny, allow
    Deny from all
</Directory>

<Directory /opt/apache/htdocs>
    Order deny, allow
    Allow from all
</Directory>

<Directory /some/directory>
    order deny, allow
    deny from all
    allow from 192.168.100.0/255.255.252.0
</Directory>

Nginx Отказ в подступе при попытке загрузки файлов

location /admin/ {
    allow 192.168.1.0/24;
    deny all;
}

--------------------------------------------------------------------

Apache Задание бэйсик авторизации

<Directory /some/directory>
    AuthName "Example of Access Control"
    AuthType Basic
    AuthUserFile /etc/security/.htpasswd
    Require valid-user
</Directory>

Nginx Задание бэйсик авторизации

location /admin/ {
    allow 192.168.1.0/24;
    deny all;
    auth_basic "Authentication required";
    auth_basic_user_file conf/htpasswd;
}

--------------------------------------------------------------------

Apache Включение SSL-шифрования

NameVirtualHost 64.22.73.226
<VirtualHost 64.82.73.226>
    ServerName www.securesite.com
    DocumentRoot /home/site3
    SSLEngine on
    SSLCertificate /var/ssl/server.crt
    SSLCACertificateFile /path/to/certificate
    SSLLog /var/log/ssllog
    SSLLogLevel warn  
</VirtualHost>

Можно еще добавить

    SSLCertificetKeyFile /var/ssl/server.key
    SSLCACertificatePath /some/secure/directory
    SSLVerifyClient 1
    SSLVerifyDepth 3

Nginx Включение SSL-шифрования

server {
    listen 443;
    server_name secure.website.com;
    ssl on;
    ssl_certificate /path/to/combined.crt;
    ssl_certificate_key /path/to/secure.website.com.key;
    ...
}


Пример

http {
    ...
    ssl_certificate common.crt;
    ssl_certificate_key common.key;

    server {
        listen 80;
        server_name www.example1.com;
        location / {
            ...
        }
    }

    server {
        listen 443 default ssl;
        server_name payment.example1.com;
        location / {
            ...
        }
    }

    server {
        listen 80;
        listen 443;
        server_name static.example1.com;
        location / {
            root /var/www/www.example1.com/static;
    }

}


--------------------------------------------------------------------

Apache Включение инклюдов Server Side Includes в HTML на стороне сервера

<Location /ssdir>
   Options +Include
</Location>

Nginx Включение инклюдов Server Side Includes в HTML на стороне сервера

server {
    server_name website.com;

    location ~* \.shtml$ {
        ssi on; (разрешить инклюды для этого адреса)
    }

}

<html>
<head>
    <!--# include file="header.html" -->
</head>
<body>
    <!--# include file="body.html" -->
    <!--# include virtual="/footer.php?id=123" -->
</body>
</html>

Команды SSI

<!--# include file="header.html" -->

<!--# include virtual="/sources/header.php?id=123" -->
<!--# include virtual="header.php" wait="yes" -->

<!--# set var="MY_VARIABLE" value="hello" -->
<!--# echo var="MY_VARIABLE" -->

<!--# set var="MY_VARIABLE" value="$MY_VARIABLE there" -->
<!--# echo var="MY_VARIABLE" -->

<!--# if expr="expression1" -->
   ...
<!--# elif expr="expression2" -->
   ...
<!--# else -->
   ...
<!--# endif -->

<!--# config errmsg="Something terrible happened" -->

<!--# config timefmt="%A, %d-%b-%Y %H:%M:%S %Z" -->

--------------------------------------------------------------------

Apache Переадресация через mod_rewrite

Rewriteengine On - включение режима перезаписи URL
RewriteRule ^/$ /apache backup [R] - задание переадресации

RewriteCond

Nginx Переадресация через mod_rewrite

rewrite ^/(.*)\.(png|jpg|gif)$ /image.php? file=$1&format=$2 last;
rewrite "hel{2,}o" /hello.php;
rewrite 'hel{2,}o' /hello.php;

server {
    server_name website.com;
    root /var/www/vhosts/website.com/httpdocs/;

    location /documents/ { (
        rewrite ^/documents/(.*)$ /storage/$1;
    }

}

Частые правила переписывания URL страниц

Поиск для сайта

Input URI     http://website.com/search/some-search-keywords
Rewritten URI http://website.com/search.php?q=some-search-keywords
Rewrite rule  rewrite ^/search/(.*)$ /search.php?q=$1?;


Просмотр профиля пользователя

Input URI     http://website.com/user/31/James
Rewritten URI http://website.com/user.php?id=31&name=James
Rewrite rule  rewrite ^/user/([0-9]+)/(.+)$ /user.php?id=$1&name=$2?;


Передача нескольких параметров в URL

Input URI     http://website.com/index.php/param1/param2/param3
Rewritten URI http://website.com/index.php?p1=param1&p2=param2&p3=param3
Rewrite rule  rewrite ^/index.php/(.*)/(.*)/(.*)$ /index.php?p1=$1&p2=$2&p3=$3?;


Как на Wikipedia

Input URI     http://website.com/wiki/Some_keyword
Rewritten URI http://website.com/wiki/index.php?title=Some_keyword
Rewrite rule  rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1?;


Показать статью на новостном сайте

Input URI     http://website.com/33526/us-economy-strengthens
Rewritten URI http://website.com/article.php?id=33526
Rewrite rule  rewrite ^/([0-9]+)/.*$ /article.php?id=$1?;

Форум

Input URI     http://website.com/topic-1234-50-some-keywords.html
Rewritten URI http://website.com/viewtopic.php?topic=1234&start=50
Rewrite rule  rewrite ^/topic-([0-9]+)-([0-9]+)-(.*)\.html$ /viewtopic.php?topic=$1&start=$2?;

--------------------------------------------------------------------

Apache задание имени сервера

NameVirtualHost 192.168.1.1:80

ServerName www.example.com

Nginx задание имени сервера

http {
    server {
        listen 80; (порт 80)
        server_name example.com; (доменное имя)
    }
}

--------------------------------------------------------------------

четверг, 14 февраля 2013 г.

PostgreSQL Cheat Sheet

CREATE DATABASE

CREATE DATABASE dbName;

CREATE TABLE (with auto numbering integer id)

CREATE TABLE tableName (
 id serial PRIMARY KEY,
 name varchar(50) UNIQUE NOT NULL,
 dateCreated timestamp DEFAULT current_timestamp
);

Add a primary key

ALTER TABLE tableName ADD PRIMARY KEY (id);

Create an INDEX

CREATE UNIQUE INDEX indexName ON tableName (columnNames);

Backup a database (command line)

pg_dump dbName > dbName.sql

Backup all databases (command line)

pg_dumpall > pgbackup.sql

Run a SQL script (command line)

psql -f script.sql databaseName

Search using a regular expression

SELECT column FROM table WHERE column ~ 'foo.*';

The first N records

SELECT columns FROM table LIMIT 10;

Pagination

SELECT cols FROM table LIMIT 10 OFFSET 30;

Prepared Statements

PREPARE preparedInsert (int, varchar) AS
  INSERT INTO tableName (intColumn, charColumn) VALUES ($1, $2);
EXECUTE preparedInsert (1,'a');
EXECUTE preparedInsert (2,'b');
DEALLOCATE preparedInsert;

Create a Function

CREATE OR REPLACE FUNCTION month (timestamp) RETURNS integer 
 AS 'SELECT date_part(''month'', $1)::integer;'
LANGUAGE 'sql';

Table Maintenance

VACUUM ANALYZE table;

Reindex a database, table or index

REINDEX DATABASE dbName;

Show query plan

EXPLAIN SELECT * FROM table;

Import from a file

COPY destTable FROM '/tmp/somefile';

Show all runtime parameters

SHOW ALL;

Grant all permissions to a user

GRANT ALL PRIVILEGES ON table TO username;

Perform a transaction

BEGIN TRANSACTION 
 UPDATE accounts SET balance += 50 WHERE id = 1;
COMMIT;
Basic SQL

Get all columns and rows from a table

SELECT * FROM table;

Add a new row

INSERT INTO table (column1,column2)
VALUES (1, 'one');

Update a row

UPDATE table SET foo = 'bar' WHERE id = 1;

Delete a row

DELETE FROM table WHERE id = 1;

MySQL CheatSheet

Query

SELECT * FROM table
SELECT * FROM table1, table2, ...
SELECT field1, field2, ... FROM table1, table2, ...
SELECT ... FROM ... WHERE condition
SELECT ... FROM ... WHERE condition GROUP BY field
SELECT ... FROM ... WHERE condition GROUP BY field HAVING condition2
SELECT ... FROM ... WHERE condition ORDER BY field1, field2
SELECT ... FROM ... WHERE condition ORDER BY field1, field2 DESC
SELECT ... FROM ... WHERE condition LIMIT 10
SELECT DISTINCT field1 FROM ...
SELECT DISTINCT field1, field2 FROM ...
SELECT ... FROM t1 JOIN t2 ON t1.id1 = t2.id2 WHERE condition
SELECT ... FROM t1 LEFT JOIN t2 ON t1.id1 = t2.id2 WHERE condition
SELECT ... FROM t1 JOIN (t2 JOIN t3 ON ...) ON ...
SELECT ... FROM t1 JOIN t2 USING(id) WHERE condition

Conditionals

field1 = value1
field1 <> value1
field1 LIKE 'value _ %'
field1 IS NULL
field1 IS NOT NULL
field1 IN (value1, value2)
field1 NOT IN (value1, value2)
condition1 AND condition2
condition1 OR condition2

Data Manipulation

INSERT INTO table1 (field1, field2, ...) VALUES (value1, value2, ...)
INSERT table1 SET field1=value_1, field2=value_2 ...
DELETE FROM table1 / TRUNCATE table1
DELETE FROM table1 WHERE condition
-- join:
DELETE FROM table1, table2 WHERE table1.id1 = table2.id2 AND condition
UPDATE table1 SET field1=new_value1 WHERE condition
-- join:
UPDATE table1, table2 SET field1=new_value1, field2=new_value2, ...
WHERE table1.id1 = table2.id2 AND condition

Browsing

SHOW DATABASES
SHOW TABLES
SHOW FIELDS FROM table / SHOW COLUMNS FROM table / DESCRIBE table / DESC table / EXPLAIN table
SHOW CREATE TABLE table
SHOW CREATE TRIGGER trigger
SHOW TRIGGERS LIKE '%update%'
SHOW PROCESSLIST
KILL process_number
SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '**yourdbname**';
$ mysqlshow
$ mysqlshow database

Create / delete / select / alter database

CREATE DATABASE [IF NOT EXIST] mabase [CHARACTER SET charset] [COLLATE collation]
CREATE DATABASE mabase CHARACTER SET utf8
DROP DATABASE mabase
USE mabase
ALTER DATABASE mabase CHARACTER SET utf8

Create/delete/modify table

CREATE TABLE table (field1 type1, field2 type2, ...)
CREATE TABLE table (field1 type1, field2 type2, ..., INDEX (field))
CREATE TABLE table (field1 type1, field2 type2, ..., PRIMARY KEY (field1))
CREATE TABLE table (field1 type1, field2 type2, ..., PRIMARY KEY (field1, field2))
CREATE TABLE table1 (fk_field1 type1, field2 type2, ...,
  FOREIGN KEY (fk_field1) REFERENCES table2 (t2_fieldA)
    [ON UPDATE] [CASCADE|SET NULL|RESTRICT]
    [ON DELETE] [CASCADE|SET NULL|RESTRICT])
CREATE TABLE table1 (fk_field1 type1, fk_field2 type2, ...,
  FOREIGN KEY (fk_field1, fk_field2) REFERENCES table2 (t2_fieldA, t2_fieldB))
CREATE TABLE table IF NOT EXISTS (...)
CREATE TABLE new_tbl_name LIKE tbl_name
  [SELECT ... FROM tbl_name ...]
CREATE TEMPORARY TABLE table (...)
DROP TABLE table
DROP TABLE IF EXISTS table
DROP TABLE table1, table2, ...
DROP TEMPORARY TABLE table
ALTER TABLE table MODIFY field1 type1 
ALTER TABLE table MODIFY field1 type1 NOT NULL ... 
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 NOT NULL ...
ALTER TABLE table ALTER field1 SET DEFAULT ...
ALTER TABLE table ALTER field1 DROP DEFAULT
ALTER TABLE table ADD new_name_field1 type1
ALTER TABLE table ADD new_name_field1 type1 FIRST
ALTER TABLE table ADD new_name_field1 type1 AFTER another_field
ALTER TABLE table DROP field1
ALTER TABLE table ADD INDEX (field);
ALTER TABLE table ADD PRIMARY KEY (field);
-- Change field order:
ALTER TABLE table MODIFY field1 type1 FIRST
ALTER TABLE table MODIFY field1 type1 AFTER another_field
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 FIRST
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 AFTER another_field
ALTER TABLE old_name RENAME new_name;

Keys

CREATE TABLE table (..., PRIMARY KEY (field1, field2))
CREATE TABLE table (..., FOREIGN KEY (field1, field2) REFERENCES table2 (t2_field1, t2_field2))
ALTER TABLE table ADD PRIMARY KEY (field);

Privileges

GRANT ALL PRIVILEGES ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, DELETE ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password';
REVOKE ALL PRIVILEGES ON base.* FROM 'user'@'host'; -- one permission only
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'host'; -- all permissions
SET PASSWORD = PASSWORD('new_pass')
SET PASSWORD FOR 'user'@'host' = PASSWORD('new_pass')
SET PASSWORD = OLD_PASSWORD('new_pass')
DROP USER 'user'@'host'

Main data types

TINYINT (1o: -127+128) SMALLINT (2o: +-65 000)
  MEDIUMINT (3o: +-16 000 000) INT (4o: +- 2 000 000 000)
  BIGINT (8o: +-9.10^18)
  Precise interval: -(2^(8*N-1)) -> (2^8*N)-1
  /!\ INT(2) = "2 digits displayed" -- NOT "number with 2 digits max"
INT NOT NULL auto_increment PRIMARY KEY -- auto-counter for PK
FLOAT(M,D) DOUBLE(M,D) FLOAT(D=0->53) 
  /!\ 8,3 -> 12345,678 -- NOT 12345678,123!
TIME (HH:MM) YEAR (AAAA) DATE (AAAA-MM-JJ) DATETIME (AAAA-MM-JJ HH:MM; années 1000->9999)
  TIMESTAMP (like DATETIME, but 1970->2038, compatible with Unix)
VARCHAR (single-line; explicit size)  TEXT (multi-lines; max size=65535)  BLOB (binary; max size=65535)
  Variants for TEXT&BLOB: TINY (max=255) MEDIUM (max=~16000) LONG (max=4Go)
 Ex: VARCHAR(32), TINYTEXT, LONGBLOB, MEDIUMTEXT
ENUM ('value1', 'value2', ...) -- (default NULL, or '' if NOT NULL)

Forgot root password?

$ /etc/init.d/mysql stop
$ mysqld_safe --skip-grant-tables
$ mysql # on another terminal
mysql> UPDATE mysql.user SET password=PASSWORD('nouveau') WHERE user='root';
## Kill mysqld_safe from the terminal, using Control + \
$ /etc/init.d/mysql start

Repair tables after unclean shutdown

mysqlcheck --all-databases
mysqlcheck --all-databases --fast

load data from local file

If you are running mysql and using your newly created database use the below code to run the script file mysql> SOURCE input_file
from terminal mysql -u root -p database < filename-20120201.tbz

Краткое руководство по директивам Nginx

Управление nginx

nginx -s stop (выйти немедленно)
nginx -s quit (выйти обычным образом)
nginx -s reopen (переоткрыть log файлы)
nginx -s reload (перезагрузить конфигурацию)

killall nginx (убить все сервера nginx)

nginx -t (протестировать конфигурацию)


Настройка nginx

Файл nginx/conf/nginx.conf


nginx.conf: (основной файл конфигурации сервера)

# это комментарий
user dima rabota; (имя системного пользователя и имя его грыппы под правами которого запущен сервер)
worker_processes 4; (число процессов сервера)
worker_priority 0; (приоритет процессов сервера над другими процессами в операционной системе)
log_not_found on; (записывать лог, если страница не найдена)

events {
   worker_connections 1024; (число возможных одновременных соединений с сервером)
   accept_mutex on;
   accept_mutex_delay 500ms;
   multi_accept off;
}

include mime.types (список расширений и ассоциаций файлов с ними)
include fastcgi.conf (настройки FastCGI)
include proxy.conf (настройки для proxy)
include sites.conf (настройки сайтов, то есть Virtual Hosts. Можно создать для них отдельный файл и подключать их через инклюд)

include other_settings.conf (включение сюда настроек из другого файла. обычный инклюд)

include sites/*.conf (включение всех файлов из папки)

--------------------------------------------------------------------

other_settings.conf:

error_log logs/error.log (определение папки для записи логов сервера)
pid logs/inginx.pid (определение папки для записи pid - идентификатора процесса сервера)

--------------------------------------------------------------------

Директивы, как в Apache, только вместо треугольных скобок <Directory >...</Directory>, скобки http {...}, как в JavaScript.
Таким образом
Apache - это HTML-тэги
Enginx - это JavaScript-объекты (хэш-массивы)

http {
    server {
        listen 80; (порт 80)
        server_name example.com; (доменное имя)
        access_log /var/log/nginx/example.com.log; (папка записи логов сервера для этого сайта)
        location ^~ /admin/ { (при переходе по URL /admin/ Из папки домашеного пользователя взять файл index.php)
            index.php;
            access_log off; (лог по этому адресу не записывать)
            access_log log/main.log; (записывать логи для URL /admin/ в эту папку)
            log_format main '$pid - $nginx_version - $remote_addr'; (записывать логи в таком формате)
        log_not_found on; (записывать лог, если страница не найдена)
        }
    }
}

--------------------------------------------------------------------

Правила для реврайта адресов

rewrite ^/(.*)\.(png|jpg|gif)$ /image.php? file=$1&format=$2 last;

--------------------------------------------------------------------

Определение размера передачи данных

client_max_body_size 2M;
или
client_max_body_size 2048k;


--------------------------------------------------------------------

Установка времени ожидания таймаута

client_body_timeout 3m;
client_body_timeout 180s;
client_body_timeout 180;

--------------------------------------------------------------------

Пример создания тестового сервера

http {
    include mime.types;
    defautl_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    server {
        listen 80;
        server_name localhost; (http://localhost/)
        location / {
            root html; (главное расширение файла)
            index index.html index.htm; (главная индексная страница. Могла бы быть и index index.php)
        }
        error_page 500 502 503 504 /50x.html
        location = /50x.html {
            root html;
        }
    }
}

--------------------------------------------------------------------

Базовая конфигурация сервера под сайт.

Структура всегда такая: http / server / location

http - размещаются директивы общие для всех сайтов HTTP

server - прописывается IP, PORT, HOST-доменный адрес сайта

location - настройки для конкретного URL сайта

Пример

http {
    gzip on;
   
    server {
        listen 80;
        server_name localhost;

        location /main/ {
            ...
        }
       
        location /downloads/ {
            gzip off;
            ...
        }

    }

}

Варианты записи директив.

Прослушивать переход по IP-адресу и порту

listen 192.168.1.1:80;
listen 127.0.0.1;
listen 80 default;
listen 443 ssl;

Доменное имя сайта

server_name www.website.com;
server_name www.site1.com site2.com site3.com;
server_name *.website.com;
server_name .website.com;
server_name *.website.*;
server_name ~^\.example\.com$;

Пути до файлов

root /home/website.com/public_html; (корневая директория сайта)

Установка alias соотвествия URL с папкой, где лежат файлы

http {
    server {
        server_name localhost;
        root /var/www/website.com/html; (основная папка, где хранятся файлы сайта)

        location /admin/ {
            alias /var/www/locked/; (при переходе URL /admin/ взять файлы из папки /var/www/locked/)
        }

    }
}

Вывод страницы об ошибке

error_page 404 /not_found.html;
error_page 500 501 502 503 504 /server_error.html;
error_page 403 http://website.com/;
error_page 404 @notfound; # перейти на named location block
error_page 404 =200 /index.html; # в случае ошибки 404 сделать редирект на файл index.html с 200 OK response code

Определение главной страницы сайта index

index index.php index.html index.htm;
index index.php index2.php /catchall.php;

Обслуживание запросов бразера.

keepalive_requests 100; (число поддержания одновременных запросов со стороны браузера)

Таймаут запросов
keepalive_timeout 75; (время удержания подключения)
keepalive_timeout 75 60;

Установка MimeTypes

include mime.types;

types {
    mimetype1 extension1;
    mimetype2 extension2 [extension3…];
    […]
}

Пример 1

http {
    include mime.types;
    […]

    location /downloads/ {
        types { } # удалить все MIME types
        default_type application/octet-stream; (установить тип MimeType по умолчанию)
    }

    […]
}


Пример 2

http {
    include mime.types;
    […]

    location /downloads/ {
        types {
            text/html html;
            image/gif gif;
            image/jpeg jpg;
        }
        default_type text/plain; (установить тип MimeType по умолчанию)
    }

    […]
}

Ограничить тип подключения, выбрав GET или POST

location /admin/ {
    limit_except GET { (ограничить подключение только типом GET)
        allow 192.168.1.0/24; (разрешить подключение только с этого IP-адреса)
        deny all; (всем остальным запретить)
    }
}

limit_except METHOD1 [METHOD2…] {
    allow | deny | auth_basic | auth_basic_user_file | proxy_pass | perl;
}

Включить бэйсик авторизэйшон

location /admin/ {
    allow 192.168.1.0/24;
    deny all;
    auth_basic "Authentication required"; (включить базовую авторизацию)
    auth_basic_user_file conf/htpasswd; (логин и пароль сверять с файлом из этой папки)
}

Разрешить переход по этому адресу только с локального компьютера

server {
    server_name .website.com;

    location /admin/ {(на этот адрес можно перейти только с локального компьютера, на котором установлен сервер. Все остальные браузеры получат страницу 404 Not found)
        internal;
    }
}

Объединять двойные // в один /

merge_slashes off;

Пример

было  http://website.com//documents/
стало http://website.com/documents/

Включить правильное отображение страниц с ошибкой 400 и выше в Internet Explorer

msie_padding on;

Уустановка правильного обновления Refresh страницы для Internet Explorer

msie_refresh on;

Разрешить использовать символ _ в серверных заголовках

underscores_in_headers on;

Запустить особый сценарий после выполнения запроса сервером.

location /payment/ {
    post_action /scripts/done.php; (запустить это сценарий на сервере после отсылки страницы браузеру)
}

Переменные, хранящие заголовки Request

$http_host - доменное имя из адресной строки (URL сайта)
$http_user_agent - ,hfepth gjkmpjdfntkz
$http_referer - URL-страницы с которой переше пользователь
$http_via - перечень proxy-серверов, которые использовал пользователе\ь
$http_x_forwarded_for - Ip-адрес клиента, если клиент прячется за proxy
$http_cookie - значение куки в браузере пользователя
$http_... - любые другие установленные значения, которые можно получить

Переменные, хранящие заголовки Response

$sent_http_content_type -  указан тип MimeType контента
$sent_http_content_length -  указана величина body
$sent_http_content_location - указан location ресурса
$sent_http_last_modified - дата модификации контента
$sent_http_connection - поддерживается соединение keep-alive или оно закрыто closed
$sent_http_keep_alive - сколько времени будет поддерживаться соединение keep alive
$sent_http_transfer_encoding - кодировка тела ответа (например оно заархивировано gzip)
$sent_http_cache_control - должен ли браузер кэшировать страницу на своей стороне или нет
$sent_http_... - любые другие установленные значения, которые можно получить

Некоторые другие переменные, генерируемые Nginx

$content_length - длина ответа
$content_type - тип содержимого ответа
$cookie_XXX - выбрать куки с именем XXX
$document_root - адрес корневой папки сайта
$document_uri - текущий URL запроса
$host - доменное имя сайта в URL
$hostname - системное имя компьютера, на котором установлен сервер
$nginx_version - версия сервера
$pid - pid сервера
$query_string - строка запроса в URL после знака ? (тоже самое, что и $args)
$remote_addr - IP-адрес браузера клиента
$remote_port - порт браузера клиента
$remote_user - имя клиента, если он авторизован
$realpath_root - document root в запросе request клиента
$request_body - тело ответа клиенту
$request_method - тип запроса GET или POST
$scheme - схема http или https
$server_addr - IP-адрес компьютера, на котором установлен сервер
$server_name - имя компьютера, на котором установлен сервер
$server_port - порт, на котором установлен сервер
$server_protocol - используемый HTTP-протокол HTTP/1.0 или HTTP/1.1
$uri - тоже самое, что и $document_uri

--------------------------------------------------------------------

Способы задания Location

http {
    server {
        server_name website.com;

            location /abcd {
                ...
            }

            location ~ ^/abcd$ {
                ...
            }

            location ~* ^/abcd$ {
                ...
            }
            location /files/ {
                ...
            }
            location = /files/ {
                ...
            }
            location /doc {
                # requests beginning with "/doc"
            }
            location ~* ^/document$ {
                # requests exactly matching "/document"
            }
            location /document {
                # requests beginning with "/document"
            }
            location ~* ^/document$ {
                # requests exactly matching "/document"
            }
            location ^~ /doc {
                # requests beginning with "/doc"
            }
            location ~* ^/document$ {
                # requests exactly matching "/document"
            }

        }
}

--------------------------------------------------------------------

Переписывание адресов через регулярные выражения модуля Rewrite

rewrite "hel{2,}o" /hello.php;
rewrite 'hel{2,}o' /hello.php;

--------------------------------------------------------------------

захват значений из URL-адреса размещенных внутри скобок в переменные nginx

PATTERN   ^(hello|hi) (sir|mister)$
STRING    hello sir
VARIABLES $1 = hello $2 = sir

PATTERN   ^(.*)$
STRING    nginx rocks
VARIABLES $1 = nginx rocks

PATTERN   ^(.{1,3})([0-9]{1,4})([?!]{1,2})$
STRING    abc1234!?
VARIABLES $1 = abc $2 = 1234 $3 = !?

Пример

server {
    server_name website.com;

    location ~* ^/(downloads|files)/(.*)$ {
        add_header Capture1 $1;
        add_header Capture2 $2;
    }

}

--------------------------------------------------------------------

Вывод страниц с сообщениемя об ошибках

server {
    server_name website.com;

    error_page 403 /errors/forbidden.html; (при ошибке 403 взять страницу из этой  папки)
    error_page 404 /errors/not_found.html; (при ошибке 404 взять страницу из этой  папки)
}

server {
    server_name website.com; (доменное имя сайта)
    root /var/www/vhosts/website.com/httpdocs/; (корневая папка, где лежат файлы сайта)
    error_page 404 /errors/404.html; (при ошибке 404 взять страницу из этой  папки)
    location /errors/ {
        alias /var/www/common/errors/; (при переходе по адресу /errors/ взять файлы из этой папки)
        internal; (страница по адресу /errors/ доступна только с локального компьютера, на котором установлен сервер)
    }
}

--------------------------------------------------------------------

Переписывание URL-адреса Rewrite при переходе на страницу

server {
    server_name website.com;
    root /var/www/vhosts/website.com/httpdocs/;

    location /storage/ {
        internal;
        alias /var/www/storage/;
    }

    location /documents/ { (при переходе на страницу переписывание адреса с documents на storage)
        rewrite ^/documents/(.*)$ /storage/$1; (производится редирект на другой адрес)
    }

}

Бесконечный цикл перехода

server {
    server_name website.com;

    location /documents/ {
        rewrite ^(.*)$ /documents/$1;
    }
}

--------------------------------------------------------------------

Включение Server Side Includes

<html>
<head>
    <!--# include file="header.html" -->
</head>
<body>
    <!--# include file="body.html" -->
    <!--# include virtual="/footer.php?id=123" -->
</body>
</html>

Разрешить SSI

server {
    server_name website.com;

    location ~* \.shtml$ {
        ssi on; (разрешить инклюды для этого адреса)
    }

}

Команды SSI

<!--# include file="header.html" -->

<!--# include virtual="/sources/header.php?id=123" -->
<!--# include virtual="header.php" wait="yes" -->

<!--# set var="MY_VARIABLE" value="hello" -->
<!--# echo var="MY_VARIABLE" -->

<!--# set var="MY_VARIABLE" value="$MY_VARIABLE there" -->
<!--# echo var="MY_VARIABLE" -->

<!--# if expr="expression1" -->
   ...
<!--# elif expr="expression2" -->
   ...
<!--# else -->
   ...
<!--# endif -->

<!--# config errmsg="Something terrible happened" -->

<!--# config timefmt="%A, %d-%b-%Y %H:%M:%S %Z" -->

--------------------------------------------------------------------

Условная обработка запросов GET и POST на стороне сервера

server {
    if ($request_method = GET) {
        ...
    }
    if ($request_method = POST) {
        ...
    }
    if ($uri ~ /search/) {
        ...
    }
}

--------------------------------------------------------------------

Частые правила переписывания URL страниц

Поиск для сайта

Input URI     http://website.com/search/some-search-keywords
Rewritten URI http://website.com/search.php?q=some-search-keywords
Rewrite rule  rewrite ^/search/(.*)$ /search.php?q=$1?;


Просмотр профиля пользователя

Input URI     http://website.com/user/31/James
Rewritten URI http://website.com/user.php?id=31&name=James
Rewrite rule  rewrite ^/user/([0-9]+)/(.+)$ /user.php?id=$1&name=$2?;


Передача нескольких параметров в URL

Input URI     http://website.com/index.php/param1/param2/param3
Rewritten URI http://website.com/index.php?p1=param1&p2=param2&p3=param3
Rewrite rule  rewrite ^/index.php/(.*)/(.*)/(.*)$ /index.php?p1=$1&p2=$2&p3=$3?;


Как на Wikipedia

Input URI     http://website.com/wiki/Some_keyword
Rewritten URI http://website.com/wiki/index.php?title=Some_keyword
Rewrite rule  rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1?;


Показать статью на новостном сайте

Input URI     http://website.com/33526/us-economy-strengthens
Rewritten URI http://website.com/article.php?id=33526
Rewrite rule  rewrite ^/([0-9]+)/.*$ /article.php?id=$1?;

Форум

Input URI     http://website.com/topic-1234-50-some-keywords.html
Rewritten URI http://website.com/viewtopic.php?topic=1234&start=50
Rewrite rule  rewrite ^/topic-([0-9]+)-([0-9]+)-(.*)\.html$ /viewtopic.php?topic=$1&start=$2?;


--------------------------------------------------------------------

Задание главной страницы сайта

index index.php index.html index.htm;
index index.php index2.php /catchall.php;

--------------------------------------------------------------------

Включение автоиндексации файлов в папках сайта, если нет индексного файла

http {
     server {
        location / {
            autoindex on;
        }
    }
}

--------------------------------------------------------------------

Включение базовой авторизации Basic Authtorization

location /admin/ {
    auth_basic "Admin control panel";
    auth_basic_user_file access/password_file;
}

--------------------------------------------------------------------

Разрешение доступак к странице только с определенного IP-адреса

location {
    allow 127.0.0.1; # allow local IP address
    deny all; # deny all other IP addresses
}

--------------------------------------------------------------------

Размещение empty gif по адресу, указанному в location

location = /empty.gif {
    empty_gif;
}

--------------------------------------------------------------------

Обработка адресов для FLV

location ~* \.flv {
    flv;
}

--------------------------------------------------------------------

Добавление HTTP заголовков

add_before_body file_uri;
add_after_body file_uri;

--------------------------------------------------------------------

Memcached

Memcached - это фоновое приложение, которе может быть подсоединено через соекты. Основное его назначение это кэширование данных в пямяти по принципу ключ-значение.
Модуль Nginx Memcached предлагает директивы для доступа к фоновум демону Memcached.

memcached_pass localhost:8888 (задает хост и порт на котором работает программа Memcached)
memcached_connect_timeout 5000;
memcached_send_timeout 5,000;

Пример

server {
    server_name example.com;

    location / {
        set $memcached_key $uri;
        memcached_pass 127.0.0.1:8888;
        error_page 404 @notcached;
    }

    location @notcached {
        internal;
        # Если файл не найден то переадресовать на proxy-сервер
        proxy_pass 127.0.0.1:8080;
    }
}

Пример Memcached

server {
    server_name www.example1.com;

    location / {
        set $memcached_key $uri;
        memcached_pass 127.0.0.1:11211;
        default_type text/html;
        error_page 404 @fallback;
    }

    location @fallback {
        proxy_pass http://backend;
    }
}

--------------------------------------------------------------------

Возможно также:

Обработка картинок средствами сервера nginx

Обработка XSLT средствами сервера nginx

--------------------------------------------------------------------

Установка Real IP

real_ip_header X-Forwarded-For;
set_real_ip_from 192.168.0.0/16;
set_real_ip_from 127.0.0.1;

--------------------------------------------------------------------

Включение SSL-шифрования

server {
    listen 443;
    server_name secure.website.com;
    ssl on;
    ssl_certificate /path/to/combined.crt;
    ssl_certificate_key /path/to/secure.website.com.key;
    ...
}

Пример

http {
    ...
    ssl_certificate common.crt;
    ssl_certificate_key common.key;

    server {
        listen 80;
        server_name www.example1.com;
        location / {
            ...
        }
    }

    server {
        listen 443 default ssl;
        server_name payment.example1.com;
        location / {
            ...
        }
    }

    server {
        listen 80;
        listen 443;
        server_name static.example1.com;
        location / {
            root /var/www/www.example1.com/static;
    }

}

--------------------------------------------------------------------

Установка Secure link

location /downloads/ {
    secure_link_secret "secret";

    if ($secure_link = "") {
        return 403;
    }

    rewrite ^ /downloads/$secure_link break;
}

--------------------------------------------------------------------

Включение FastCGI для подключения языка программирования к серверу PHP, Python. Ruby

fastcgi_pass localhost:9000;
fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/tmp/fastcgi.socket;

# используем upstream block
upstream fastcgi {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}

location ~* \.php$ {
    fastcgi_pass fastcgi;
}

PHP и fastCGI

server {
    listen 80;
    server_name www.example1.com;
    root /var/www/www.example1.com;
    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
    }

}

--------------------------------------------------------------------

Использование Upstream nginx в качестве proxy-сервера между браузером и backend-компьютером Apache, на котором выполняется серверный сценарий на языке программирования

upstream phpfpm {
    server 192.168.0.50:9000;
    server 192.168.0.51:9000;
    server 192.168.0.52:9000;
}

server {
    server_name website.com;

    location ~* \.php$ {
        fastcgi_pass phpfpm;
        ...
    }
}

Установка приоритета выбора серверов

Балансировщик нагрузки

upstream php {
    server 192.168.0.1:9000 weight=2;
    server 192.168.0.2:9000;
}

upstream phpbackend {
    server localhost:9000 weight=5;
    server 192.168.0.1 max_fails=5 fail_timeout=60s;
    server unix:/tmp/backend backup;
}

--------------------------------------------------------------------

Использование PHP с nginx и FastCGI

server {
    server_name .website.com; (доменное имя сайта)
    listen 80; (порт 80)
    root /home/website/www; (корневая папка, откуда берутся файлы сайта)
    index index.php; (имя индексного файла)
    location ~* \.php$ { (для всех запросов, оканчивающихся на php запускается серверный сценарий на PHP)
        fastcgi_pass 127.0.0.1:9000; (обработчик скрипотв PHP размещается на порту 9000)
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        include fastcgi_params; (включить еще какие-либо настройки)
    }
}

--------------------------------------------------------------------

Использование Django с nginx и FastCGI

Необходимо установить Python-Flup и стартовать FastCGI процесс

[root@website.com www]# python manage.py runfcgi method=prefork host=127.0.0.1 port=9000 pidfile=/var/run/ django.pid

Далее настроить конфигурацию nginx

http {
    server {
        server_name .website.com;
        listen 80;
        root /home/website/www;
        index index.html;
        location / {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

Django Python и uWSGI

Установить модуль для nginx

http://projects.unbit.it/downloads/uwsgi-0.9.6.5.tar.gz

django_wsgi.py

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'testapp.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

В консоли запускаем

uwsgi --socket 127.0.0.1:3031 --pythonpath /var/www/ --pythonpath /var/www/testapp/ -w django_wsgi -M -T -d server.log –L

настройки nginx

server {
    listen 80;
    server_name www.example1.com;

    location / {
        root /var/www/testapp;
        index index.php index.html index.htm;
    }

    location / {
        uwsgi_pass 127.0.0.1:3031;
        include uwsgi_params;
    }
}

дополнительно можно написать сценарий django_usgi2.py:

import web

urls = (
    '/(.*)', 'hello'
)

app = web.application(urls, globals())

class hello:
    def GET(self, name):
        if not name:
            name = 'World'
        return 'Hello, ' + name + '!'

application = app.wsgifunc()

Запустим из консоли

uwsgi -s /tmp/web.py.socket -w django_usgi2.py
Modifying FCGI

Изменим FastCGI timeouts

server {
    listen 80;
    server_name www.example1.com;
    root /var/www/www.example1.com;
    index index.php index.html index.htm;

    fastcgi_read_timeout 120;
    fastcgi_write_timeout 120;

    try_files $uri $uri/ /index.php;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
    }
}

--------------------------------------------------------------------

использование nginx совместно с apache

Nginx в качестве reverse proxy

Переадресация запроса с nginx на Apache

proxy_pass http://localhost:8080;
proxy_pass http://127.0.0.1:8080;
proxy_pass http://unix:/tmp/nginx.sock;
proxy_pass https://192.168.0.1;
proxy_pass http://localhost:8080/uri/;
proxy_pass http://unix:/tmp/nginx.sock:/uri/;
proxy_pass http://$server_name:8080;

# Используем upstream block
upstream backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

location ~* \.php$ {
    proxy_pass http://backend;
}

Proxy redirect

proxy_redirect off;

proxy_redirect default;
proxy_redirect http://localhost:8080/ http://example.com/;
proxy_redirect http://localhost:8080/wiki/ /w/;
proxy_redirect http://localhost:8080/ http://$host/;

Пример проксирования на другой сервер

server {
    listen 80;
    server_name example1.com;
    access_log /var/www/example1.com/log/nginx.access.log;
    error_log /var/www/example1.com/log/nginx_error.log debug;

    location / {
        include proxy.conf;
        proxy_pass http://127.0.0.1:8080;
    }
}

Проксирование на несколько серверов и балансировка нагрузки

upstream backend {
    server backend1.example1.com weight=5;
    server backend2.example1.com max_fails=3 fail_timeout=30s;
    server backend3.example1.com;
}

server {
    listen 80;
    server_name example1.com;
    access_log /var/www/example1.com/log/nginx.access.log;
    error_log /var/www/example1.com/log/nginx_error.log debug;

    location / {
        include proxy.conf;
        proxy_pass http://backend;
    }
}


Конфигурирование Apache для проксирования с nginx

<VirtualHost A.B.C.D:8080>
    ServerName example.com:8080
    ServerAlias www.example.com
    ...
    Order deny,allow
    allow from 127.0.0.1
    allow from 192.168.0.1
    deny all
</VirtualHost>

Конфигурирование nginx для проксирования на Apache

upstream apache {
    server 192.168.0.1:80;
    server 192.168.0.2:80;
    server 192.168.0.3:80 weight=2;
    server 192.168.0.4:80 backup;
}

server {
    server_name .example.com;
    root /home/example.com/www;
    ...
    location / {
        proxy_pass http://apache;
    }
}

Разделение ститчного и динамичного контента при проксировании

server {
    server_name .example.com;
    root /home/example.com/www;
    ...

    location ~* \.php$ {
        # Передача на Apache всех запросов, оканчивающихся на .php
        proxy_pass http://127.0.0.1:8080;
    }

    location / {
        # Опции для отдачи статичных файлов: css, kavascript, images, html
        # например cache control, alias и так далее
        expires 30d;
    }
}

среда, 13 февраля 2013 г.

Краткое руководство по директивам Apache

Очень хорошая книга.

Администрирование Web-сервера Apache и руководство по электронной коммерции. Скотт Хокинс.


Запись правил в Apache производится HTML-тэгами.
Запись правил в Nginx производится как в JavaScript через объекты и фигурные скобки http {}.

Apache2.2/conf/httpd.conf - главный конфигурационный файл сервера. В нем задаются: имя сервера, сетевые установки, виртуальный хостинг.

Режим работы сервера.

ServerType standalone

Задание имени ситемного пользователя и его группы.

User apache
Group 506

Ограничить зону действия директив DirectiveA каталогом /home/site2 и всеми подкаталогами, содержащимися в нем.

<Directory /home/site2>
    DirectoryA
</Directorry


Ограничить зону действия директив DirectiveA диапазоном каталогом, содержащим регулярное выражение /home/site[1-3] и всеми подкаталогами, содержащимися в нем.

<Directory "/home/site[1-3]">
    DirectoryA
</Directory

.htaccess
Ограничить зону действия директив DirectiveA через рамещение файла .htaccess в каталоге с файлами, по отношению к которому эти директивы будут применяться.
В конфиге для использования файлов .htaccess необходимо прописать AllowOverride ALL

Ограничить зону действия директив DirectiveA по URL.

<Location /status>
    SetHandler server-status
</Location>

<Location /secure_stuff>
    order deny, allow
    deny from all
    allow from 127.0.0.1
</Location>

Ограничить зону действия директив DirectiveA по URL, содержащим регулярное выражение /status[1-3].

<LocationMatch "/status[1-3]">
    SetHandler server-status
</Location>

Ограничить зону действия директив DirectiveA применительно к отдельному файлу.

<Files .htaccess>
    Order deny, allow
    Deny from all
</Files>

Ограничить зону действия директив DirectiveA применительно к нескольким файлам. определенным по отдельному регулярному выражению /pic[1-3].jpg.

<FilesMatch "/pic[1-3].jpg">
    Order deny, allow
    Deny from all
</FilesMatch>

Используемые директивы внутри скобок <Directory >, <Location >, <Files >

AllowOverride All - разрешить перезаписать сходные директивы в файле .htaccess
AllowOverride None - запретить перезаписать сходные директивы в файле .htaccess

order allow, deny - задать порядок следования ниже лежащих директив (разрешить, затем запретить)
order deny, allow - задать порядок следования ниже лежащих директив (запретить, затем разрешить)

allow - задать IP-адрес или доменное имя, которому будет разрешен запрос к серверу.
deny - задать IP-адрес или доменное имя, которому будет запрещен запрос к серверу.

allow from all - разрешить всем IP-адресам или доменным именам отправлять запрос к серверу.
deny from all - запретить всем IP-адресам или доменным именам отправлять запрос к серверу.

Задать папку в которой по умолчанию будут располагаться все HTML-файлы.

DocumentRoot /opt/apache/htdocs

Задать папку в которой будут размещаться домашние страницы пользователя.

UserDir public_html

Задать дефолтные имена файлов, которые будут являться главными HTML-файлами

DirectoryIndex index.html index.htm index.cgi index.shtml (Пример http://www.site.com/ Запустит файл index.html)


AccessFileName .htaccess - эта директива задает имя файла в котором в случае его обнаружения в обычной папке можно будет наути директивы управления доступом.

Задать тип MimeType по умолчанию, если MimeType сервер не смог определить.

DefaultType text/plain

Задание связывания соотвествия URL-адреса месту расположения файлов в папке на жестком диске сервера.

Alias /icons/ /usr/local/etc/httpd/icons/ (Alias /адрес/ /папка/на/жестком/диске/с/картинками/например/)

Задание связывания соотвествия URL-адреса месту расположения сценарием на языке программирования в папке на жестком диске сервера.

ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-bin/ (ScriptAlias /адрес/ /папка/на/жестком/диске/с/php/кодом/например/)

Добавить ассоциацию с Mimetype

AddType

Добавление ассоциации с типом MimeType

AddType application/x-httpd-php .php

Тип MimeType По умолчанию.

DefaultType text/html

Определение требуемых характеристик железа для сервера Apache.

Определение браузера по user-agent. Вывод содержимого по для определенного браузера.

BrowseMatch Mozilla/2 nokeepalive

Адрес электронной почты администратора сервера.

ServerAdmin you@yoursite.org

Корневой каталог сервера, куда установлен Apache. Относительного этого каталога можно задавать относительные пути.

ServerRoot /opt/apache

Задание IP-адреса локального компьютера, на котором установлен Apache. Если на компьютере только один сетевой интерфейс, то эту директиву задавать не стоит, так как по умолчанию сервер прослушивает все соединения.

Чтобы Apache поддерживал только один IP-адрес задайте:

BindAddress 192.169.1.10

Чтобы Apache игнорировал все запросы исходящие не от локального компьютера задайте:

BindAddress 127.0.0.1

Для работы со всеми возможными соединениями задайте:

BindAddress *

BindAddress может быть задан только 1 раз.

При необходимости прослушивать 2 и более IP-адреса, но не все возможные, используйте директиву Listen.

Определение папки для записи файла логов об ошибках.

ErrorLog logs/error_log (относительно папки, где установлен сервер)

или

ErrorLog /var/logs/apache (абсолютный адрес)

Определение папки для записи файла логов об обменен данными сервера с внешним миром.

TransferLog logs/access_log

Задание имени сервера, которое будет отсылаться браузерам вместо имени компьютера.

ServerName www.example.com

Разрешить proxy-серверам кэшировать заголовки.

CacheNegotiatedDocs

Ограничение времени существования неактивных соединений.

Timeout 150 (секунд)

Ращрешить поддержание устойчивых соединений, которые позволяют брузеру запросить более одного блока данных одновременно. Включение этой опции полезно всем.

KeepAlive On

Установка максимального числа запросов разрешенных во время одного устойчивого соединения. Значение 0 означает Неограниченно.

MaxKeepAliveRequest 0

Задание количества секунд, на протяжении которых во время устойчивого соединения сервер будет ожидать следующего запроса.

KeepAliveTimeout 15

Установка количества одновременно подключенных к серверу браузеров.

MaxClients 150

Запус и тестирование сервера из командной строки.

apachectl configtest
apechectl start

Виртуальный хостинг.

Папка пользователя. Такой подход используется редко.

UserDir somedirectory - эта директива предназначена для того, чтобы показать, что Web-содержимое будет найдено в конкретном подкаталоге корневого каталога пользователя.
Когда работает эта директива сервер принимает запросы в виде:

http://www.example.com/~userguy

В результате файлы будут взяты из папки /home/userguy/somedirectory

Например

http://www.example.com/~timmy/x-files.html

UserDir /var/user/webspace

Файл взят из папки /var/user/webspace/timmy/x-files.html


Задание прослушивания только одногопорта.

Port 4444


Задание прослушивания одного или более IP-порта

Listen 80
Listen (пусто - значит локальный порт)

Можно использовать для задания прослушивания определенных IP-адресов

Listen 192.168.1.2:80
Listen 192.168.1.2: (все порты)


Виртуальный хостинг по имени. Самый распространеный.
Необходимо:
1. С помощью директивы NameVirtualHost определить IP-адрес, который будет использоваться для виртуального хоста.
2. С помощью пары директив VirtualHost выделить директивы, которые будут иметь отношение только к определенному виртуальному Web-узлу.

NameVirtualHost 192.168.1.1:80

Запуск виртуального хостинга.

<VirtualHost 192.168.1.1>
    ServerName www.example.org (Обязательно нужно прописывать ServerName для IP-адреса)
    DocumentRoot /some/other/directory (Обязательно нужно прописывать DocumentRoot, чтобы из папки брались файлы)
</VirtualHost>

или

<VirtualHost www.idiots.org> (ServerName прописывать не нужно)
    DocumentRoot /some/other/directory (Обязательно нужно прописывать DocumentRoot, чтобы из папки брались файлы)
</VirtualHost>

Что можно добавить внутрь скобок <VirtualHost >

ServerName www.site2.com - доменное имя сайта
DocumentRoot /home/site2 - адрес папки с файлами для сайта
ServerAdmin admin@site2.com -  почтовый адрес администратора сайта
ErrorLog /home/logs - адрсе папки для записи логов сервера для сайта
transferLog /home/trans -  адрес папки для записи логов передачи данных от сервера для сайта

Директивы, которые нельзя прописывать внутри скобок виртуального хостинга
BindAddress
Listen
MaxSpareServers
MinSpareServers
MaxRequestPerChild
PidFile
ServerRoot
ServerType
TypeConfig
NameVirtualHost

Отстальное можно.


Proxy-сервер - это сервер посредник для обслуживания внешнего или внутреннего трафика при передаче запросо от компьютера к компьютеру.

Можно настроить proxy на обработку запросов поступающих на порт отличный от стандартного (80).

Listen 8888
<VirtuaHost 192.168.100.1:8888>
... директивы ...
</VirtuaHOst>

Настройка Proxy-сервера.

Для запуска proxy-сервера достаточно прописать одну директиву

Proxe-Requests On

Далее идет настройка proxy-сервера на прослушивание входящего трафика по порту 8888.
А потом для работы соэтим портом создается виртуальный хост с адресом prxoy.asgard.com

Listen 8888
<VirtualHost 192.168.100.1:8888>
    ServerName proxy.asgard.com
    ProxyRequests On
</VirtualHost>

Ограничение доступа к определенным сайтам.

ProxyBlock kiddiporn.com snuffulm.org (proxy-сервер не даст посмотреть эти сайты при прохождении запроса через себя)

Пересылка запросов на другие proxy-серверы.

ProxyRemote ftp http://ftpsrvr.local.com:8080 (пересылка запроса дальше)

Задание запрета на проксирование.

NoProxy .example.com (предотвратит переход запросов на удаленный proxy-сервер)

Зазеркаливание (Задание переадресации redirect) сайта.

ProxtPass /distant/mirror http://www.tuchman.edu (переадресует все локальные запросы к сайту http://www.example.edu/distant/mirror при наборе адреса http://www.tuchmnan.edu)

Задание домена по умолчанию для переводаьпроксирования на него (позволяет короче вбивать адрес)

ProxyDomain .example.com

Это позволит после введения краткого URL http://www получить доступ к сайту http://www.example.com

Управление доступом к Proxy-серверу с использоваением шаблонов для указания того, что все каталоги находятся под управлением proxy.

<Directory proxy:*>
    order deny, allow
    deny from список IP-адресов
    allow from список IP-адресов
</Directory>

Для включения кэширования страниц необходимо задать адрес каталога в котором кэш будет располагаться и все.

CacheRoot /cache

Задание максимально рамера папки с кэшем

CacheSize 10240 (10 мегабайт)

Задание ограничения глубины вложенности создания папокпри кэшировании внутри папки CacheRoot

CacheDirLevels 3 (3 уровня вглубь папки CacheRoot)

Задание ограничения длины пути к кэш-файлам

CacheDirLength 25 (предел длины имен подкатлогов 25 символов)

Задание срока хранения кэша

CacheMaxExpire - максиму времени хранения в часах
CacheDefaultExpire - если файл поступает без срока то ставится время хранения по умолчанию
CacheLastModifiedFactor - если файл поступает без срока то вычисляется время хранения от текущего времени до времени последней модификации файла и умножается на этот коэффициент

Задание интервалов между удалениями просроченного кэше (Периодичность дуланения) в часах

CacheInterval 10.5 (10 часов 30 минут)
CacheIntervel .5 (30 минут)

Отключение директивы кэширования для файлов сайта

NoCache news www.fool.com

NoCache * (полностью отключить кэширования для всего)

Настройка формата записи логов.

LogFormat "Host=%h Date=%t BytesReturned=%b"

Отказ в подступе при попытке загрузки файлов из папки.

<Directory />
    Order deny, allow
    Deny from all
</Directory>

<Directory /opt/apache/htdocs>
    Order deny, allow
    Allow from all
</Directory>


Запретить перезапись директив в .htaccess

AllowOverrides None

Разрешить доступ к файлам.

<Directory /some/directory>
    Allow from all
</Directory>


<Directory /some/directory>
    order deny, allow
    deny from all
    allow from fenris.asgard.com   
</Directory>

<Directory /some/directory>
    order deny, allow
    deny from all
    allow from 192.168.100.0/255.255.252.0
</Directory>

Разрешить доступ только из определенного браузера.

BrowserMatch ^Mozill netscape_yes
<Directory /some/directory>
    order deny, allow
    deny from all
    allow from env==netscape_yes
</Directory>

Задание типа бэйсик идентификации
<Directory /some/directory>
    AuthName "Example of Access Control"
    AuthType Basic
    AuthUserFile /etc/security/.htpasswd
    Require valid-user
</Directory>

зазадние страницы для авторизации

ErrorDocument 401 /site_error.html

Включение шифрования SSL

NameVirtualHost 64.22.73.226
<VirtualHost 64.82.73.226>
    ServerName www.securesite.com
    DocumentRoot /home/site3
    SSLEngine on
    SSLCertificate /var/ssl/server.crt
    SSLCACertificateFile /path/to/certificate
    SSLLog /var/log/ssllog
    SSLLogLevel warn   
</VirtualHost>

Можно еще добавить

    SSLCertificetKeyFile /var/ssl/server.key
    SSLCACertificatePath /some/secure/directory
    SSLVerifyClient 1
    SSLVerifyDepth 3

Включени инклюдов в HTML на стороне сервера.

<Location /ssdir>
   Options +Include
</Location>

Включения режима исполнения скрипотв на языках программирования CGI.

<Directory /usr/local/cgi-bin>
    Options +ExecCGI
</Directory>

Задания привязок URL к папкам со скриптами на языках программирования.

ScriptAlias /cgi-bin/ /usr/local/cgi-bin/

Пометить всю папку, как папку с исполняемыми скриптами.

<Directory /usr/loacl/cgi-bin>
    SetHandler cgi-script
<Directory>

Определение типа файлов как исполняемые.

AddHandler cgi-script .pl .cgi

Задание MimeType файлов

AddType application/x-httpd-cgi .pl

Задание папки записи логов в cgi-скриптах

ScriptLog /var/logs/cgilog

Переадресация через mod_rewrite

Rewriteengine On - включение режима перезаписи URL
RewriteRule ^/$ /apache backup [R] - задание переадресации

RewriteCond

Интересно до стр 150

Пример файл /etc/hosts

192.168.100.1    odin.example.com
192.168.100.80  fenris.asgard.com fenris
192.168.100.10  loki.asgard.com loki

вторник, 5 февраля 2013 г.

MySQL и PHP

CREATE DATABASE mydatabase;

DROP DATABASE mydatabase;

DROP TABLE mytable

USE mydatabase;

CREATE TABLE mytable(
    number INT(10),
    postcode CHAR (6),
    name VARCHAR(30),
    surname VARCHAR(50),
    cash DEC(4,2)
);

INSERT INTO mytable (number, name, surname, cash) VALUES (1, 'Dmitry', 'Ovsyannikov', 5000.00);

SELECT * FROM mytable WHERE number = 1;

SELECT name FROM mytable WHERE cash = 5000.00;

DELETE FROM table WHERE id=1;

$db = mysqli_connect(host, user, password, table) or die('Error');

mysqli_select_db($db);

$query = "INSERT INTO mytable (number) VALUES (1)";

$result = mysqli_query($db, $query) or die('Error');

while ($row = mysqli_fetch_array($result) {
    $name = $row['name'];
    $surname = $row['surname'];
    echo($name.' '.$surname);
}

mysqli_close($db);