2016. 5. 9. 17:49

[MySQL] mysql_config_editor 사용법

MySQL 5.6.6 부터 직접 아이디/비밀번호를 입력하지 않고 별도의 키파일로 접속이 가능하도록 하는 mysql_config_editor 파일이 추가 되었다.

이 파일로 계정정보를 만들게 되면 리눅스의 경우 접속한 계정에 .mylogin.cnf 라는 파일로, 윈도우의 경우 %APPDATA%\MySQL에 접속정보가 암호화 되어 저장되게 된다. 아이디/비번을 사용하여 mysqldump를 사용하는 경우에 insecure warnning 이 발생하니 이 방법을 사용하는게 좋다.


.mylogin.cnf 는 소유자만 rw 할수 있는 권한 600 권한이어야만 동작되고 아닌경우에는 동작되지 않도록 되있으니 주의


비밀번호에 # 문자가 포함될 경우 정상적으로 로그인이 되지 않으니 주의


1. mysql_config_editor 설정추가

mysql_config_editor set --login-path=설정명 --host=localhost --user=root --password --port=3306 --socket=소켓위치


--login-path 를 생략할 겨우 client 로 저장이 되지 주의

--port, --socket 는 생략가능


2. 사용하기 

mysqldump --login-path=설정명

mysql --login-path=설정명


3. 접속정보 삭제

mysql_config_editor remove --login-path=설정명

mysql_config_editor remove --login-path=설정명 --user  #접속정보 중 user 만 삭제


4. 접속정보 전체 삭제

mysql_config_editor reset


5. 접속정보 표시

mysql_config_editor print --all

mysql_config_eidtor print --login-path=설정명


2016. 4. 8. 14:23

MySQL 5.7 설치 관련

mysql 5.7.9? 였던가 부터는 초기 비번을 랜덤하게 설정해 버려서 사용하기 위해서는 비번을 설정해줘야 함


1. 인증없는 모드로 임시실행 후 root 접속

mysqld_safe --skip-grant-tables &


또는 my.cnf 에 skip-grant-tables 옵션 추가 후 service mysqld restart


---


mysql -u root


2. root 비밀번호 변경


- 5.7 이전

update mysql.user set password=password('비번') where user='root';


- 5.7 이후

update mysql.user set authentication_string=password('비번') where user='root';


3. 서비스 정지

service mysqld stop 나 mysql.server stop


4. my.cnf 아래 부분 추가/수정

5.7.9부터인가? validate plugin이 기본동작된다. password 함수 사용 시 특정 형식에 맞지 않으면 오류가 나는데 그걸 방지하기 위해서 플러그인을 off 하거나 설정을 변경한다.

기본 sql-mode 가 변경 되어서 혼란이 온다면 이부분도 수정


character-set-server = utf8

sql-mode=""


validate-password=off //설정을 끄거나 아래처럼 룰을 변경


validate_password_policy = LOW

validate-password-mixed-case-count = 0

validate-password-length = 1

validate-password-special-char-count = 0


5. 서비스 시작

service mysqld start 또는 mysql.server start

 

6. 접속 후 아래와 같은 오류나 나올 경우


mysql -uroot -p


mysql> SELECT 1;


ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.


한번 더 비밀번호를 설정해 줌


mysql> SET PASSWORD = PASSWORD('비번'); //password 함수를 사용하는건 deprecated 되었다고 함


mysql> SET PASSWORD = '비번';



2016. 4. 8. 10:27

PNG 파일을 ATF 로 일괄 변환시키는 스트립트(Ver. 1.0.0)

Adobe Air 로 게임을 만들면 이미지 리소스를 png 파일을 써도 되지만 메모리의 사용량이나 처리속도면에서 ATF 파일로 변환해서 쓰는게 훨씬 이득이다. 다만 ATF 파일로 변환하면 전용뷰어 외에는 확인이 안되서 디버깅시는 PNG 파일을 릴리즈시에는 플랫폼별(PC/ANDROID/IOS)들로 각각의 파일들을 만들어서 처리되게 한다.


## atf 관련 실행파일 및 뷰어는 AIR SDK 에 atftool 디렉토리에 존재함.



import os import hashlib import subprocess CONST_WIN = 0 CONST_IOS = 1 CONST_AND = 2 png2atf = "D:\\SDK\\AIR_SDK\\AIRSDK_21\\atftools\\png2atf.exe" assetDir = "D:\\work\\workspace_flex\\holdem\\assets_d\\mobile_ko\\assets" hashFile = assetDir + "\\.AssetsHash" def md5(fname): hash_md5 = hashlib.md5() with open(fname, "rb") as f: for chunk in iter(lambda: f.read(4096), b""): hash_md5.update(chunk) return hash_md5.hexdigest() def conver_asset(create, gtype, fname): xname = assetDir + "\\" + fname + ".xml" sname = assetDir + "\\" + fname + ".png" if gtype == CONST_IOS: name_xml = fname + "_ios.xml" name_xml_full = assetDir + "\\" + name_xml name_atf = fname + "_ios.atf" name_atf_full = assetDir + '\\' + name_atf elif gtype == CONST_AND: name_xml = fname + "_and.xml" name_xml_full = assetDir + "\\" + name_xml name_atf = fname + "_and.atf" name_atf_full = assetDir + '\\' + name_atf else: name_xml = fname + "_win.xml" name_xml_full = assetDir + "\\" + name_xml name_atf = fname + "_win.atf" name_atf_full = assetDir + '\\' + name_atf if not create and os.path.exists(name_xml_full) and os.path.exists(name_atf_full): return if os.path.exists(name_xml_full): os.remove(name_xml_full) with open(xname, "r") as fp: xml = fp.read(os.path.getsize(xname)) xml = xml.replace(fname + ".png", name_atf, 1) with open(name_xml_full, "w") as fp: fp.write(xml) if os.path.exists(name_atf_full): os.remove(name_atf_full) if gtype == CONST_IOS: print fname + " >> " + name_atf subprocess.call(png2atf + " -c p -q -n 0,0 -i " + sname + " -o " + name_atf_full) elif gtype == CONST_AND: print fname + " >> " + name_atf subprocess.call(png2atf + " -c e -q -n 0,0 -i " + sname + " -o " + name_atf_full) else: print fname + " >> " + name_atf subprocess.call(png2atf + " -c d -q -n 0,0 -i " + sname + " -o " + name_atf_full) def main(): hash_pool = {} hash_pool_save = {} if os.path.exists(hashFile): with open(hashFile, 'r') as fp: while True: line = fp.readline() if not line: break key, value = line.rstrip('\n').split('|') hash_pool[key] = value for root, dirs, files in os.walk(assetDir): for f in files: filename, ext = os.path.splitext(f) if ext == '.png': md5hash = md5(assetDir + '\\' + f) create = False if (f in hash_pool) == False or hash_pool[f] != md5hash: create = True conver_asset(create, CONST_IOS, filename) conver_asset(create, CONST_AND, filename) conver_asset(create, CONST_WIN, filename) hash_pool_save[f] = md5hash with open(hashFile, 'w') as fp: for key in hash_pool_save: line = key + "|" + hash_pool_save[key] fp.write(line + '\n') if __name__ == "__main__": main()


2016. 4. 6. 14:48

Centos6에 Nginx+PHP7-FPM+MySQL Yum으로 설치

요 근래 Nginx + PHP-FPM 글을 몇개 번역한걸 올렸더니 갑자기 궁금해져서 설치를 해보고 메모해둠


1. MySQL 설치

별로 신경을 안쓰고 있었는데 MySQL쪽에도 Yum Repo를 제공하고 있었다...


http://dev.mysql.com/downloads/repo/yum/


이 링크에서 버전에 맞게 설치하면 된다. Centos6은 Red Hat Enterprise Linux 6을 다운 받으면 됨.


2.PHP7 설치

아래 링크를 참고해서 설치

https://webtatic.com/packages/php70/


또는

http://wyseburn.tistory.com/entry/Remi-Repo-%EC%84%A4%EC%B9%98PHP7


다만 이걸로 설치를 하면 경로가 좀 요상해진다.

환경관련파일은 /etc/opt/remi/php70/ 에 있고 로그는 /var/opt/remi/php70/ 에 있으니 주의.

그리고 실행파일을 /usr/bin/php70 이런식인데 실제로는 /opt/remi/php70/root/usr/bin 에 php, php-config, phpize 등이 있으니 주의, 소프트링크를 하면 좀 나을꺼다.


그리고 php70.x86_64 와 php70-php.x86_64 같이 똑같을꺼 같은 패키지가 있는데 버전을 보면 다르니

php70-php 로 시작하는 것들(현재 버전 7.0.5)로 깔면 된다. 물론 FPM으로 돌릴꺼니 php70-php-fpm.x86_64은 꼭 받아야겠지. 아래는 설치패키지.


php70-php-bcmath.x86_64

php70-php-cli.x86_64

php70-php-common.x86_64

php70-php-devel.x86_64

php70-php-fpm.x86_64

php70-php-gd.x86_64

php70-php-json.x86_64

php70-php-mbstring.x86_64

php70-php-mcrypt.x86_64

php70-php-mysqlnd.x86_64

php70-php-opcache.x86_64

php70-php-pdo.x86_64

php70-php-suhosin.x86_64

php70-runtime.x86_64


/etc/opt/remi/php70/php-fpm.d/www.conf 파일을 열어 수정하자.

user = apache                       #사용자는 일반계정을 만들어 사용할 것. apache는 이미 있어서 사용

group = apache

listen = /var/run/php7-fpm.sock   #처음에는 127.0.0.1:9000 인데 서버가 하나면 unix socket로 바꾸는게 났다.

listen.owner = apache              #권한도 맞춰줘야함, 계정은 nginx의 user와 같아야 한다.

listen.group = apache

listen.mode = 0660


service php70-php-fpm start        #fpm 데몬이름도 거시기 하다.



php를 fpm으로 실행할 경우 php.ini 파일에 cgi.fix_pathinfo = 1 인 경우 http://localhost/bad.hack/aa.php 와 같이 bad.hack 을 실행 가능하게 하므로 cgi.fix_pathinfo = 0 으로 하자.


3. Nginx 최신버전 설치


[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/centos/6/$basearch/ 

gpgcheck=0

enabled=1


이 내용을 /etc/yum.repos.d/nginx.repo 파일로 만들어주면 최신버전을 yum으로 관리할 수 있게된다.

baseurl에 /6/ 은 리눅스 버전을 의미하니 다른 버전이라면 바꿔도 된다.

어떤게 있는지 궁금하면 브라우저로 http://nginx.org/packages 로 들어가보면 리눅스 배포판별로 확인할 수 있으니 들어가보는것도 나쁘지 않다.

주의 : epel Repo에도 Nginx 가 있는데 버전이 낮으니 사용하지 말것.


/etc/nginx/nginx.conf 수정

수정할꺼는 많겠지만 간단하게 몇가지만 수정하거나 추가한다.


user apache;           #php-fpm 에 user와 동일해야 한다.

worker_processes 1;  #cpu core 갯수

http {

    access_log off;     #로그는 끄자

    server_tokens off;  #서버정보를 표시하는거도 끄자

    fastcgi_hide_header X-Powered-By; #불필요한 정보표시 끄기
    fastcgi_hide_header X-Pingback;
    fastcgi_hide_header Link;
    proxy_hide_header X-Powered-By;
    proxy_hide_header X-Pingback;
    proxy_hide_header X-Link;

    add_header X-Frame-Options SAMEORIGIN; #아이프래임 사용 SAMEORIGIN 같은도메인 가능, DENY 불가, ALLOW 모두가능
    add_header X-Content-Type-Options nosniff; #잘못된 MIME에는 응답거부
    add_header X-XSS-Protection "1; mode=block"; #XSS 세션 하이재킹 방지

    include /etc/nginx/sites-enabled/*.conf   #vhost 를 sites-enabled 디렉토리에서 관리

}


vhost설정은 대충 conf.d/default.conf 를 새로만든 sites-enabled 디렉토리에 다른이름으로 복사해서 관리한다.

수정할 부분은 밑에 몇개정도.

server_name  domain.com *.domain.com;

root   /home/sms/public_html; #root는 location /와 location ~\.php 블럭안에 각각정의되 있는데 밖으로 뺀다.

location ~ \.php$ {

    fastcgi_pass   unix:/var/run/php7-fpm.sock;   #/etc/opt/remi/php70/php-fpm.d/www.conf listen 부분과 일치해야된다.

    fastcgi_index  index.php;

    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

    include        fastcgi_params;

}


특정 디렉토리에 PHP 파싱을 차단하려면(예 data, upload, files/my) 아래 내용을 반드시!! location ~ \.php$ {} 블럭 앞에 정의해야 한다.

location ~ /(data|upload|files/my)/.*\.(php\d?|p?html?|pl|cgi) {
    return 403;
}


/etc/nginx/fastcgi_params 파일 맨위에 추가


set $fastcgi_script_realname $fastcgi_script_name;

if ( $fastcgi_script_name ~ ^(.*\.php)(/.*)$ ) {

    set $fastcgi_script_realname $1;

    set $path_info $2;

}

if (!-f $document_root$fastcgi_script_realname) {

    return 404;

}


이부분은 http://도메인/aaa.gif/aaa.php 와 같이 호출될때 aaa.gif에 php코드가 있으면 실행되는데 그걸 방지


service nginx start


이걸로 끝. 보안설정이나 튜닝관련은 다른 문서를 찾아봐야할듯.


4. 아래와 같은 오류가 발생할 경우(/var/lib/nginx/tmp/fastcgi 퍼미션오류)


2016/04/08 08:26:48 [crit] 1967#0: *1 open() "/var/lib/nginx/tmp/fastcgi/1/00/0000000001" failed (13: 

Permission denied) while reading upstream, client: 1.2.3.4, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "domain.com"


아마존 ec2 에서는 최신버전을 yum으로 설치가능하길래 그냥 설치를 했다.

설치하다 nginx.conf 에 user가 nginx로 되있는 걸 무심결에 apache로 고쳤는데 이게 원인이 되었다. 

문제는 /var/lib/nginx 소유자가 nginx.nginx 여서 발생하는 문제.... apache 로 수정하면 오류가 발생하지 않는다.

안된다면 /var/lib/nginx/tmp/fastcgi 의 권한을 777 로도 해볼것.


또 /etc/php-fpm.d/www.conf 에 보면 세션 저장 디렉토리가 별도로 설정되있다.

기본경로 : /var/lib/php/session

사용자를 변경할 경우 반드시 위 디렉토리의 소유 그룹도 변경해야 세션에 문제가 없다.

추가로 /var/lib/php/wsdlcache 의 소유 그룹도 변경하자.

/var/lib/php는 remi repo를 사용할 경우 /var/opt/remi/php70/lib/php 이니 주의.



.... an upstream response is buffered to a temporary file ....

오류가 발생한다면

fastcgi_max_temp_file_size 0; 을 추가


POST 메소드로 정적페이지(아무 값도 없이) 호출하는 경우 405 오류가 발생한다.

당연히 POST 는 값을 전송할떄 쓰는건데 잘못된 사용이니 오류나는게 맞지만 대부분 대충 쓰기때문에..

아래 내용을 추가하면 405 오류를 200(OK)로 바꿔준다.

error_page  405     =200 $uri;


5. /home/계정 디렉토리 퍼미션은 701로 해야한다. 자꾸 까먹네.

..