Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

Показаны сообщения с ярлыком admin. Показать все сообщения
Показаны сообщения с ярлыком admin. Показать все сообщения

четверг, 1 сентября 2011 г.

Установка MongoDB на RHEL

Довелось мне недавно устанавливать MongoDB на RHEL и настраивать репликацию (Replica sets). Про репликацию я напишу в другом посте, а вот про установку - здесь. Машина - 64х битный linux Amazon Image for EC2. Итак, по шагам: 1) Добавляем репозиторий
     sudo touch /etc/yum.repos.d/10gen.repo
    
и в файл добавляем следующее:
     [10gen]
     name=10gen Repository
     baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
     gpgcheck=0
     
2) Устанавливаем
    sudo yum install mongo-10gen mongo-10gen-server
    
3) Редактируем конфиг:
    sudo vi /etc/mongod.conf
    
Например, можем отредактировать порт, расположение логов и файлов с данными:
    logpath=/var/log/mongo/mongod.log
    port=27017
    dbpath=/var/lib/mongo
    
4) Запускаем!
    sudo /etc/init.d/mongod start
    

четверг, 11 августа 2011 г.

Установка Postgres-9.0 на Ubuntu 10.10

Сделаем установку Postgres-9.0 на Ubuntu 10.10.

1) В репах по-умолчанию нет пакета Postgres-9.0, поэтому добавим репозиторий, откуда будем качать пакеты:

deb http://ppa.launchpad.net/pitti/postgresql/ubuntu maverick main
deb-src http://ppa.launchpad.net/pitti/postgresql/ubuntu maverick main

добавляем в файл /etc/apt/sources.list. В итоге должны получить что-то вроде

$ cat /etc/apt/sources.list
deb http://ru.archive.ubuntu.com/ubuntu/ maverick main restricted
deb http://ru.archive.ubuntu.com/ubuntu/ maverick multiverse
deb http://archive.canonical.com/ubuntu maverick partner
deb http://archive.canonical.com/ maverick partner
deb http://ru.archive.ubuntu.com/ubuntu/ maverick-updates restricted main multiverse universe
deb http://security.ubuntu.com/ubuntu/ maverick-security restricted main multiverse universe
deb http://extras.ubuntu.com/ubuntu maverick main #Third party developers repository
# for postgres 9.0
deb http://ppa.launchpad.net/pitti/postgresql/ubuntu maverick main
deb-src http://ppa.launchpad.net/pitti/postgresql/ubuntu maverick main

:~$


2) Идем сюда: https://launchpad.net/~pitti/+archive/postgresql, смотрим значение ключа (сейчас это 8683D8A2) и добавляем ключ:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8683D8A2

3) Апдейтим репы:
sudo apt-get update

4) Останавливаем сервис Postgres 8:
~$ sudo service postgresql-8.4 stop

5) Пуржим пакеты:
sudo apt-get purge postgresql*

6) Устанавливаем postgres 9.0
sudo apt-get install postgresql-9.0

7) Заходим в psql:
sudo -u postgres psql

Ссылки:
Install PostgreSQL 9 on Ubuntu Linux
Postgres 9.x installation in Ubuntu
Установка Postgresql 9, pgAdmin III в Ubuntu 10.04
Installing PostgreSQL 9.0 on Ubuntu 10.04

Как узнать, какую версию Ubuntu вы используете


user1:~$ cat /etc/issue
Ubuntu 10.10 \n \l

user1:~$


или через GUI: System -> Administration -> System Monitor

или:


user1:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 10.10
Release: 10.10
Codename: maverick

суббота, 1 января 2011 г.

Уголок Linux. Базовые команды. Passwd.

В настоящее время я читаю хорошую книжку от Apress: Beginning the Linux Command Line, автор Sander van Vugt. В книге очень хорошо описана работа с командной строкой Linux, описано выполнение различных действий, которой сгруппировано по темам: работа с файловой системой, работа с текстовыми редакторами, управление пользователями, менеджмент процессов, работа с сетью и т. п. Этим постом я начинаю серию "Уголок Linux", в которой будет описываться работа в среде Linux - выполнение повседневных действий, администрирование системы и т.п.

Смена пароля пользователя производится командой passwd. Если не передается имя пользователя, то команда меняет пароль текущего пользователя. Пример:

vasya@machine:~>passwd
Changing password for vasya.
Old password:
New password:
Reenter new password:
Password changed.


Из-под рута можно менять пароли других пользователей следующим образом: passwd username, т.е. передавая команде имя пользователя. Следующие опции полезны:

  • -d удаляет пароль для аккаунта

  • -l блокирует аккаунт

  • -u разблокирует аккаунт

  • -e пароль аккаунта помечается как "истекший". Юзер при следующем логине должен будет ввести новый пароль

среда, 22 декабря 2010 г.

Файловая система Unix

Рассмотрим подробно Filesystem Hierarchy Standard - описание файловой системы Unix-подобных систем.

Файлы можно разделить на 4 категории: разделяемые/неразделяемые (shareable/unshareable) и статические/изменяемые (static/variable).

Static shareable:
/usr
/opt

Static unshareable:
/etc
/boot

Variable shareable:
/var/mail
/var/spool/news

Variable unshareable:
/var/run
/var/lock

Содержимое корневой файловой системы должно позволять загружать и восстанавливать систему. Приложения никогда не должны создавать или читать файлы или подкаталоги в корневой файловой системе.

В корневой папке (/) содержатся следующие символьные ссылки или каталоги:

  • bin - необходимые исполняемые файлы для команд

  • boot - статические файлы для системного загрузчика

  • dev - файлы устройств

  • etc - специфичная для данного хоста конфигурация

  • lib - необходимые системные бибилиотеки и модули ядра

  • media - точка монтирования для сменяемых носителей

  • mnt - точка монтирования для временной файловой системы

  • opt - дополнительное ПО

  • sbin - необходимые системные исполняемые файлы

  • srv - данные для сервисов, предоставляемых системой

  • tmp - временные файлы

  • usr - важный каталог =)

  • var - изменяемые данные



Дополнительно могут быть установлены следующие каталоги (или символьные ссылки):

  • home - содержит домашние каталоги пользователей

  • root - домашний каталог пользователя root



Каталог /bin



Каталог /bin содержит необходимые исполняемые файлы для команд. Каталог должен содержать следующие файлы или символьные ссылки на команды:


  • cat - конкатенация файлов

  • chgrp - меняет группу владения

  • chmod - меняет модификаторы доступа

  • chown - меняет владельца файла и группу

  • cp - копирование файлов

  • date - печать или установка системной даты и времени

  • dd - конвертация и копирование файлов

  • df - отчет по использованию диска файловой системой

  • dmesg - вывод буфера сообщений ядра с стандартный поток вывода

  • echo - печать строки текста

  • false - ничего не делает, возвращает "неуспех"

  • hostname - просмотр или установка имени хоста

  • kill - посылает сигналы процессам

  • ln - создание ссылок на файлы

  • login - вход в сессию системы

  • ls - вывод списка файлов в каталоге

  • mkdir - создание каталогов

  • mknod - создание специальных файлов

  • more - утилита для листания текста

  • mount - монтирование файловой системы

  • mv - перенос/переименование файлов

  • ps - отчет по процессам

  • pwd - печать названия текущего рабочего каталога

  • rm - удаление файлов/каталогов

  • rmdir - удаление пустых каталогов

  • sed - работа с потоками sed

  • sh - командная оболочка

  • stty - печать и изменение настроек терминала

  • su - изменение пользовательского ID

  • sync - сброс буферов файловой системы

  • true - ничего не делает, возвращает "успех"

  • umount - отмонтирование файловой системы

  • uname - вывод информации о системе



Дополнительно в /bin могут быть установлены следующие программы:

  • csh - C-shell

  • ed - редактор

  • tar - архивационная утилита

  • cpio - еще одна архивационная утилита

  • gzip - утилита сжатия от GNU

  • gunzip - утилита разжатия от GNU

  • zcat - утилита разжатия от GNU

  • netstat - сетевая статистика

  • ping - тест сети по протоколу ICMP




Если утилиты gunzip и zcat существуют, то они должны быть символьными линками на gzip.

Каталог /boot



Содержит все, что необходимо для загрузки системы кроме конфигурационных файлов, которые не нужны в момент загрузки. Каталог содержит данные, которые используются до момента, когда ядро начало выполнения программ в user-mode. Здесь могут находится главные загрузочные сектора, и map-файлы секторов.

Каталог /dev



Содержит файлы устройств. Примеры:

  • /dev/null - null-устройство. Принимает любой вывод, отправленный в файл, всегда возвращает "успех" при записи в него (но реально данные никуда не записываются). Когда данные читаются из него, сразу же возвращает маркер EOF. Иногда на жаргоне его называют "черной дырой".

  • /dev/zero - файл, который возвращает нули (0x00)при чтении из него. При записи в него всегда возвращает "успех", но реально данные никуда не записываются.

  • /dev/random - файл, который служит генератором случайных чисел. Также возможно писать в него (но зачем?). Блокирующий ввод/вывод

  • /dev/urandom - то же самое, что и /dev/random, но ввод/вывод здесь неблокирующий

  • /dev/full - при записи в этот файл возвращается маркер переполнения устройства



Каталог /etc



Содержит специфичную для хоста конфигурацию. Т.е. в каталоге содержатся конфигурационные файлы для настроек различных частей системы. Каталог может содержать следующие файлы:

  • csh.login - файл инициализации для C-shell (systemwide)

  • exports - контроль доступа для файловой системы NFS

  • fstab - статическая информация о файловых системах

  • ftpusers - список пользователей и контроль доступа для FTP-демона

  • gateways - список шлюзов

  • gettydefs - настройки терминала для getty

  • group - файл пользовательской группы

  • host.conf - конфигурационный файл хоста

  • hosts - статическая информация о хостах (локальный DNS)

  • hosts.allow - разрешенный список хостов для TCP Wrappers

  • hosts.deny - запрещенный список хостов для TCP Wrappers

  • hosts.equiv - список доверенных хостов для rlogin, rsh, rcp

  • hosts.lpd - список доверенных хостов для lpd

  • inetd.conf - файл конфигурации для inetd

  • inittab - файл конфигурации для программы init

  • issue - сообщение перд логином и файл идентификации

  • ld.so.conf - список дополнительных каталогов, где искать зашаренные бибилиотеки

  • motd - содержит сообщение, которое показывается юзеру после логина

  • mtab - динамическая информация о файловых системах

  • mtools.conf - файл настроек для mtools

  • networks - статическая информация об именах сетей

  • passwd - файл с паролями

  • printcap - база данных системы печати lpd

  • profile - файл инициализации для sh shell login

  • protocols - список IP-протоколов

  • resolv.conf - файл настроек резолвера

  • rpc - список протоколов RPC

  • securetty - контроль доступа TTY для root

  • services - имена портов для сетевых сервисов

  • shells - пути к оболочкам

  • syslog.conf - файл настроек для syslogd



Каталог /home



Содержит домашние каталоги пользователей.

Каталог /lib



Содержит необходимые системные бибилиотеки и модули ядра.

Каталог /media



Точка монтирования для сменяемых носителей. Следующие каталоги или символьные ссылки на каталоги могут содержаться в /media:

  • floppy - флоппи-дисковод

  • cdrom - CD привод


Каталог /sbin



Содержит системные исполняемые файлы.

пятница, 17 сентября 2010 г.

Однопоточный сканер портов

Напишем сканер портов. Он пока что будет состоять из одного потока. Сканирование портов - попытка выяснить, какие порты открыты на конкретной машине. Цель этого сканирования может быть как благая (например, системный администратор хочет по максимуму обезопасить хост, и для этого ему нужно закрыть часть из открытых портов), так и вредоносная (злоумышленник хочет выяснить, какие сетевые сервисы запущены на хосте с целью внедрить вредоносную программу).

В Java мы имеем возможность перебирать порты и пробовать подключиться к порту. Если подключение произошло, значит, порт открыт. Если нет, то порт закрыт.

Код сканера:

import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
 
 
public class PortScanner {
 
private int minPort = 1;
private int maxPort = 0x10000;
private String host = "192.168.1.104";
private int timeout = 100;
 
public int getTimeout() {
return timeout;
}
 
public void setTimeout(int timeout) {
this.timeout = timeout;
}
 
public int getMinPort() {
return minPort;
}
 
public void setMinPort(int minPort) {
this.minPort = minPort;
}
 
public int getMaxPort() {
return maxPort;
}
 
public void setMaxPort(int maxPort) {
this.maxPort = maxPort;
}
 
public String getHost() {
return host;
}
 
public void setHost(String host) {
this.host = host;
}
 
public List<Integer> scan() {
try {
InetAddress ia = InetAddress.getByName(getHost());
return scan(ia);
} catch (IOException ioe) {
return null;
}
}
 
List<Integer> scan(InetAddress inetAddress) {
List<Integer> openPortsList = new ArrayList<Integer>(0xFF);
System.out.println("scanning ports: ");
for (int port = minPort; port <= maxPort; port++) {
System.out.print(port);
try {
InetSocketAddress isa = new InetSocketAddress(inetAddress,port);
Socket socket = new Socket();
socket.connect(isa,timeout);
System.out.println(" opened");
openPortsList.add(port);
socket.close();
} catch (IOException ioe) {
System.out.println("");
}
}
return openPortsList;
}
 
public static void main(String[] args) {
if (args.length < 1) {
usage();
return;
}
 
String host = args[0];
System.out.println("Scanning host "+host);
 
PortScanner scanner = new PortScanner();
 
if (args.length==2) {
if (args[1].indexOf("-")>-1) {
// range of ports pointed out
String[] ports = args[1].split("-");
try {
int minPort = Integer.parseInt(ports[0]);
int maxPort = Integer.parseInt(ports[1]);
scanner.setMinPort(minPort);
scanner.setMaxPort(maxPort);
} catch (NumberFormatException nfe) {
System.out.println("Wrong ports!");
return;
}
} else {
// one port pointed out
try {
int port = Integer.parseInt(args[1]);
scanner.setMinPort(port);
scanner.setMaxPort(port);
} catch (NumberFormatException nfe) {
System.out.println("Wrong port!");
return;
}
}
}
 
scanner.setHost(host);
List<Integer> openPortsList = scanner.scan();
if (openPortsList != null) {
if (openPortsList.size() >0) {
System.out.println("List of opened ports:");
for (Integer openedPort : openPortsList) {
System.out.println(openedPort);
}
} else {
System.out.println("No opened ports!");
}
} else {
System.out.println("Error happened!");
}
}
 
static void usage() {
System.out.println("Java Port Scanner usage: ");
System.out.println("java PortScanner host port");
System.out.println("Examples:");
System.out.println("java PortScanner 192.168.1.100 1-1024");
System.out.println("java PortScanner 192.168.1.100 1099");
System.out.println("java PortScanner 192.168.1.100 (this scans all ports from 1 to 0x10000)");
}
}


Все действие происходит в методе scan. В общем, там все довольно понятно, так что, мне кажется, объяснения излишни. Code is the best document!

П.С. Хороший открытый сканер портов на Java - Angry IP Scanner.

пятница, 9 июля 2010 г.

Подключение SSL к Томкату

Допустим, что нам в веб-приложении нужно иметь несколько URL, которые доступны только по HTTPS. Это может быть работа с любыми чувствительными данными: платежи, почта, и т. п. В основном, это, конечно, финансовые данные. Вот об этом и будет рассказано в этом посте.

По мотивам Setting Up SSL on Tomcat In 3 Easy Steps

Нужно сделать следующее:

  1. Сгенерировать ключ

  2. Настроить Tomcat для использования этого ключа

  3. Настроить веб-приложение на работу по HTTPS

Генерация ключа



Используем утилиту keytool:

keytool -genkey -alias jdevnotes -keypass jdevpasswd -keystore jdevnotes.keystore.bin -storepass jdevpasswd

Эта команда генерирует ключ с алиасом jdevnotes, который сохраняется в файл (keystore, хранилище ключей) jdevnotes.keystore.bin. Также задается пароль на ключ и на хранилище в целом (пароли одинаковые - jdevpasswd).

Немножко подробнее о ключах: Все ключи хранятся в хранилище ключей (файл jdevnotes.keystore.bin). Каждое хранилище может содержать множество ключей. Доступ к ключу осуществляется по алиасу. Алиасы - регистро-независимые, т.е. алиас john и JoHn - один и тот же алиас с точки зрения хранилища ключей.

При создании ключа задается также следующая информация:

What is your first and last name?
What is the name of your organizational unit?
What is the name of your organization?
What is the name of your City or Locality?
What is the name of your State or Province?
What is the two-letter country code for this unit?


Здесь вводится информация о том, кто ты такой и где находишься.

Настройка Tomcat для использования ключа



Перемещаем файлик с ключом в каталог $CATALINA_HOME/webapps. После этого редактируем файлик $CATALINA_HOME/conf/server.xml. В этом файле раскомментируем коннектор на 8443 порту, добавим ссылку на файл с ключами и пароль для хранилища, получим:

<Connector port=”8443″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”true” disableUploadTimeout=”true”
acceptCount=”100″ debug=”0″ scheme=”https” secure=”true”
clientAuth=”false” sslProtocol=”TLS”
keystoreFile=”/webapps/jdevnotes.keystore.bin”
keystorePass=”jdevpasswd” />


Теперь зайдите по адресу

https://localhost:8443

мы зашли на менеджер Томката по HTTPS. Теперь, любое приложение, которое развернуто на Томкате, может быть доступно как по HTTP, так и по HTTPS. Теперь рассмотрим, как сделать так, чтобы некоторые урлы были доступны только через HTTPS.

Настройка веб-приложения на работу только по HTTPS



Откроем файлик web.xml нашего приложения и добавим туда следующий код (код нужно помещать в самом конце контейнера web-app):

<security-constraint>
<web-resource-collection>
<web-resource-name>securedapp</web-resource-name>
<url-pattern>/billing/fullBalanceHistory</url-pattern>
<url-pattern>/mail/inbox</url-pattern>
<url-pattern>/somethingelse/*</url-pattern>
</web-resource-collection>
 
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>


Следующие ссылки будут доступны только по HTTPS:
/billing/fullBalanceHistory
/mail/inbox
/somethingelse/*

Если мы хотим, чтобы все приложение было доступно по HTTPS, то просто ставим паттерн /*. Если хотим вдруг выключить SSL, то для этого можно просто записать NONE в тег
<transport-guarantee>

среда, 23 июня 2010 г.

Запуск Trac Standalone и аутентификация пользователей

Мы хотим запустить trac. обычно его запускают из-под Apache, но мы не будем этого делать. Вместо этого мы запустим Trac Standalone - самостоятельный веб-сервер, который и будет хостить trac. На странице проекта Trac Standalone можно подробнее прочитать об этом способе запуска.

Считаем, что trac у нас уже установлен.

Запустим trac на 9990 порту на проекте prj1:

$ tracd --port 9990 /home/trac/prj1

Отлично, tracd стартовал.

Теперь подумаем про аутентификацию пользователей.

Вначале создаем даем двум пользователям, vasya и petya, привилегии админов trac:

$ trac-admin /home/trac/prj1 permission add vasya TRAC_ADMIN
$ trac-admin /home/trac/prj1 permission add petya TRAC_ADMIN


Теперь создаем файлик, который будет содержать имена пользователей и хеш-суммы их паролей. Каждая строка в файле формируется следующим образом:

username:realm:md5sum(username:realm:password)

Например, если пользователь petya имеет пароль password1, а realm мы задали как 'trac', то строка для petya в файле будет такой:

petya:trac:7f9c7f2ecd9894a028ce8c10ede46719

где 7f9c7f2ecd9894a028ce8c10ede46719 - md5-хешсумма от строки 'petya:trac:password1'.

Пусть мы создали этот файл для двух пользователей (пароль для vasya: 'password2'):

petya:trac:7f9c7f2ecd9894a028ce8c10ede46719
vasya:trac:1bacebce4824deae3bb3c9851c22fbbc


Теперь этот файл (trac_users.txt) можно указать в настройках tracd:

$ tracd --port 9990 --auth=prj1,trac_users.txt,trac /home/trac/prj1

На этом все.

воскресенье, 20 июня 2010 г.

Назначение и изменение прав на каталоги и файлы в unix

Назначение и изменение прав на каталоги и файлы в unix:
Стандартные права Unix, SUID, SGID, Sticky биты

Хорошее, годное и подробное руководство.

вторник, 15 июня 2010 г.

Связка nginx - Tomcat: прокидывание реального IP пользователя до Томката

При разработке Evaphone мы решили все томкаты проксировать с помощью nginx. Это хорошо известная схема - frontend server - backend server. Frontend сервер (в нашем случае - nginx) занимается отдачей статики, а на backend он проксирует запросы на динамику. Такая схема работы позволяет снизить нагрузку на "тяжелый" бэкенд и увеличить производительность приложения.

Внутри нашего приложения используется информация о пользователи, а именно, IP-адрес. Когда запрос проксируется nginx'ом, то, естественно, реальный IP-адрес пользователя подменяется адресом машины, на которой работает nginx. Однако, nginx не "теряет" реальный IP-адрес. Вместо этого он передает его в HTTP-заголовке "x-real-ip". Это настраивается следующим конфигом nginx:


location = /tomcat {
proxy_pass ___tomcat_app_url___;
proxy_redirect off;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}


В этот конфиг вместо ___tomcat_app_url___ нужно подставить URL приложения на томкате, куда будет передаваться запрос. Например, может быть следующий URL: http://127.0.0.1:8080/myapp (это если tomcat и nginx работают на одной машине). Этот конфиг говорит томкату, что все запросы по адресу <ваш_ip>/tomcat нужно проксировать на ___tomcat_app_url___.

Теперь рассмотрим настройку Tomcat. Мы знаем, что реальный айпишник приходит к нам в заголовке запроса "x-real-ip". Подмену адреса (вернее, вытягивание реального айпишника) мы делаем с помощью сервлетного фильтра:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.FilterConfig;
import javax.servlet.FilterChain;
import javax.servlet.ServletResponse;
import javax.servlet.ServletRequest;
import javax.servlet.Filter;
 
public class GetRealIPFilter implements Filter {
 
public static final String X_FORWARDED_FOR = "x-forwarded-for";
public static final String X_REAL_IP = "x-real-ip";
 
public GetRealIPFilter() {
//System.out.println("[GetRealIPFilter.GetRealIPFilter]");
}
 
public void destroy() {
//System.out.println("[GetRealIPFilter.destroy]");
}
 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException
{
//System.out.println("[GetRealIPFilter.doFilter]");
if (request instanceof HttpServletRequest) {
 
HttpServletRequest httpRequest = (HttpServletRequest)request;
 
final String realIp = httpRequest.getHeader(X_REAL_IP);
final String realHost = httpRequest.getHeader(X_FORWARDED_FOR);
 
//System.out.println("[GetRealIPFilter.doFilter], realIp='"+realIp+"'");
//System.out.println("[GetRealIPFilter.doFilter], realHost='"+realHost+"'");
 
if (realIp != null) {
//System.out.println("[GetRealIPFilter.doFilter], realIp != null, wrap request");
 
filterChain.doFilter(
new HttpServletRequestWrapper(httpRequest) {
public String getRemoteAddr() {
return realIp;
}
public String getRemoteHost() {
return realHost;
}
},
response
);
return;
}
}
filterChain.doFilter(request, response);
}
 
public void init(FilterConfig filterConfig) throws ServletException {
//System.out.println("[GetRealIPFilter.init]");
}
}


Код достаточно понятный. Что мы делаем:

  1. Проверяем, есть ли заголовок "x-real-ip". Если его нет, то ничего не делаем, т.е. все остается по-старому. Tomcat продолжит принимать запросы напрямую

  2. Если заголовок "x-real-ip" присутствует, то в цепочку фильтров мы передаем не пришедший к нам от nginx request, а его обертку HttpServletRequestWrapper, в которой мы подменили методы getRemoteAddr и getRemoteHost так, чтобы они выдавали данные, пришедшие в заголовках "x-real-ip", "x-forwarded-for" соответственно.


Осталось только замэппить наш фильтр на все приложение. В файле web.xml добавляем следующие строки:

<filter>
<filter-name>get_real_ip_filter</filter-name>
<filter-class>GetRealIPFilter</filter-class>
</filter>
 
<filter-mapping>
<filter-name>get_real_ip_filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


На этом все!

Пара ссылок:

Настройка nginx для работы с apache и tomcat серверами на примере Ubuntu 10.04 Server

Nginx + Tomcat - тред на форуме nginx

JSP+Tomcat+nginx - тред на форуме RSDN

UPD 11 Июля 2010: Улучшенный код:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) 
throws ServletException, IOException
{
//System.out.println("[GetRealIPFilter.doFilter]");
if (request instanceof HttpServletRequest) {
 
HttpServletRequest httpRequest = (HttpServletRequest)request;
 
final String realIp = httpRequest.getHeader(X_REAL_IP);
final String realHost = httpRequest.getHeader(X_FORWARDED_FOR);
 
//System.out.println("[GetRealIPFilter.doFilter], realIp='"+realIp+"'");
//System.out.println("[GetRealIPFilter.doFilter], realHost='"+realHost+"'");
 
if (realIp != null) {
if (realHost != null) {
filterChain.doFilter(new HttpServletRequestWrapper(httpRequest) {
public String getRemoteAddr() {return realIp;}
public String getRemoteHost() {return realHost;}
},response);
return;
} else {
filterChain.doFilter(new HttpServletRequestWrapper(httpRequest) {
public String getRemoteAddr() {return realIp;}
},response);
return;
}
} else if (realHost != null) {
filterChain.doFilter(new HttpServletRequestWrapper(httpRequest) {
public String getRemoteHost() {return realHost;}
},response);
return;
}
}
filterChain.doFilter(request, response);
}

суббота, 12 июня 2010 г.

Установка yum на CentOS 5.4 (Final):

Ставим yum на CentOS 5.4 (Final):


cd ~/
mkdir temp
cd temp
wget http://mirror.centos.org/centos/5/os/i386/CentOS/yum-3.2.22-26.el5.centos.noarch.rpm
wget http://mirror.centos.org/centos/5/os/i386/CentOS/python-iniparse-0.2.3-4.el5.noarch.rpm
wget http://mirror.centos.org/centos/5/os/i386/CentOS/rpm-python-4.4.2.3-18.el5.i386.rpm
wget http://mirror.centos.org/centos/5/os/i386/CentOS/python-urlgrabber-3.1.0-5.el5.noarch.rpm
wget http://mirror.centos.org/centos/5/os/i386/CentOS/yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rpm
wget http://mirror.centos.org/centos/5/os/i386/CentOS/yum-metadata-parser-1.1.2-3.el5.centos.i386.rpm
wget http://mirror.centos.org/centos/5/os/i386/CentOS/m2crypto-0.16-6.el5.6.i386.rpm
rpm -ivh *rpm


список RPM-пакетов для CentOS можно посмотреть по ссылке http://mirror.centos.org/centos/5/os/i386/CentOS

Здесь http://www.electrictoolbox.com/install-yum-with-rpm-on-centos/ раскрывается похожая тема

вторник, 8 июня 2010 г.

Установка переменных среды для Java, Apache Tomcat

Устанавливаем переменные среды JAVA_HOME, CATALINA_HOME. Только что столкнулся с тем, что если устанавливать переменные среды через export из SSH, то они не сохраняются между SSH-сессиями. В этом случае их надо прописать в файле ~/bashrc или ~/bash_profile.

Прописал следующее, теперь все работает:

Добавил следующие строки в файл ~/bashrc

JAVA_HOME=/usr/java/jdk1.6.0_20
export JAVA_HOME

CATALINA_HOME=/usr/java/apache-tomcat-6.0.26
export CATALINA_HOME

PATH=$PATH:$JAVA_HOME/bin

export PATH


Весь же файл ~/bashrc выглядит так


# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

JAVA_HOME=/usr/java/jdk1.6.0_20
export JAVA_HOME

CATALINA_HOME=/usr/java/apache-tomcat-6.0.26
export CATALINA_HOME

PATH=$PATH:$JAVA_HOME/bin

export PATH

Установка и удаление java на CentOS

Устанавливаем JDK на CentOS:


  1. Скачиваем jdk-6u20-linux-i586.bin с сайта http://java.sun.com

  2. Заливаем его на сервер в каталог /usr/java

  3. Меняем права $>chmod 755 jdk-6u20-linux-i586.bin

  4. Выполняем #./jdk-6u20-linux-i586.bin

  5. Набираем yes для согласия с лицензией, далее идет установка

  6. Устанавливаем переменную среды # export JAVA_HOME=/usr/java/jdk1.6.0_20
    Затем кладем ее в PATH:
    # export PATH=$PATH:$JAVA_HOME/bin

  7. Проверочка #java -version
    Получаем:

    # java -version
    java version "1.6.0_20"
    Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
    Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)




UPDATE:

Как удалять JRE

Вот ссылка на java.com: How do I uninstall Java for Linux ?

Если JRE была поставлена из RPM:

1) проверяем, поставлена ли JRE из rpm:

rpm -qa | grep jre

2) удаляем

rpm -e jre-1.5.0_21-fcs

3) Профит! (иногда надо перезагрузить машину)

Постоянные читатели