Fedora 4와 UTF8 따라잡기

FC4로 바뀌면서 가장 크게 바뀐 부분에 한글 코드문제입니다.

근본적으로 UTF-8을 기본으로 하고 있어서 EUC-KR로 사용하던 시스템을 이전하는데 문제가 많더군요.

부분적으로 EUC-KR로 설정할 수 있지만 불이익이 더 많아지는 것같아 최종적으로 Mysql 4.1.11 때문에 결국 UTF-8을 따르기로 했습니다.



1. 먼저 페도라 코어4가 설치되었다고 가정합니다.

   



2. 제일먼저 속을 썩힌 것이 SSH였습니다.

그동안 Zterm을 사용했었는데 FC4는 정상적으로 설치되어서 콘솔에서는 잘 되는데 SSH는 아예 접속이 되지않습니다.

protocol을 1 바꾸어봤지만 여전히 접속이 안됩니다.

기 설치된 페도라를 지우고 설치하기를 수차례…

나중에야 Putty라는 놈을 알게되었습니다.

kldp.org에 가니까 한글화되어있더군요.



putty로는 접속은 잘되지만 한글은 여전히 깨지더군요.

섯부른 초보의 엄벙덤벙이 부른 실패담입니다…. 그냥 웃어넘기세요.

쓸데없이 /etc/sysconfig/i18n 을 몇번이고 수정했었습니다.

/etc/vimrc 하고 /etc/manconfig도 수없이 수정했었습니다.

putty 자체에서 한글 코드를 utf-8로 설정해야 정상적으로 한글이 보이더군요…ㅎ,ㅎ

저처럼 헛고생하지 마십시요.



3. SSH가 설정되고 나니까 apache하고 php가 속을 잔뜩썩히더군요.

phpinfo를 보면 –widthout-mysql로 설정되어있습니다.

요것때문에 또 여러번 밀고 재설치를 수없이 반복했습니다.

다른 옵션문제도 있고 해서 결론은 소스컴파일



php 5.0.5와 apache 2.054 소스를 가져다가 컴파일했습니다.

먼저 아파치를 ./configure –prefix=/usr/local/apache –enable-so

로 컴파일하고

php는 ./configure –prefix=/usr/local/php –with-exec-dir=/usr/bin –with-apxs2=/usr/local/apache/bin/apxs –with-apache-install=/usr/local/apache –with-mysql=/usr/lib/mysql –with-config-file-path=/etc –disable-debug –enable-safe-mode –enable-track-vars –enable-sockets –enable-exif –with-png-dir=/usr/lib –with-freetype-dir=/usr –with-mod_charset –with-charset=euc_kr –with-xml –with-language=korean –enable-mailparse –enable-calender –enable-sysvsem=yes –enable-sysvshm=yes –enable-ftp –enable-magic-quotes –enable-gd-native-ttf –enable-versioning –enable-url-includes –enable-trans-id –enable-inline-optimization –enable-bcmath –with-jpeg –with-png –with-zlib –with-jpeg-dir=/usr –with-gd –with-ttf –with-gettext –enable-sigchild –enable-module=so –with-libxml-dir=/usr

로 컴파일에 성공했습니다.

하지만 막상 실행하면 에러가 뜹니다.



Syntax error on line 232 of /usr/local/apache/conf/httpd.conf:

Cannot load /usr/local/apache/modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied

요부분에서 또 며칠간 엄청 헤멨습니다.

컴파일 문제라고 생각하고 낮은 버전의 아파치와 php로 해도 마찬가지 결과였습니다.

나중에야 kldp에서 검색하다가 해결점을 발견했습니다.



chcon /usr/local/apache/modules/libphp5.so ?t shlib_t <– 자세한 것은 모르지만 SELinux의 문제라더군요…쩝쩝



좌우간 여기까지 해서 아파치와 php는 정상작동합니다.



4. 기존 php 소스코드 이전

기존의 서버들에서 사용하던 PHP코드의 소스의 한글은 EUC-KR입니다.

당연한 이야기지만 그냥 복사해오면 한글이 깨집니다.



http://my.netian.com/~crosser/files/kr2u8.tar.bz2 을 가져다가 코드를 통채로 바꿨습니다.

http://www.gentoo.or.kr/wiki/moin.cgi/GnomeLocale#head-af49f10fde6be82205bcf5ef5cab7d39f3042179 에 설명이 있습니다.



5. 기존 EUC-KR 한글 자료를 가지는 데이터의 Mysql 4.1.xx로의 이전입니다.

마지막까지 RedHat에 대한 미련을 붙들고 EUC-KR을 고집하고픈 마음이 굴뚝같았던 대목입니다.

페도라 밀어버리고 다시 RedHat 9을 깔까 몇번이고 망설였었습니다.



먼저 /etc/my.cnf 설정입니다.

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

old_passwords=1



init_connect=SET collation_connection = utf8_general_ci

init_connect=SET NAMES utf8

default-character-set=utf8

character-set-server=utf8

collation-server=utf8_general_ci



[mysql.server]

user=mysql

basedir=/var/lib



[mysqld_safe]

err-log=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid



[client]

default-character-set = utf8



[mysql]

default-character-set=utf8



기존서버에서 Mysqldump로 데이터를 백업받아 복사합니다.



복사한 SQL에서 TYPE=MYISAM 부분을 ENGINE=MyISAM DEFAULT CHARSET=euckr 로 몽땅 다 수정했습니다.

(이부분은 수정하지않아도 되지않을까 추정됩니다. 나중에 해보신 분들이 결과 알려주시면 고맙겠습니다.)



FC4서버의 mysql 콘솔에서

create database DB_NAME character set euckr

로 DB를 생성한다음

mysql -uroot -p –default-character-set=euckr <DB.sql

로 데이터를 입력합니다.

콘솔에서 mysql을 작동하고 보면 한글 코드가 정상적으로 보입니다.

mysql> show variables like ‘c%’;

+————————–+—————————-+

| Variable_name            | Value                      |

+————————–+—————————-+

| character_set_client     | utf8                       |

| character_set_connection | utf8                       |

| character_set_database   | euckr                      |

| character_set_results    | utf8                       |

| character_set_server     | utf8                       |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

| collation_connection     | utf8_general_ci            |

| collation_database       | euckr_korean_ci            |

| collation_server         | utf8_general_ci            |

| concurrent_insert        | ON                         |

| connect_timeout          | 5                          |

+————————–+—————————-+

12 rows in set (0.00 sec)



문제는 지금부터였습니다.



아파치를 가동하고 기존의 소스코드들을 익스에서 열어보면 모든게 정상처럼 보이는데 mysql에서 읽어들인 한글 코드는 몽땅 깨집니다.



<?php

function dbconn() {

              $connect = @mysql_connect(“localhost”,”DBUser”,”DBPass”) or Error(“DB 접속시 에러가 발생했습니다”);

               @mysql_select_db(“DB_name”, $connect) or Error(“DB Select 에러가 발생>했습니다”,””);

               return $connect;

       }



dbconn();



$result=mysql_query(“show variables like ‘c%'”);

while ($data=mysql_fetch_array($result)) {

echo $data[Variable_name].” :$data[Value]<br>”;

}

?>

해서 확인해보니까 my.cnf의 설정이 PHP에는 전혀 영향을 미치지 못하더군요.



character_set_client :latin1

character_set_connection :latin1

character_set_database :utf8

character_set_results :latin1

character_set_server :utf8

character_set_system :utf8

character_sets_dir :/usr/share/mysql/charsets/

collation_connection :latin1_swedish_ci

collation_database :utf8_general_ci

collation_server :utf8_general_ci

concurrent_insert :ON

connect_timeout :5



my.cnf의 설정과는 상관없이 latin1으로 설정되어버리더군요.



mysql_query(“set character_set_client = utf8”);

mysql_query(“set character_set_connection  = “utf8”);

mysql_query(“set character_set_results  = “utf8”);

등으로 하나 하나 바꿔가다가 최종으로

mysql_query(“set names utf8”); 으로 결론을 내렸습니다.



character_set_client :utf8

character_set_connection :utf8

character_set_database :euckr

character_set_results :utf8

character_set_server :utf8

character_set_system :utf8

character_sets_dir :/usr/share/mysql/charsets/

collation_connection :utf8_general_ci

collation_database :euckr_korean_ci

collation_server :utf8_general_ci

concurrent_insert :ON

connect_timeout :5



콘솔에서 정상적인 한글이 나오는 상황과 일치했고 실제 PHP에서도 한글 코드가 정상적으로 보여집니다.

결국 모든 소스에서 DB 연결부분을

function dbconn() {

              $connect = @mysql_connect(“localhost”,”DBUser”,”DBPass”) or Error(“DB 접속시 에러가 발생했습니다”);

               @mysql_select_db(“DB_name”, $connect) or Error(“DB Select 에러가 발생>했습니다”,””);

@mysql_query(“set names utf8”);

               return $connect;

       }

로 수정하는 것으로 결론을 보았습니다.



마지막으로 커널컴파일

사무실서버의 경우 리눅스박스에 Ipmasq와 NAT를 설치하고 서버 뒷쪽에서 인터넷을 공유하고 있습니다.

이경우 커널을 컴파일해야하는데 FC4에 탑재된 Kernel 2.6.11.1은 컴파일시 에러가 생깁니다.

여러번 패치를 반복하다가 2.6.12.1로 업그레이드해서 성공했습니다.

참고 하시기 바랍니다.



출처 : http://www.phpschool.com/bbs2/inc_view.html?id=12550&code=tnt2