'팁&테크/Linux'에 해당되는 글 69건

  1. 2011.08.18 Nginx YUM으로 설치하기
  2. 2011.08.18 Nginx 설정 예제(영문)
  3. 2011.08.18 Nginx 가상호스트 설정(영문)
  4. 2011.08.17 Nginx 와 Apache 동시사용 설정(영문) 1
  5. 2011.08.17 Nginx 설치(간략) 1
  6. 2011.08.09 필수 rpm 소속 패키지(메모)
  7. 2011.08.08 리눅스 명령(메모)
  8. 2011.07.25 리눅스보안 - 필수 보안 조치법
  9. 2011.07.13 PHP에 MCRYPT 모듈 설치(DSO) 1
  10. 2011.04.07 리눅스 fail2ban 설치 (Centos 5.5)
2011. 8. 18. 12:15

Nginx YUM으로 설치하기

먼저 EPEL (Extra Packages for Enterprise Linux)을 설치해야 YUM에 목록이 나오니 반드시 설치해야 한다.
EPEL에는 일반적으로 개별적으로 설치해야 했던 fail2ban 과 같은 유용한 패키지가 많이 있다.

1. 버젼에 맞는 EPEL 패키지 설치

CentOS 6.x 32-bit (x86/i386):

rpm -Uvh http://download.fedora.redhat.com/pub/epel/6/i386/epel-release-6-5.noarch.rpm

 

CentOS 6.x 64-bit (x64):

rpm -Uvh http://download.fedora.redhat.com/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm

 

CentOS 5.x 32-bit (x86/i386):

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

 

CentOS 5.x 64-bit (x64):

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm


2. YUM으로 설치
yum install nginx 하면 끝.
다만 현재 최신버젼이 1.10 인데 비해 yum 에는 0.8.54가 등록되어 있다.
소스 컴파일 설치도 비교적 어렵지 않으니 그냥 소스컴파일 해서 쓸련다.




 
2011. 8. 18. 11:32

Nginx 설정 예제(영문)

Example Configuration

nginx.conf

user       www www;
worker_processes  5;
error_log  logs/error.log;
pid        logs/nginx.pid;
worker_rlimit_nofile 8192;
 
events {
  worker_connections  4096;
}
 
http {
  include    conf/mime.types;
  include    /etc/nginx/proxy.conf;
  include    /etc/nginx/fastcgi.conf;
  index    index.html index.htm index.php;
 
  default_type application/octet-stream;
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
  access_log   logs/access.log  main;
  sendfile     on;
  tcp_nopush   on;
  server_names_hash_bucket_size 128; # this seems to be required for some vhosts
 
  server { # php/fastcgi
    listen       80;
    server_name  domain1.com www.domain1.com;
    access_log   logs/domain1.access.log  main;
    root         html;
 
    location ~ \.php$ {
      fastcgi_pass   127.0.0.1:1025;
    }
  }
 
  server { # simple reverse-proxy
    listen       80;
    server_name  domain2.com www.domain2.com;
    access_log   logs/domain2.access.log  main;
 
    # serve static files
    location ~ ^/(images|javascript|js|css|flash|media|static)/  {
      root    /var/www/virtual/big.server.com/htdocs;
      expires 30d;
    }
 
    # pass requests for dynamic content to rails/turbogears/zope, et al
    location / {
      proxy_pass      http://127.0.0.1:8080;
    }
  }
 
  upstream big_server_com {
    server 127.0.0.3:8000 weight=5;
    server 127.0.0.3:8001 weight=5;
    server 192.168.0.1:8000;
    server 192.168.0.1:8001;
  }
 
  server { # simple load balancing
    listen          80;
    server_name     big.server.com;
    access_log      logs/big.server.access.log main;
 
    location / {
      proxy_pass      http://big_server_com;
    }
  }


nginx.conf

  user  www www;
  worker_processes  2;
  pid /var/run/nginx.pid;
 
  # [ debug | info | notice | warn | error | crit ] 
  error_log  /var/log/nginx.error_log  info;
 
  events {
    worker_connections   2000;
    # use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] ;
    use kqueue;
  }
 
  http {
    include       conf/mime.types;
    default_type  application/octet-stream;
 
    log_format main      '$remote_addr - $remote_user [$time_local]  '
      '"$request" $status $bytes_sent '
      '"$http_referer" "$http_user_agent" '
      '"$gzip_ratio"';
 
    log_format download  '$remote_addr - $remote_user [$time_local]  '
      '"$request" $status $bytes_sent '
      '"$http_referer" "$http_user_agent" '
      '"$http_range" "$sent_http_content_range"';
 
    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;
 
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;
 
    gzip on;
    gzip_min_length  1100;
    gzip_buffers     4 8k;
    gzip_types       text/plain;
 
    output_buffers   1 32k;
    postpone_output  1460;
 
    sendfile         on;
    tcp_nopush       on;
 
    tcp_nodelay      on;
    send_lowat       12000;
 
    keepalive_timeout  75 20;
 
    # lingering_time     30;
    # lingering_timeout  10;
    # reset_timedout_connection  on;
 
 
    server {
      listen        one.example.com;
      server_name   one.example.com  www.one.example.com;
 
      access_log   /var/log/nginx.access_log  main;
 
      location / {
        proxy_pass         http://127.0.0.1/;
        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;
 
        client_max_body_size       10m;
        client_body_buffer_size    128k;
 
        client_body_temp_path      /var/nginx/client_body_temp;
 
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_send_lowat           12000;
 
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
 
        proxy_temp_path            /var/nginx/proxy_temp;
 
        charset  koi8-r;
      }
 
      error_page  404  /404.html;
 
      location /404.html {
        root  /spool/www;
 
        charset         on;
        source_charset  koi8-r;
      }
 
      location /old_stuff/ {
        rewrite   ^/old_stuff/(.*)$  /new_stuff/$1  permanent;
      }
 
      location /download/ {
        valid_referers  none  blocked  server_names  *.example.com;
 
        if ($invalid_referer) {
          #rewrite   ^/   http://www.example.com/;
          return   403;
        }
 
        # rewrite_log  on;
        # rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3
        rewrite ^/(download/.*)/mp3/(.*)\..*$ /$1/mp3/$2.mp3 break;
 
        root         /spool/www;
        # autoindex    on;
        access_log   /var/log/nginx-download.access_log  download;
      }
 
      location ~* ^.+\.(jpg|jpeg|gif)$ {
        root         /spool/www;
        access_log   off;
        expires      30d;
      }
    }
  }

Auxilary Files

proxy_conf

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;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

fastcgi_conf

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
 
fastcgi_index  index.php;
 
fastcgi_param  REDIRECT_STATUS    200;

mime_types

types {
  text/html                             html htm shtml;
  text/css                              css;
  text/xml                              xml rss;
  image/gif                             gif;
  image/jpeg                            jpeg jpg;
  application/x-javascript              js;
  text/plain                            txt;
  text/x-component                      htc;
  text/mathml                           mml;
  image/png                             png;
  image/x-icon                          ico;
  image/x-jng                           jng;
  image/vnd.wap.wbmp                    wbmp;
  application/java-archive              jar war ear;
  application/mac-binhex40              hqx;
  application/pdf                       pdf;
  application/x-cocoa                   cco;
  application/x-java-archive-diff       jardiff;
  application/x-java-jnlp-file          jnlp;
  application/x-makeself                run;
  application/x-perl                    pl pm;
  application/x-pilot                   prc pdb;
  application/x-rar-compressed          rar;
  application/x-redhat-package-manager  rpm;
  application/x-sea                     sea;
  application/x-shockwave-flash         swf;
  application/x-stuffit                 sit;
  application/x-tcl                     tcl tk;
  application/x-x509-ca-cert            der pem crt;
  application/x-xpinstall               xpi;
  application/zip                       zip;
  application/octet-stream              deb;
  application/octet-stream              bin exe dll;
  application/octet-stream              dmg;
  application/octet-stream              eot;
  application/octet-stream              iso img;
  application/octet-stream              msi msp msm;
  audio/mpeg                            mp3;
  audio/x-realaudio                     ra;
  video/mpeg                            mpeg mpg;
  video/quicktime                       mov;
  video/x-flv                           flv;
  video/x-msvideo                       avi;
  video/x-ms-wmv                        wmv;
  video/x-ms-asf                        asx asf;
  video/x-mng                           mng;
}
2011. 8. 18. 11:27

Nginx 가상호스트 설정(영문)

Virtual Hosts Examples

Two Virtual Hosts, Serving Static Files

http {
  index index.html;
 
  server {
    server_name www.domain1.com;
    access_log logs/domain1.access.log main;
 
    root /var/www/domain1.com/htdocs;
  }
 
  server {
    server_name www.domain2.com;
    access_log  logs/domain2.access.log main;
 
    root /var/www/domain2.com/htdocs;
  }
}

A Default Catchall Virtual Host

http {
  index index.html;
 
  server {
    listen 80 default;
    server_name _;
    access_log logs/default.access.log main;
 
    server_name_in_redirect off;
 
    root  /var/www/default/htdocs;
  }
}

Wildcard Subdomains in a Parent Folder

This is just a really easy way to keep adding new subdomains, or to add new domains automatically when DNS records are pointed at the server. Note that I have included FCGI here as well. If you want to just serve static files, strip out the FCGI config and change the default document to index.html. Rather than creating a new vhost.conf file for every domain, just create one of these:

server {
  # Replace this port with the right one for your requirements
  listen 80 [default|default_server];  #could also be 1.2.3.4:80
 
  # Multiple hostnames separated by spaces.  Replace these as well.
  server_name star.yourdomain.com *.yourdomain.com; # Alternately: _
 
  root /PATH/TO/WEBROOT/$host;
 
  error_page 404 errors/404.html;
  access_log logs/star.yourdomain.com.access.log;
 
  index index.php index.html index.htm;
 
  # serve static files directly
  location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
    access_log off;
    expires max;
  }
 
  location ~ \.php$ {
    include fastcgi_params;
    fastcgi_intercept_errors on;
    # By all means use a different server for the fcgi processes if you need to
    fastcgi_pass   127.0.0.1:YOURFCGIPORTHERE;
  }
 
  location ~ /\.ht {
    deny  all;
  }
}
2011. 8. 17. 16:14

Nginx 와 Apache 동시사용 설정(영문)

Reconfiguring Apache

There are two main aspects of your Apache configuration that will need to be edited in order to allow both Apache and Nginx to work together at the same time. But let us first clarify where we are coming from, and what we are going towards.

Configuration overview

At this point, you probably have the following architecture set up on your server:

  • A web server application running on port 80, such as Apache
  • A dynamic server-side script processing application such as PHP, communicating with your web server via CGI, FastCGI, or as a server module

The new configuration that we are going towards will resemble the following:

  • Nginx running on port 80
  • Apache or another web server running on a different port, accepting requests coming from local sockets only
  • The script processing application configuration will remain unchanged

As you can tell, only two main configuration changes will be applied to Apache as well as the other web server that you are running. Firstly, change the port number in order to avoid conflicts with Nginx, which will then be running as the frontend server. Secondly, (although this is optional) you may want to disallow requests coming from the outside and only allow requests forwarded by Nginx. Both configuration steps are detailed in the next sections.

Resetting the port number

Depending on how your web server was set up (manual build, automatic configuration from server panel managers such as cPanel, Plesk, and so on) you may find yourself with a lot of configuration files to edit. The main configuration file is often found in /etc/httpd/conf/ or /etc/apache2/, and there might be more depending on how your configuration is structured. Some server panel managers create extra configuration files for each virtual host.

There are three main elements you need to replace in your Apache configuration:

  • The Listen directive is set to listen on port 80 by default. You will have to replace that port by another such as 8080. This directive is usually found in the main configuration file.
  • You must make sure that the following configuration directive is present in the main configuration file: NameVirtualHost A.B.C.D:8080, where A.B.C.D is the IP address of the main network interface on which server communications go through.
  • The port you just selected needs to be reported in all your virtual host configuration sections, as described below.

The virtual host sections must be transformed from the following template

<VirtualHost A.B.C.D:80>
ServerName example.com
ServerAlias www.example.com
[...]
</VirtualHost>

to the following:

<VirtualHost A.B.C.D:8080>
ServerName example.com:8080
ServerAlias www.example.com
[...]
</VirtualHost>

In this example, A.B.C.D is the IP address of the virtual host and example.com is the virtual host's name. The port must be edited on the first two lines.

Accepting local requests only

There are many ways you can restrict Apache to accept only local requests, denying access to the outside world. But first, why would you want to do that? As an extra layer positioned between the client and Apache, Nginx provides a certain comfort in terms of security. Visitors no longer have direct access to Apache, which decreases the potential risk regarding all security issues the web server may have. Globally, it's not necessarily a bad idea to only allow access to your frontend server.

The first method consists of changing the listening network interface in the main configuration file. The Listen directive of Apache lets you specify a port, but also an IP address, although, by default, no IP address is selected resulting in communications coming from all interfaces. All you have to do is replace the Listen 8080 directive by Listen 127.0.0.1:8080; Apache should then only listen on the local IP address. If you do not host Apache on the same server, you will need to specify the IP address of the network interface that can communicate with the server hosting Nginx.

The second alternative is to establish per-virtual-host restrictions:

<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
eny all
</VirtualHost>

Using the allow and deny Apache directives, you are able to restrict the allowed IP addresses accessing your virtual hosts. This allows for a finer configuration, which can be useful in case some of your websites cannot be fully served by Nginx.

Once all your changes are done, don't forget to reload the server to make sure the new configuration is applied, such as service httpd reload or /etc/init.d/ httpd reload.

Configuring Nginx

There are only a couple of simple steps to establish a working configuration of Nginx, although it can be tweaked more accurately as seen in the next section.

Enabling proxy options

The first step is to enable proxying of requests from your location blocks. Since the proxy_pass directive cannot be placed at the http or server level, you need to include it in every single place that you want to be forwarded. Usually, a location / { fallback block suffices since it encompasses all requests, except those that match location blocks containing a break statement.

Here is a simple example using a single static backend hosted on the same server:

server {
server_name .example.com;
root /home/example.com/www;
[...]
location / {
proxy_pass http://127.0.0.1:8080;
}
}

In the following example, we make use of an Upstream block allowing us to specify multiple servers:

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;
}
}

So far, with such a configuration, all requests are proxied to the backend server; we are now going to separate the content into two categories:

  • Dynamic files: Files that require processing before being sent to the client, such as PHP, Perl, and Ruby scripts, will be served by Apache
  • Static files: All other content that does not require additional processing, such as images, CSS files, static HTML files, and media, will be served directly by Nginx

We thus have to separate the content somehow to be provided by either server.

Separating content

In order to establish this separation, we can simply use two different location blocks—one that will match the dynamic file extensions and another one encompassing all the other files. This example passes requests for .php files to the proxy:

server {
server_name .example.com;
root /home/example.com/www;
[...]
location ~* \.php.$ {
# Proxy all requests with an URI ending with .php*
# (includes PHP, PHP3, PHP4, PHP5...)
proxy_pass http://127.0.0.1:8080;
}
location / {
# Your other options here for static content
# for example cache control, alias...
expires 30d;
}
}

This method, although simple, will cause trouble with websites using URL rewriting. Most Web 2.0 websites now use links that hide file extensions such as http://example.com/articles/us-economy-strengthens/; some even replace file extensions with links resembling the following:http://example.com/useconomy- strengthens.html.

When building a reverse-proxy configuration, you have two options:

  • Port your Apache rewrite rules to Nginx (usually found in the .htaccess file at the root of the website), in order for Nginx to know the actual file extension of the request and proxy it to Apache correctly.
  • If you do not wish to port your Apache rewrite rules, the default behavior shown by Nginx is to return 404 errors for such requests. However, you can alter this behavior in multiple ways, for example, by handling 404 requests with the error_page directive or by testing the existence of files before serving them. Both solutions are detailed below.

Here is an implementation of this mechanism, using the error_page directive :

server {
server_name .example.com;
root /home/example.com/www;
[...]
location / {
# Your static files are served here
expires 30d;
[...]
# For 404 errors, submit the query to the @proxy
# named location block
error_page 404 @proxy;
}

location @proxy {
proxy_pass http://127.0.0.1:8080;
}
}

Alternatively, making use of the if directive from the Rewrite module:

server {
server_name .example.com;
root /home/example.com/www;
[...]
location / {
# If the requested file extension ends with .php,
# forward the query to Apache
if ($request_filename ~* \.php.$) {
break; # prevents further rewrites
proxy_pass http://127.0.0.1:8080;
}
# If the requested file does not exist,
# forward the query to Apache
if (!-f $request_filename) {
break; # prevents further rewrites
proxy_pass http://127.0.0.1:8080;
}
# Your static files are served here
expires 30d;
}
}

There is no real performance difference between both solutions, as they will transfer the same amount of requests to the backend server. You should work on porting your Apache rewrite rules to Nginx if you are looking to get optimal performance.

2011. 8. 17. 16:09

Nginx 설치(간략)

Nginx 는 러시아에서 만든 웹서버로 접속이 많을 경우에도 안정적인 처리량을 보여주기때문에 사용자가 늘어나고 있는 추세이다. 다만 Nginx 에서 동적페이지인 PHP를 구동할 경우 오히려 Apache보다 처리능력이 떨어지기 때문에 이미지 웹서버만 분리해서 운영하려고 할때 좋은 성능을 보여준다.

가벼운 nginx를 전면에 두고 PHP처리가 필요한 호출에 대해서는 백단의 Apache에서 처리하도록 할 것이다.
Nginx 는 80포트, Apache는 8080으로 설정

Apache, PHP, MySql 등은 YUM을 통해 설치된 상태임. Apache포트는 8080으로 변경(가상호스트도 마찬가지)

1. Nginx 최신버젼 다운로드
wget http://nginx.org/download/nginx-1.1.0.tar.gz

2. configure 및 설치
./configure --prefix=/usr/local/nginx && make && make install
다른 옵션도 많으니 ./configure --help 로 확인해볼 것. 

3. 환경설정
/usr/local/nginx/conf/nginx.conf 에보면 예제로 PHP확장자의 처리에 대한 부분이 있다.
주석처리된 부분을 아래와 같이 수정한다.

아래 라인을 주석 해제하고 설정해줌
location ~ \.php$ {

    root           html;

    fastcgi_pass   127.0.0.1:9000;

    fastcgi_index  index.php;

    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

    include        fastcgi_params;

}


#다른 port 에서 운영중인 웹서버를 이용할 경우(reverse proxy)
location ~ \.php$ {

    proxy_pass   http://127.0.0.1:8080;
}
여러 확장자를 처리하고 싶으면  ~ \.(php|htm|html)$ 과 같이 쓰면 됨

4. 실행
/usr/local/nginx/sbin/nginx 를 실행하면 웹서버가 시작함

옵션참고
-c 디폴트파일 대신 사용될 Nginx설정 파일을 지정합니다.
-t  Nginx를 실행하지는 않고 단지 설정파일을 테스트해봅니다. nginx에서 문법에 맞게 설정됐는지 체크합니다. 그리고 설정으로 지정된 파일을 시험삼아 열어봅니다.
-s  master 프로세스로 signal을 날립니다. :stop, quit, reopen, reload. (버전 >=0.7.53)
-v  버전을 찍어줍니다.
-V nginx의 버전, 컴파일러의 버전, 그리고 설정파라메터들을 찍어줍니다.
-ㅔ prefix prefix의 경로를 설정합니다. (디폴트 : /usr/local/nginx/). (버전 >=0.7.53)
-h, -? 도움말 찍기

5. 관리/종료
nginx -s signal

-s 옵션은 마스터 프로세스에 signal 을 날리는 옵션

signal 에는 아래 옵션을 사용하여 nginx를 시작/종료 할 수 있음
stop — 빠른종료(강제)
quit — 연결된 클라이언트와 통신과정이 끝난후 종료
reload — conf 파일 reload
reopen — 로그파일 재적용?

마스터 프로세서에 signal 을 날리는 방법외에 kill 을 사용하여 동일한 기능을 처리하도록 할수 있음

kill -signal  `cat /usr/local/nginx/logs/nginx.pid`

signal 에는 아래와 같은 명령을 줄 수 있음
TERM, INT - Quick shutdown 빠른 종료
QUIT - Graceful shutdown 정상적으로 종료
KILL - Halts a stubborn process 잘안죽는 프로세스 죽이기
HUP - Configuration reload
      Start the new worker processes with a new configuration
      Gracefully shutdown the old worker processes

      설정 리로드하기
      새로운 워커 프로세스가 시작될때 새로운 설정으로 시작됨
      오래된 워커 프로세스는 알아서 종료

USR1 - Reopen the log files - 로그파일 다시 열기
USR2 - Upgrade Executable on the fly 운행중 실행파일 업그레이드하기
WINCH - Gracefully shutdown the worker processes
        워커프로세스를 정상적으로 종료시키기


서버 운영중 reload 를 사용하여 conf 를 다시 읽을 경우 실시간으로 적용되므로 재시작 하지 않아도 된다.

6. 업데이트
kill 에서 사용하는 signal 중에 USER2 를 사용하여 서버가 동작중인 경우에도 업데이트를 할 수 있다.
1. kill -USER2  `cat /usr/local/nginx/logs/nginx.pid` 실행
  - 현재 사용하는 pid 파일을 .oldbin 으로 변경을 함
2. 새로운 버젼의 nginx 를 시작하면 두가지 버젼의 nginx 가 운영이되며 같이 80포트의 요청을 처리하게 됨
3. kill -WINCH  `cat /usr/local/nginx/logs/nginx.oldbin.pid` 실행 하여 이전버젼 nginx의 워커 프로세스들을 죵료시킨다.
4.  kill -QUIT `cat /usr/local/nginx/logs/nginx.oldbin.pid` 시그널로 이전버전을 종료시킴

만약 3번 까지 진행 이후 다시 이전버젼의 nginx로 되돌릴려고 할때는 아래와 같이 진행
- 오래된 마스터 프로세스에 HUP 시그날을 보낸다.(설정 리로드) -> 워커 프로세스가 다시 시작됨
- 새로운 마스터 프로세스에 QUIT 시그날을 보내서 그것의 워커프로세스를 정상적으로 종료시킨다.
- 새로운 마스터 프로세스에 TERM 시그날을 보내서 강제로 종료시킨다.
- 어떠한 이유로 새로운 마스터 프로세스가 종료되지 않으면, KILL 시그날을 보낸다.



2011. 8. 9. 15:48

필수 rpm 소속 패키지(메모)

dig -> bind-utils
2011. 8. 8. 15:06

리눅스 명령(메모)

디렉토리별 용량
du -h --max-depth=1

파일 확장자별 압축(합친 후 압축)
find . -name "*.c*"  -o -name "*.h" | xargs tar rvf src0503.tar 
gzip -f src0503.tar 

DNS 호스트 등록 확인 
nslookup -type=ns tistory.com

PCI 장치 확인 
lspci

프로세스가 사용중인 파일확인 
lsof -p pid번호

사용자 생성 관련 환경 설정 파일
/etc/login.defs
사용자 생성시 디렉토리 퍼미션을 700 에서 755로 줄려고 할 경우
위 파일의 UMASK 를 077 에서 022로 변경

리눅스 배포판 확인
ll /etc/*release*
/etc/redhat-release 레드햇계열

포트가 사용하는 프로그램 확인
netstat -atp | grep 문자열 
또는 
netstat -ano 를 사용해 pid를 구함
tasklist /svc /fi "pid eq 번호" 하면 출력이 됨 
 
열려있는 포트 확인 
netstat -lnpt

로그인메세지
전 /etc/issue, /etc/issue.net
후 /etc/motd

RPM설치시 같이 설치된 파일 확인
rpm -ql rpm패키지
 
특정파일이 어느 RPM으로 인해 생성되었는지 확인
rpm -qf 파일
 
설치된RPM 명과 설명 보기
rpm -qa --queryformat "%{NAME} : %{Summary}\n"

등록된 사용자의 마지막 접속기록확인
lastlog

바이너리파일 속의 ascii 문자 검색
strings 파일 | grep 검색문자열

rsync 명령
rsync -avrz --delete 아이피::심볼 /경로 -> 받을때
rsync -avrz --delete  /경로  아이피::심볼 -> 보낼때

-v : 진행 상황을 상세하게 보여줌 
-r : 지정한 디렉토리의 하위 디렉토리까지 재귀적으로 실행 
-l : 소프트 링크 보존 
-H : 하드 링크 보존 
-p : 버전 속성 보존 
-o : 소유 속성 보존(루트) 
-g : 그룹 속성 보존 
-t : 타임스탬프 보존 
-D : 디바이스 파일 보존(루트) 
-z : 데이터 압축 전송 
-b : 낡은 파일은 ~가 붙음 
-u : 추가된 파일만 전송 새 파일은 갱신하지 않음 
--existing : 추가된 파일은 전송하지 않고 갱신된 파일만 전송 
--delete : 서버에 없는 파일은 클라이언트에서도 삭제 
-a : 아카이브 모드. rlptgoD를 자동 지정 
-c : 서버와 클라이언트의 파일 크기를 세밀히 체크 
--stats : 결과를 보고 
-e ssh(rsh) : 전송 암호화


파일내 문자열 검색
find . -exec grep -i -l "찾는문자열" {} \; 2>/dev/null
-i : 대소문자 무시

검색한 프로세스 KILL
ps aux | grep 검색어 | awk '{ print $2 }' | xargs kill -9

라이브러리 들이 어떤 버전의 GLIBC를 필요로 하는지 확인(예: GLIBC_2.5 ~ 2.9까지를 필요로 하는 확장 검색 후 file.txt로 저장)

find /lib* /usr/lib* -type f -name '*.so' | xargs -i nm {} | grep "GLIBC_2.[5-9]" > file.txt
















2011. 7. 25. 10:53

리눅스보안 - 필수 보안 조치법


1. SUID 점검하기.(root 소유의 SetUID및 SetGID 파일들 점검

    find / -user root -perm -4000 -print (SetUID)
    find / -user root -perm -2000 -print (SetGID)
    find / -user root -perm -4000 -print -xdev

2. 파티션별 디스크사용량 점검
    df -h

3. 파일무결성 점검

    http://sourceforge.net/projects/tripwire/ 

4. 백도어 설치여부 점검.(/dev 체크 및 rootkit 점검)

    find /dev -type f -exec ls -l {} \;
    ./chkrootkit
    
5. 현재 열려진 포트 및 응답가능한 포트 점검

    netstat -atp | grep LISTEN (사용 프로토콜 : TCP인가? 또는 UDP인가?
           사용중인 포트번호
           서버와 연결된 IP 및 도메인명
           생성 PID
           서비스중인 프로세스명
           현재 응답가능상태인가?
    lsof | grep LISTEN(현재 서비스 중인 프로세스명(데몬명)
               현재 생성중인 PID번호.
           현재 서비스중인 프로세스의 소유자
           프로토콜 버전 : Ipv4 또는 Ipv6
           TCP 또는 UDP의 여부
           응답가능 상태인가?

6. 실생중인 프로세스 및 데몬점검.(프로세스의 생성관계)

    pstree

7. 시스템 운용상황 점검

   top -d2

8. 백업점검

9. 스팸메일 점검.(메일큐 디렉토리 점검)

  /var/spool/mqueue    (동일한 날짜, 동일한 사이즈를 가진 다수 파일구분)

10. Core 점검

 서버내에 긴급한 이상이 발생하였을 경우나 시스템의 정확한 분석을 위해
 서버의 메모리 상태를 순간적으로 dump 받는 경우의 파일
  find / -name core -exec ls -l {} \;
  
11. 파일용량 점검

 repquota -av -ag
 df -h

12. 최근 서버 접속자 점검

  vi /var/log/secure
  last -n 10  최근 10번째까지의 접속기록을 확인.

13. 계정별 최후접속기록 점검

           lastlog는 현재 /etc/passwd에 존재하는 모든 계정을 대상으로 하
여 언제 마지막으로
           서버에 접속을 했는가를 확인.
           Mail, adm, bin 등의 계정들은 모두 "** Never logged in **" 이라
고 되어 있는것이 정상.

  lastlog

14. 현재 서버접속자 보기

   w (telnet)
   ftpwho(ftp)

15. root명령어 사용기록 점검

           vi /root/.bash_history  (.set nu) 
           cat /root/..bash_history | wc -l    (1000라인 이상 되어야 정상)

16. 계정별 사용명령어파일 점검

           find / -name .bash_history -exec ls -l {} \;    (각 계정
별 .bash_history 파일의 존재여부)
           find / -name .bash_history -exec cat {} \;     (파일의 내용까
지 모두 확인해 볼 수 있음)

17. root소유자 점검(UID와 GID가 0인 사용자 점검)

           cat /etc/passwd | grep 0:0

18. 서버내에 중요한 디렉토리 점검

           /etc/xinetd.d/    (xinetd로 서비스되는 인터넷서비스 파일들이 존재하는 디렉토리)
           /etc/rc.d/           (부팅에 관계된 파일) (파일들을 복사 후 파일용량등을 비교하기) (커널패닉의원인)
           /etc/rc.d/init.d/ (부팅시에 특정 서비스나 데몬들을 시작시키는 스키립트 파일)

19. .rhosts 파일 점검

           원격에서 패스워드등의 확인과정없이 바로 접속하기 위해서 사용되는 파일
           
           find / -name .rhosts -exec ls -l {} \;
           find / -name .rhosts -exec cat {} \;

20. 메모리사용량 점검

           free -m
           cat /proc/meminfo   (free 와 top 는 이 파일을 참조하여 보여준다.)
           top -d2

21. 중요 관리자용명령어 점검

           아래의 명령어들을 퍼미션을 100으로 설정한다. 변경 후 퍼미션 변경여부를 확인.
           
           chmod 100 /usr/bin/top
           chmod 100 /usr/bin/pstree
           chmod 100 /usr/bin/w
           chmod 100 /bin/ps
           chmod 100 /usr/bin/who
           chmod 100 /usr/bin/find
           chmod 100 /bin/df
           chmod 100 /bin/netstat
           chmod 100 /sbin/ifconfig
           chmod 100 /usr/sbin/lsof
           chmod 100 /usr/bin/make
           chmod 100 /usr/bin/gcc
           chmod 100 /usr/bin/g++
           chmod 100 /usr/bin/c++
           chmod 100 /usr/bin/perl

22. su 명령어를 이용한 root권한 사용자 점검

           su 명령어의 사용내역을 확인할 수 있음.

           cat /var/log/messages | grep root

23. 최근 n 일전 변경된 파일 점검 (단위는 일)

           find / -ctime -1 -print | more

24. http://weblog.websea.co.kr/

25. find 를 이용한 특정파일 점검하기

           .exec 파일찾기
           find / -name '.exec' -exec cat {} \; -print

           .forward 파일체크
           find / -name '.forward' -exec cat {} \; -print

           write 퍼미션이 있는 파일(디렉토리)찾기
           find / -type f  \( -perm -2 -o -perm -20 \) -exec ls -lg {} \;
           find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \;

           SteUID SetGID 체크하기
           find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -
lg {} \;

           /dev 체크
           find /dev -type f -exec ls -l {} \;

           소유자없는 파일 및 디렉토리 찾기
           find / -nouser -o -nogroup -print

           원격리모트 접속허용 파일(.rhosts)찾기
           find / -name .rhosts -print

           최근 변경된 파일들 찾기.(파일or디렉토리) 단위는 일
           find / -ctime -20 -type f or d

           현재 서버에서 열려진 포트 및 접근저보 점검

           netstat -an | grep LISTEN   (포트들과 열결되어 있는 실행데몬들을 확인)
           lsof | grep LISTEN   (좀 더 자세히 확인)

26. 관리자용 명령어 퍼미션 수정하기

           chmod 100 /usr/bin/top
           chmod 100 /usr/bin/pstree
           chmod 100 /usr/bin/w
           chmod 100 /bin/ps
           chmod 100 /usr/bin/who
           chmod 100 /usr/bin/find
           chmod 100 /bin/df
           chmod 100 /bin/netstat
           chmod 100 /sbin/ifconfig
           chmod 100 /usr/sbin/lsof
           chmod 100 /usr/bin/make
           chmod 100 /usr/bin/gcc
           chmod 100 /usr/bin/g++
           chmod 100 /usr/bin/c++

27. 중요한 파일퍼미션과 소유권 제한 및 점검

           chmod 644 /etc/service
           chmod 600 /etc/xinetd
           chmod 644 /etc/mail/aliases
           chmod 600 /etc/httpd/conf/httpd.conf
           chmod 644 /var/log/wtmp
           chmod 644 /var/run/utmp
           chmod 644 /etc/motd
           chmod 644 /etc/mtab
           chmod 600 /etc/syslog.conf
           
           /etc, /usr/etc, /bin, /usr/bin, /sbin, /usr/sbin

           chmod 1777 /tmp
           chmod 1777 /var/tmp
           
28. umask 값 확인하기

           root의 umask 값 확인하기.
           umask
           022 -->파일은 644 디렉토리는 755로 생성됨.
           027 -->파일은 640 디렉토리는 750로 생성됨.

29. /dev 에 device 파일 이외의 것이 존재하고 있는지 확인

           find /dev -type f -exec ls -l {} \;

30. 일반사용자의 명령어 패스

           /usr/local/bin:usr/local/mysql/bin:/home/hosting/bin/
           일반사용자가 사용가능한 명령어를 모두 이것에 둠.

31. 관리자의 명령어 패스

           :/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin

           /X11:/usr/X11R6/bin:/usr/kerberos/bin:/root/bin

32. 특정 그룹만의 su 사용권한 허용하기

           vi /etc/group  (wheel구릅에 su 사용권한을 가질 유저 추가하기)
           wheel:x:10:root,cream

           vi /etc/pam.d/su (두줄 추가하기)

           auth            sufficient            /lib/security/pam_rootok.so
           auth            required                        /lib/security/pam_wheel.so allow group=wheel

           vi /var/log/message 에서 확인

33. chmod 400 /etc/shadow

34. 시스템 기본로그파일

           /var/log/messages
           /var/log/secure
           /var/log/wtmp
           /var/run/utmp
           /var/log/lastlog

35. utmp, wtmp, lastlog 파일

           utmp파일 : 현재시스템에 접속해 있는 사용자의 정보를 가지고 있음.
           
           strings utmp | more
           
           정보 이용 명령어
           login(1), who(1), init(8), last(8), lastcomm(8)

           wtmp파일 : 처음부터 접속했던 모든 사용자의 로그인정보와 로그아웃정보를 가지고 있음.

           strings wtmp | more

           정보 이용 명령어
           login(1), who(1), init(8), last(8), lastcomm(8)

           lastlog 파일

           가장 최근에 로그인한 정보를 저장함.

           last 라는 명령어로 확인할 수 있음.

36.  패스워드 유출대처방안(웹)

           perl을 이용한 방법.


   AllowOverride FileInfo AuthConfig Limit
   Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
   Options Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
   Options Indexes SymLinksIfOwnerMatch IncludesNoExec
   
       Order allow,deny
       Allow from all
   
   
       Order deny,allow
       Deny from all
   


           SSI의 exec 명령어를 이용하는 방법

#    AddType text/html .shtml
#    AddHandler server-parsed .shtml

27. PortSentry를 이용한 실시간 해킹방어 구현(잘못 사용할시 서버접속 안됨)

           tar -xvzf portsentry-1.1.tar.gz
           make linux
           make install

           /usr/local/psionic/portsentry/portsentry -tcp
           /usr/local/psionic/portsentry/portsentry -udp
           /usr/local/psionic/portsentry/portsentry -stcp
           /usr/local/psionic/portsentry/portsentry -atcp
           /usr/local/psionic/portsentry/portsentry -stdp

           vi /etc/hosts.deny 점검.

28. Chkrootkit 로 백도어 점검

           tar -xvzf chkrootkit.tar.gz
           make sense
           ./chkrootkit     (점검명령어)

29 ping 을 이용한 DOS 공격 막는 방법

           vi  /etc/sysctl.conf
           net.ipv4.icmp_echo_ignore_broadcasts = 1

           sysctl -w
           /etc/rc.d/init.d/network restart
           sysctl -a | grep ignore_broadcasts

30. Nmap를 이용 포트스켄 하여 해킹가능성 체크

           nmap -sS -p80 211.42.48.110 -O -v www.armian.net
           nmap -sS -O -v 211.42.48.114

출처 : [기타] 인터넷 : IT네트워크정보보안교육센터


2011. 7. 13. 13:30

PHP에 MCRYPT 모듈 설치(DSO)

yum으로 설치하지 않는 apache, php의 경우 추가 방법, PHP소스가 필요합니다.

1. mhash 모듈 설치

 yum install mhash* 을 하거나(추천) 파일을 다운받아 configure & make & makeinstall

2. libmcrypt 모듈 설치

yum install libmcrypt* 을 하거나 (추천)

mcrypt 모듈 소스 설치 ---------------------------------
파일을 다운받아(소스포지) configure & make & makeinstall -> 이 경우 /etc/ld.so.conf 에 /usr/local/lib 경로 추가 후 ldconfig 실행
소스포지에서 파일 다운로드 후 압축 해제
configure
make
make install 을 하면 파일이 /usr/local/bin/mcrypt 와 같이 생성됨
----------------- 소스설치끝

php소스/ext/mcrypt 로 이동하여
phpize
aclocal
configure --with-php-config=/usr/local/php/bin/php-config
make clean
make 
make install
순으로 명령을 실행하면 특정폴더에 mcrypt.so 파일을 생성했다는 내용이 나옮니다.
보통은 /usr/local/lib/php/extensions/no-debug-non-zts-20060613/ 와 같이 생성
해당 폴더로 이동해 보면 mcrypt.so 파일이 존재 하는데 해당 파일을 php extension 디렉토리로 옮기고
php.ini 에 extension=mcrypt.so 처럼 하거나 다른 디렉토리에 복사했을 경우 경로를 다 적어주면 됨
extension=/usr/local/lib/php/extensions/mcrypt.so
그후 아파치 리스타트!!


---------------------------------------------------------------------------------------------------
참고

Get and Install mhash

wget http://internap.dl.sourceforge.net/sourceforge/mhash/mhash-0.9.9.9.tar.gz
or go to sourceforge and find the latest.

tar -xvzf mhash-0.9.9.tar.gz
cd mhash-0.9.9
./configure --prefix=/usr/local/mhash
make
make install

Get and install libmcrypt

wget http://jaist.dl.sourceforge.net/sourceforge/mcrypt/libmcrypt-2.5.8.tar.gz
tar -xvzf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure --prefix=/usr/local/libmcrypt --disable-posix-threads
make
make install

Get and install mcrypt.

wget http://cdnetworks-kr-1.dl.sourceforge.net/project/mcrypt/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz
or go to source forge and get the latest.

tar -zxvf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8
./configure
make
make install


Create the mcrypt php5 module to load.

Find you source code for your php version.

use: find / -name "php"

mine was found here /usr/src/redhat/SOURCES/php-5.1.6/

cd to php-5.2.6/ext/mcrypt
phpize
aclocal
./configure
make clean
make
make install


If you are using a 64 bit computer, create a symbolic link.
cd /usr/lib64/modules
ln -s /usr/local/lib/php/extensions/no-debug-non-zts-20050922/mcrypt.so ./mcrypt.so

Create a new file named mcrypt.so in /etc/php.d directory and enter the following.

;Enable mcrypt extension module
extension=mcrypt.so

Create the mhash extension:

cd to php-5.2.6/ext/mhash
phpize
aclocal
./configure
make clean
make
make install

cd /usr/lib64/modules
[root modules]# ln -s /usr/local/lib/php/extensions/no-debug-non-zts-20050922/mhash.so ./mhash.so

Create a new file named mcrypt.so in /etc/php.d directory and enter the following.

;Enable mhash extension module
extension=mhash.so

Bounce Apache
[root /]#service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

Check Apache for mcrypt loaded.
Move to your website loaction and create a file named phpinfo.php and enter.

<?=phpinfo();?>

Now open a brower and point it to your site /phpinfo.php

Look for a section named mcrypt and mhash, they should show the version, supported ciphers, enabled, etc.
 


2011. 4. 7. 16:11

리눅스 fail2ban 설치 (Centos 5.5)

fail2ban 은 특정 서비스로 로그인을 몇회 이상 실패할 경우 일정기간 동안 차단하는 툴로 ssh 등에 무작위로 로그인하는 봇에 대응 하기 위한 모듈입니다.


1. fail2ban 을 받기 위해 사이트 http://www.fail2ban.org 로 가서 중간부분에 Downloads를 클


2. 여러가지 리눅스에 맞는 다운로드 링크가 나옵니다. 사용하시는 버젼에 맞게 클릭
   저는 Centos 5.5 를 사용하고 있으니 EPEL 이라고 된 곳을 클릭합니다.



3. 중간쯤에 What packags and Versions are available in EPEL? 부분을 보면 EPEL6,5,4 에 해당하는
   부분이 있는데 Centos 버젼과 똑같으니 Centos 5에 32bit를 사용하는 저는 EPEL5 i386에서 패키지를 찾으면
   되겠습니다.



4. 패키지들이 쭉 나오는데 윗쪽에 f 를 클릭하시면 f로 시작하는 패키지가 전부 나옵니다. 그중에 fail2ban을
   선택하도록 합니다.




5. 이제 fail2ban을 다운 받으면 되겠죠. 쉽게 하시려면 위에 처럼 다운로드 링크를 그냥 링크만 복사해
    설치하려는 리눅스에서 wget 을 통해 다운로드 하면 쉽게 다운이 받아집니다.



6. 다운받은 rpm을 설치하려고 보니 의존성 때문에 설치가 안되네요!!
   문구를 자세히 보면 shorewall 이 필요하다고 하니 설치하러 갑니다.!!



7. 아까 EPEL 에서 shorewall을 찾아서 다운로드 합시다!
   다만 주의 할것은 EPEL 페이지에 있는 rpm 을 받으면 부가적인 shorewall 패키지지를 먼저 설치하라고 나오니
   기왕이면 최신버젼을 받으러 홈페이지로 가보도록합니다.



8. shorewall.net 사이트에 방문해서 download -> standard download sites 에 가보시면 몇개의 미러사이트
    중에 마음에 드는 곳에서 다운받으시면 되겠습니다. 저는 소스포지에서 다운받겠네요.
   최신버젼은 4.4.16.1.tar.bz2 라고 친절하게 안내가 되있는데 소스설치는 귀찮으니깐 
   리스트에 나와있는 버젼을 클릭해서 rpm 파일을 다운받도록 합니다.



9. 다운받은 shorewall 을 설치하구요.


10. fail2ban도 설치하도록 합시다. 모르면 어려운데 알고 나면 참 쉽게 설치가 되네요.


11. fail2ban 파일들은 /etc/fail2ban 에 설치가 됩니다.


12. 설정파일인 jail.conf를 열어 bantime(차된 할 시간) 과 maxretry(실패한 횟수)를 적절하게 고쳐주고요.


13. 적용하려는 서비스를 찾아서 enabled = true로 고쳐주면 해당 서비스만 적용이 됩니다.
     저 같은 경우에는 ssh 와 vsftp 만 적용을 했습니다.

     섹션의 내용을 보시면 대충 이해하기 쉽게 되있네요.
     enabled 는 사용여부 
     filter 는 /etc/fail2ban/filter 에 보시면 로그를 읽을때 사용할 필터가 정의되있습니다.
     action 은 iptable로 차단 하고 메일을 발송하겠다는 내용이구요.
     logpath 는 읽어서 처리할 로그파일 위치
     maxretry 는 차단할 실패횟수
     bantime 은 차단시간입니다.



14. 그럼 이제 서비스를 시작하구요. 부팅 시에도 자동 시작되도록 ntsysv 명령으로 등록하면 작업이 완료됩니다.

이제부터는 중국 봇들이 얼씬도 못하겠네요 

퍼가실땐 출처를 반드시 밝혀주시구요. 출처를  밝히지 않으시는 경우는 어떤 경우에도 퍼가실 수 없습니다.