잊지 않겠습니다.

'linux'에 해당되는 글 4건

  1. 2009.07.03 LVS 방법에 따른 제약사항 정리
  2. 2009.06.30 LVS 관련 자료 (2)
  3. 2009.06.30 LVS 설정 - Directo Routing
  4. 2009.06.08 PHP로 메일 보내기.
LVS를 이용해서 Load Balancer를 구성할때 Direct Routing, NAT, Tunneling 방식으로 3가지 방식으로 사용될 수 있는데, 각 3가지 방법은 다음과 같은 차이를 가지고 있다.

1. Direct Routing
LVS에 VIP를 설정, VIP를 통해서 Node단에 Network Load 전송

* LVS
- eth0 에 자신의 private ip가 eth0:1에 VIP가 설정되는 식으로 VIP와 private ip를 모두 갖는다.
* Node
- loopback devicde(lo)에 LVS의 VIP가 설정되어야지 된다.
: IP Diagram에 자신이 처리해야지 되는 연결임을 알 수 있도록 설정되어야지 된다.

2. NAT
- 조금 특이한 형태. Input/output이 모두 LVS를 통해서 나가게 된다.
- 20대 이상의 대규모 네트워크에 매우 불리하다.

* LVS
- 반드시 2개 이상의 network adapter가 필요하다.
- 1개는 public ip로 연결, 나머지 1개는 private ip로 연결된다.
* Node
- private ip가 반드시 있어야지 된다. (public ip는 필요 없다.)
- private ip의 gateway에 LVS의 private ip가 설정된다.
: Network input/output이 모두 NAT를 통해서 나가게 되기 때문에 gateway를 모두 같이 맞춰줄 필요가 있다.
: IP class에 따라 제한이 될 수 있다.

3. Tunneling
- IP Diagram 변경을 통해 Network Load가 전송된다.

* LVS
- 특별하게 지정해줄 필요 없다. ipvsadm 명령어 옵션만 다를 뿐이다.
* Node
- tunl0 라는 network 가상 device를 추가해주고, LVS의 private ip로 연결되어야지 된다.
: LVS와 node간의 연결 통로를 미리 지정해주게 된다. 그리고, 이 곳에서 온 자신에 대한 네트워크 연결은 Tunneling으로 온 것으로 판단하고, 들어온 입력이 아닌, ip diagram에 있는 정보를 이용해서 return 시켜주게 된다.


결론
네트워크 시스템을 어떻게 구성할지를 고민해야지 될듯. 모든 Network에 대한 감시가 필요하고, LVS를 좋은 녀석으로 구성한다면 NAT가 가장 최선의 방법이 될 수도 있지만, 이는 LVS 에 엄청난 부하를 줄 수 있기 때문에 가장 많이 사용되는 것은 Direct Routing 방법. 그렇지만, Node에 따로 설정을 해줘야지 된다는 것은 부담으로 남는다.


Posted by Y2K
,

LVS 관련 자료 (2)

OS 자료들 2009. 6. 30. 11:56


Linux Virtual Server(LVS)




ㅇ 제작 리눅스포털(www.superuser.co.kr) 수퍼유저코리아 서버


ㅇ SULINUX 홈페이지 : www.sulinux.net

ㅇ 리눅스포털 홈페이지 www.superuser.co.kr




http://www.linuxvirtualserver.org/


The Linux Virtual Server is a highly scalable and highly available server built on a cluster of real servers, with the load balancer running on the Linux operating system.

March 31, 2007 SUPERUSER.CO.KR 이창목


1. Linux Virtual Server(LVS)?


리눅스 가상 서버란한대의 서버로 증가하는 인터넷 사용자를 처리하기가 힘들어 지면서 고가용성 서버를 구축하기 위해 리눅스 머신을 로드 발랜스 하도록 해주는 운영시스템이다.

만약 하나의 노드에서 처리량이 너무 많아서 서비스가 불가능할 경우 간단히 하나의 노드를 병렬 구성으로 추가 함으로써 부하분산을 하도록 하는 것을 말한다공개소스로서 이러한 기능을 담당하고 있는 것이다.


2. Linux Virtual Server 스케쥴링


    1)라운드-로빈(round-robin)

    라운드-로빈 방식은 로드밸런서에 들어오는 요청 패킷들을 차례대로 실제 서버에 할당하는 방식이 다이 방식에서 실제 서버의 현재 부하 상황 등은 고려되지 않는다단지 차례대로 할당할 뿐이다하지만이렇게 하더라도 로드밸런싱을 위해 이전에 사용되던 라운드-로빈 DNS 방식에 의해 서버를 할당하는 방식에 비해서는 우수한데, DNS의 경우는 한번 서버가 지정되면 해당 서버에 수많은 요청 패킷이 몰릴 수 있기 때문이다.

    2)가중 라운드-로빈(weighted round-robin)

    가중 라운드-로빈 방식은 기본적으로 라운드-로빈 방식인데각 서버에 서로 다른 가중치를 주어서 할당하는 방식이다이 방식을 사용해야 하는 경우는 실제 서버들이 CPU의 수와 성능메모리 용량 등 서로 다른 성능을 가지고 있어서각 서버를 동등하게 취급할 수 없는 경우이다.

    3)최소 연결(least connection)

    최소 연결 방식은 실제 서버들 중에서 현재 가장 적은 수의 요청을 처리하고 있는 서버를 선택하여 요청 패킷을 할당하는 방식이다이 방식은 실제 서버의 현재 부하 상황을 동적으로 판단하여 요청을 처리하기 때문에앞의 두 방식에 비해서 동적으로 우수한 부하 분산 효과를 얻을 수 있다.

    4)가중 최소 연결(weighted least connection)

    가중 최소 연결 방식은 기본적으로 최소 연결 방식인데가중 라운드-로빈 방식과 마찬가지로 각 서버에 서로 다른 가중치를 주어서 할당하는 방식이다.


3. 시스템 구성 및 ipvsadm 설치


1)Load Balancer Server

운영체제 : SULinux1.5

커널 : kernel-2.6.9-42.0.2.ELsmp

IP : 210.224.223.1

가상IP : 210.224.223.10

2)Real Server1(RS1)

운영체제 : Sulinux1.5

커널 : kernel-2.6.9-12.0.2.ELsmp

IP : 210.224.223.11

IP : 192.168.0.11 [NAT 설정시 부여할 사설 ip]


3)Real Server1(RS2)

운영체제 : CentOS4

커널 : kernel-2.6.9-42.0.2.ELsmp

IP : 210.224.223.12

IP : 192.168.0.12 [NAT 설정시 부여할 사설 ip]


4)Load Balancer Server ipvsadm 설치

Load Balancer Server에서 ipvsadm을 다운로드 후 설치를 한다.

커널 2.4.x 이하 버젼에서는 커널 컴파일 및 hidden 패치를 해야 했으나 커널 2.6.x에서는

Virtual Server 기능들이 기본 포함되어 있으므로 아주 간단하다.

shell>wget http://mirror.centos.org/centos/4/extras/i386/RPMS/ipvsadm-1.24-6.i386.rpm


shell>rpm -ivh ipvsadm-1.24-6.i386.rpm


shell>ipvsadm

IP Virtual Server version 1.2.0 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn


설치가 정상적으로 되었다면 위와같이 나타날 것이다.여기서부터 ipvsadm을 이용하여 아래 방식 으로 설정하여 테스트 해보도록 하겠다.


  • Direct Routing

  • NAT 방식

A.Direct Routing 방식

실제 서버와 부하분산 서버에서 가상 IP 주소를 부여하여 서로 공유한다부하분산 서버에도

마찬가지로 가상 IP 주소를 설정한 인터페이스가 있어야하며 이 인터페이스를 이용요청

패킷을 받아들이고 선택한 서버에 직접 라우팅할 수 있게 된다.

모든 실제 서버는 가상 IP주소로 설정한 non-arp alias 인터페이스가 있거나 가상 IP 주소로

향하는 패킷을 지역 소켓으로 재지향한다그래서 실제 서버 에서 패킷을 지역적으로 처리할

수 있는 구조를 가지게 된다.


Direct Routing 방식의 구조도는 아래와 같다.










A-1.Load Balancer Server 설정법

/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경후

shell>sysctl -p

커널파라미터 적용


shell>ifconfig eth0:0 210.224.223.10 up

가상아이피 등록


shell>ipvsadm -A -t 210.224.223.10:80 -s rr

라운드-로빈방식으로 설정


shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.11:80 -g

RS1 서버로 다이렉트 라우팅 설정


shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.12:80 -g

RS2 서버로 다이렉트 라우팅 설정



A-2.Real Server(RS1) 설정법

/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경하여야 하며

#for ipvs

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

#end of ipvs

#for ipvs ~ #end of ipvs 부분을 추가한후

shell>sysctl -p

커널파라미터 적용

shell>ifconfig eth0:0 210.224.223.10 up

가상아이피 등록


A-3.Real Server(RS2) 설정법

/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경하여야 하며

#for ipvs

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

#end of ipvs

#for ipvs ~ #end of ipvs 부분을 추가한후

shell>sysctl -p

커널파라미터 적용

shell>ifconfig eth0:0 210.224.223.10 up

가상아이피 등록


클라이언트에서 가상아이피 210.224.223.10으로 접속하면 우리는 느끼지 못하지만

rr(라운드-로빈)방식을 이용해서 RV1,RV2 서버에 접속하게 된다.

RV1 서버에 장애가 있다면 RV2 서버로 접속하게 된다.


B.NAT 방식

NAT는 특정한 IP 주소를 한 그룹에서 다른 그룹으로 매핑하는 기능이다.

클라이언트가 가상 아이피로 접근시 사설 아이피로 구성된 부하분산 서버 RS1,RS2로 패킷이 향 하게 된다사설 아이피로 구성된 부하분산 서버는 패킷의 목적지와 포트 번호를 검사한다.

NAT 방식의 구조도는 아래와 같다





B-1.Balancer Server 설정법


네트웍 디바이스 eth0,eth1 정보

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=static

IPADDR=210.224.223.11

NETMASK=255.255.255.0

GATEWAY=210.223.223.1

DEVICE=eth1

ONBOOT=yes

BOOTPROTO=static

IPADDR=192.168.0.1

NETMASK=255.255.255.0


/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경후

shell>sysctl -p

커널파라미터 적용


shell>ifconfig eth0:0 210.224.223.10 up

가상아이피 등록


shell>ipvsadm -A -t 210.224.223.10:80 -s lc

최소연결 방식으로 설정



shell>ipvsadm -a -t 210.224.223.10:80 -r 192.168.0.11:80 -m

RS1 서버로 NAT 설정


shell>ipvsadm -a -t 210.224.223.10:80 -r 192.168.0.12:80 -m

RS2 서버로 NAT 설정


B-2.Real Server(RS1,RS2) 설정법


RS1

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=static

IPADDR=192.168.0.11

NETMASK=255.255.255.0

GATEWAY=192.168.0.1


RS2

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=static

IPADDR=192.168.0.12

NETMASK=255.255.255.0

GATEWAY=192.168.0.1


클라이언트에서 가상아이피 210.224.223.10으로 접속하면 우리는 느끼지 못하지만

최소연결 방식을 이용해서 RV1,RV2 서버 중에 접속자가 작은 서버로 된다.

RV1 서버에 장애가 있다면 RV2 서버로 접속하게 된다.

NAT 방식의 경우 패킷 Load Balancer Server를 반드시 거쳐가야 하므로 20대 이상 구성해야

할때는 문제가 발생할 수 있는 단점이 있다.

C.IP Tunneling 방식

IP 터널링 (IP encapsulation)은 IP 데이터그램안에 IP 데이터그램을 넣는 기술로서어떤 IP  소를 향하는 데이터그램을 감싸 다른 IP 주소로 재지향할 수 있다. IP encapsulation은 현재 엑 스트라넷모빌-IP, IP-멀티캐스트, tunnled 호스트나 네트웍 등에 일반적으로 사용되고 있다.

IP Tunneling 방식의 구조도는 아래와 같다




C-1.Balancer Server 설정법

/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경후

shell>sysctl -p

커널파라미터 적용


shell>ifconfig eth0:0 210.224.223.10 up

가상아이피 등록


shell>ipvsadm -A -t 210.224.223.10:80 -s wlc

가중치 최소연결 방식으로 설정



shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.11:80 -i

RS1 서버로 Tunneling


shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.12:80 -i

RS2 서버로 Tunneling


C-2.Real Server(RS1,RS2) 설정법


RS1

DEVICE=tunl0

ONBOOT=yes

BOOTPROTO=static

IPADDR=210.224.223.10

NETMASK=255.255.255.0


RS2

DEVICE=tunl0

ONBOOT=yes

BOOTPROTO=static

IPADDR=210.224.223.10

NETMASK=255.255.255.0


또는 각 리얼서버에서


RS1

shell>ifconfig tunl0 210.224.223.10 up

가상아이피를 IPIP Tunnel에 등록한다.

RS2

shell>ifconfig tunl0 210.224.223.10 up

가상아이피를 IPIP Tunnel에 등록한다.


클라이언트에서 가상아이피 210.224.223.10으로 접속하면 우리는 느끼지 못하지만

가중치 최소연결 방식을 이용해서 RV1,RV2 서버 중에 접속자가 작은 서버로 된다.

RV1 서버에 장애가 있다면 RV2 서버로 접속하게 된다.


http://www.linux.co.kr/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=10904 에서 긁기

Posted by Y2K
,
셋팅하기위해서 아래와 같이 설정하겠다. 공인 아이피대신 그냥 사설아이피를 쓰겠다.
웹서비스를 위한 예제이다.
 
▶ 로드밸런싱 서버 IP : 192.168.1.10    eth0
▶ Real 서버 1번 IP   : 192.168.1.11    eth0 
▶ Real 서버 2번 IP   : 192.168.1.12    eth0
▶ Virtual IP : 192.168.1.5 (DNS에 셋팅할 도메인과 맵핑할 Web IP 예를들어 192.168.1.5 = 
www.empas.com  ...ㅋ )
 
★ 로드밸런싱 서버 설정
LBSERVER# yum intall ipvsadm             ==> RPM으로 ipvsadm 설치
LBSERVER# ifconfig eth0:0 192.168.1.5 netmask 255.255.255.255 up  
                                                   ==> 물리 랜카드 하나에 2개 아이피셋팅 etho 192.168.1.10, eth0:0 192.168.1.5           
LBSERVER# ipvsadm -A -t 192.168.1.5:80 -s wlc
                                                             --라운드로빈(rr)-차례대로 리얼서버로                                                    
                                                             --가중라운드로빈(wrr)-라운드로빈+가중치                               
                                                             --최소연결(lc)-리얼 서버들중 가장 적은 수의 요청을 처리하는 서버 선택.
                                                             --가중최소연결(wlc)-최소연결+가중치                                   
LBSERVER# ipvsadm -a -t 192.168.1.5:80 -r 192.168.1.11:80 -g -w 5     ==> ipvs 테이블 설정
LBSERVER# ipvsadm -a -t 192.168.1.5:80 -r 192.168.1.12:80 -g -w 10
                                                 -a 추가, -t 대상타겟, -r 리소스 주소, -g 다이렉트 라우팅, -w 가중치 설정
LBSERVER# vi /etc/sysctl.conf
----------------------------------------------------------------
net.ipv4.ip_forward = 1               ===>  0을 1로 변경후 저장
----------------------------------------------------------------
LBSERVER# sysctl -p           ====> sysctl.conf 설정 적용    
LBSERVER# ipvsadm  ==>설정확인 , ipvsadm -C 설정 모두 삭제, ipvsadm -e -t ..설정 수정 
----------------------------------------------------------------------
IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  211.233.5.72:http wlc
  -> 211.233.5.71:http            Route   10      0          0         
  -> 211.233.5.70:http            Route   10      0          0   
----------------------------------------------------------------------

★ Real 1번 서버 설정 ★
Real_1# ifconfig lo:0 192.168.1.5 netmask 255.255.255.255 up
Real_1# vi /etc/sysctl.conf 
-------------------------------------------------------------
net.ipv4.ip_forward = 1            ===>  0을 1로 변경
#linux-1 part
# ARP 문제 해결을위해 arp에 대한 응답 없음으로 설정(추가부분)
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
------------------------------------------------------------------
Real_1# sysctl -p       ====> sysctl.conf 설정 적용
Real_1# vi /usr/local/apache/conf/httpd.conf 에서 virtualhost를 가상아이피(192.168.1.5)로 설정을 한다.
 
★ Real 2번 서버 설정 ★
리얼서버 1번과 같이 설정한다.
 
★ 확인하기 
그리고 나서 로드밸런싱서버, 리얼 서버1, 리얼서버2 에서 /etc/rc.d/init.d/network restart 해준다.
당연히 웹서비스 로드밸런싱이기 때문에 리얼서버 1,2 번에는 웹이 돌아가야지 테스트 확인이가능하다.
리얼1에는 index.htm 파일에 리얼1번이라는 웹피이지를 만들어주고 리얼2에는 index.htm 파일에 리얼2번이라는 웹피이지를
만들어준다. 
이제 www.empas.com 도메인으로 접속하면 한번은 리얼1번에가따가 또 한번은 리얼2번으로 갈것이다.
위에서 지정한  rr, wrr, lc, wlc 를 용도에 맞게 바꿔 가면서 스케줄링을 하면된다.
Posted by Y2K
,
회사에서 난생처음 linux에서의 web 작업을 하는 도중에 php를 사용하면 더 편할 것 같은 예감이 들어서, php로 뚝딱뚝딱. 

linux의 언어설정은 unicode로 되어있고, php의 언어설정은 되어있지 않아서, 한글이 깨지는 문제가 계속해서 발생해서 조금 고생한 듯. 기종간 최고의 문제는 역시 언어설정인것을 다시 한번 느끼게 되었다. 

#메일 보내기
<?
function encode_2047($subject) {
    return '=?euc-kr?b?'.base64_encode($subject).'?=';
}

function customer_sendmail($email_str, $userName, $subject, $message)
{
    mb_internal_encoding('EUC-KR'); 

    $from_name = $userName;
    $from_name = encode_2047(iconv("UTF-8","EUC-KR",$from_name));

    $subject = iconv("UTF-8","EUC-KR",$subject);
    $message = iconv("UTF-8","EUC-KR",$message);

    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'X-Mailer: PHP' . "\r\n";
    $headers .=  "Content-Type: text/html; charset='ks_c_5601-1987'\r\n";
    $headers .= 'From: '.$from_name.' < test@smtp.co.kr >'. "\r\n";

    // 메일 보내기
    $result = mb_send_mail($email_str, $subject, $message, $headers) ;
    return $result; 
}

// 멋진 코드. Post로 보내진 모든 데이터를 $Name 형태로 모두 만들어준다. 
foreach($_POST as $key=>$value)
{
       $$key=$value;
}

$to = "to@smpt.co.kr";
$subject = "[코로케이션] 시스템 무료 점검 신청_" . $companyName;

$body="
====================================
* 회사 이름 : $companyName
* 사용자 이름 : $userName
* 연락처 : $phoneNumber1-$phoneNumber2-$phoneNumber3
* 운영체제(os) 버젼 : $osVersion
* DB 버젼 : $dbVersion
* 서버 용도 : $useService
* 기타 점검 요청 사항 : $etc   
=====================================
";
customer_sendmail($to, $userName, $subject,$body);
?>


#메일 & 첨부파일 보내기
<?php
function encode_2047($subject) {
    return '=?euc-kr?b?'.base64_encode($subject).'?=';
}
foreach($_POST as $key=>$value)
{
       $$key=$value;
}

if($_SERVER['REQUEST_METHOD']=="POST"){
mb_internal_encoding('EUC-KR'); 
  $to = "to@smtp.co.kr";
  $subject=encode_2047(iconv("UTF-8","EUC-KR","[코로케이션]시스템 무료 점검 사전정보_".$companyName));
$from = iconv("UTF-8","EUC-KR",$companyName);
  $mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";
  // 파일 이름 얻어오기. 넘기는 페이지의 input="file"의 name 속성으로 넘엉
  $tmp_name = $_FILES['filename']['tmp_name'];
  $type = $_FILES['filename']['type'];
  $name = $_FILES['filename']['name'];
  $size = $_FILES['filename']['size'];

  $headers = 'MIME-Version: 1.0' . "\r\n";
  $headers .= 'X-Mailer: PHP' . "\r\n";
  $headers .=  "Content-Type: text/html; charset='ks_c_5601-1987'\r\n";
  $headers .= 'From: '.$from."<test@smtp.co.kr>\r\n";
$engineer = "아니오";
if($rdEngineer == "true") {
$engineer = "예";
}
$protect = "아니오";
if($rdProtect == "true") {
$protect = "예";
}
$duplication = "아니오";
if($rdDuplication == "true") {
$duplication = "예";
}
$backup = "아니오";
if($rdBackup == "true") {
$backup = "예";
}
$message = "";
if($rdEngineer == "true") {
 $message = "
  ==================================== <br/>
* 회사 이름 : $companyName<br/>
* 서비스 유형 : $serviceType<br/>
* 구매 날짜 : $buyDate<br/>
* 전문 엔지니어 관리 : $engineer<br/>
* 보안 설정 : $protect<br/>
* 이중화 구성 : $duplication<br/>
* 백업 구성 : $backup<br/>
* 기타 문의 사항 : $etc<br/>
====================================
";
}
else {
$message = "
  ==================================== <br/>
* 회사 이름 : $companyName<br/>
* 서비스 유형 : $serviceType<br/>
* 구매 날짜 : $buyDate<br/>
* 전문 엔지니어 관리 : $engineer<br/>
- 서버 관리 : $noEngineer<br/>
* 보안 설정 : $protect<br/>
* 이중화 구성 : $duplication<br/>
* 백업 구성 : $backup<br/>
* 기타 문의 사항 : $etc<br/>
====================================
";
}
$message = iconv("UTF-8","EUC-KR",$message);
if (file_exists($tmp_name)){
if(is_uploaded_file($tmp_name)){
$file = fopen($tmp_name,'rb');
$data = fread($file,filesize($tmp_name));
fclose($file);
$data = chunk_split(base64_encode($data));
    }
$headers = "From: $from\r\n" .
         "MIME-Version: 1.0\r\n" .
         "Content-Type: multipart/mixed;\r\n" .
         " boundary=\"{$mime_boundary}\"";
$message = "This is a multi-part message in MIME format.\n\n" .
         "--{$mime_boundary}\n" .
         "Content-Type: text/html; charset='ks_c_5601-1987'\n\n" .
         $message . "\n\n";
$message .= "--{$mime_boundary}\n" .
         "Content-Type: {$type};\n" .
         " name=\"{$name}\"\n" .
         //"Content-Disposition: attachment;\n" .
         //" filename=\"{$fileatt_name}\"\n" .
         "Content-Transfer-Encoding: base64\n\n" .
         $data . "\n\n" .
         "--{$mime_boundary}--\n";
}
mail($to, $subject, $message, $headers);
}
?>

php를 사용하건, ruby를 사용하건, 어떤 언어를 사용하더라도...
가장 중요한 것은 일단 해보자라는 용기?? ^^


Posted by Y2K
,