2015年11月27日 星期五

2015年11月24日 星期二

process與thread差異


Both processes and threads are independent sequences of execution. The typical difference is that threads (of the same process) run in a shared memory space, while processes run in separate memory spaces.
Process和Thread都是獨立的執行序列。不同的是,(同一個Process的)Threads 在共享的記憶體空間中運行,而processes在不同的記憶體中運行

在2.4內核中,不存在線程組的概念,當運行一個多線程得程式時,使用ps命令,可以看到有許多個進程,在ps命令看來,線程基本上是等同於進程,在信號處理中,情況也是如此,只有指定進程號的線程,可以接收到信號。在2.6內核中引入了線程組的概念,在2.6內核中,如果使用ps命令看,一個多線程的進程,只會顯示一個進程,在給線程組中的任何一個線程發送信號的時候,整個線程組中的進程都能收到信號。

PTT
NDark:
code是炮操手冊 cpu是兵 process是跳完砲操 thread是砲管數
lovdkkkk:
各個 Process 共享 CPU/Memory 的資源
然後 Thread 共享 Process 的資源

參考資料:
http://stackoverflow.com/questions/200469/what-is-the-difference-between-a-process-and-a-thread  What is the difference between a process and a thread
http://www.longene.org/forum/viewtopic.php?f=5&t=94&p=399#p399  Linux2.6内核中的线程组初探
http://blog.chinaunix.net/uid-24774106-id-3650136.html  Linux线程 之 线程 线程组 进程 轻量级进程(LWP)
https://www.ptt.cc/bbs/Soft_Job/M.1406625146.A.971.html  [請益] 要如何讓人搞懂Process與Thread



2015年11月13日 星期五

nginx 心得

LINUX上有兩個php
/usr/bin/php
/usr/local/php55/bin/php
$ php --version
PHP 5.4.42 (cli)
$ /usr/local/php55/bin/php --version
PHP 5.5.28 (cli)

要怎麼讓nginx 跑的是 /usr/local/php55/bin/php 的php?
=> 看你的  php-fpm 是跑在哪裡啊,nginx 一定得用 php-fpm 的 fastcgi

找不到php-fpm指令,但有在跑
$ which php-fpm
/usr/bin/which: no php-fpm in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/bear/bin)
$ ps axu | grep php-fpm
root       827  0.0  0.1 220016  4720 ?        Ss   Sep21   2:51 php-fpm: master process (/etc/php-fpm.conf)                   
www        829  0.0  0.4 231124 17476 ?        S    Sep21  17:56 php-fpm: pool www     
www      22389  0.0  0.3 232648 14560 ?        S    Sep21  17:54 php-fpm: pool www  
www      22563  0.0  0.3 227552 13332 ?        S    Oct05  14:00 php-fpm: pool www

CentOS
查有沒有裝php-cli(編譯裝的查不到)
$ rpm -qa | grep php-cli
查php-cli裝在哪裡(編譯裝的查不到)
$ rpm -qs php-cli

Ubuntu
$ dpkg -L php5-fpm # 列出檔案
$ dpkg -S php5-fpm # 搜尋放在哪

查nginx ( sites-available )設定檔
...
fastcgi_pass   127.0.0.1:9000;
 127.0.0.1:9000 這個是 php-fpm,表示你的 127.0.0.1:9000 這個 port 是 php5.5 開啟來的

就是 sudo service php5-fpm start ( => 去 call /etc/init.d/php5-fpm )所開啟的

查 php5-fpm startup scripts
# vim /etc/init.d/php5-fpm
...
prefix=/usr/local/php55

=> 就是他,只是我沒想到他會去改那隻 startup scripts,不要搞髒他啊 . .

Rellik:
我討厭用一些 pip rvm 之類的東西
因為這實際上並沒有進 centos 官方測試
安裝對應的路徑也不一樣
你隨便用一些奇怪套件安裝方式會把自己系統搞髒
最恐怖的是萬一這類的工具沒有把 dependency 弄好的話
其實很恐怖
他可能會蓋掉一些centos 或是 ubuntu 官方的套件
所以除非有特定版本需求
不然我大部分都還是以官方的套件管理系統為主
這樣管理機器上也不用擔心會踩到地雷 . . .
我在 freebsd 上用 ports 安裝的話就是下載原始碼啊
問題是  linux 上原始碼並不會進套件資料庫去管控起來
所以裝完以後你久了就忘了
根本不記得你有裝過什麼東西
freebsd 上面 ports 下載來的會盡套件資料庫控管
只是你要花時間編譯就是
總之你要自己編譯安裝也是可以
但前提是你要怎麼控管整個 flow ?
不要今天想到缺什麼就自己跑去下載原始碼開始編譯 . . .
系統就是這樣子被搞髒的


參考資料:
http://www.howtogeek.com/howto/ubuntu/see-where-a-package-is-installed-on-ubuntu/  See Where a Package is Installed on Ubuntu



2015年11月12日 星期四

firefox常見問題

關閉flash
https://support.mozilla.org/zh-TW/kb/adobe-flash-protected-mode-firefox
ctrl+shift+a => Shockwave Flash => 選項 => (下拉選單)  "總是啟用" 改成 "永不啟用"

重灌電腦後打開firefox會忽然報flash錯誤
解法:
到 https://support.mozilla.org/zh-TW/kb/keep-flash-up-to-date-and-troubleshoot-problems 點  Flash Player 下載頁面 安裝flash(注意:McAfee防毒不要勾選)後重啟電腦。firefox打開有flash的網頁(ex. http://wechoosethemoon.org/)測試有沒有安裝成功


2015年11月10日 星期二

ThinkPHP心得

某天發現我用thinkphp寫的ajax呼叫,返回原始檔中會有需多空行
http://localhost/api.html
Ex.
 



success

ThinkPHP/Common/common.php
require_array($array,$return=false) 呼叫 require_cache()
require $filename; // $filename:./app/Lib/Action/MyAction.class.php
經過這行後就開始產生空行

原來是./app/Lib/Action/MyAction.class.php 這隻檔案我在<?php ... ?> 之後多寫了很多空白行造成的
MyAction.class.php:
<php?
...
?>




  <= 多出的空行
把那些空行拿掉就可以了,所以class檔在<?php ?>結束後請不要多空行埋這個坑

execute和query方法的区别
http://blog.csdn.net/chamtianjiao/article/details/6405951
excute() - insert or update
query() - select
$model = new Model();
$result = $model ->execute( 'select * from MyTable' ); //将返回总行数
$result = $model ->query( 'select * from MyTable' ); //将返回array()

Nginx 下實現ThnkPHP 的 pathinfo模式
癥狀:
http://www.thinkphp.cn/topic/21478.html
除了首頁外全顯示404 Not Found ( Linux + Nginx環境 )
http://www.aaa.com/index.php => 能夠顯示
http://www.aaa.com/index.php/User/login => 顯示 404
解法:
http://www.thinkphp.cn/topic/3138.html
編輯該站的配置文件( sites-available/www.aaa.com.conf ) location ~ \.php$ { 將$去掉 location ~ \.php { ,去掉$是為了不匹配行末,即可以匹配.php/,以實現pathinfo
location ~ \.php {
    # 原有代碼

    ##pathinfo支持start
    #定義變數 $path_info ,用於存放pathinfo資訊
    set $path_info "";
    #定義變數 $real_script_name,用於存放真真實位址
    set $real_script_name $fastcgi_script_name;
    #如果地址與引號內的規則運算式匹配
    if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
        #將檔位址賦值給變數 $real_script_name
        set $real_script_name $1;
        #將檔位址後的參數賦值給變數 $path_info
        set $path_info $2;
    }
    #配置fastcgi的一些參數
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param SCRIPT_NAME $real_script_name;
    fastcgi_param PATH_INFO $path_info;
    ###pathinfo支持end
}

避免xdebug在chrome斷點兩次

https://stackoverflow.com/a/42012288  How to do not redirect specific file on nginx?
寶塔中thinkphp的偽靜態預設配置是:
location / {
if (!-e $request_filename){
rewrite  ^(.*)$  /index.php?s=$1  last;   break;
}
}
但是這樣會造成Chrome的 favicon.ico 的也會進入斷點,把偽靜態設置改成
location / {
    location ~ ^/favicon\.ico$ {
        root   www;
    }
    if (!-e $request_filename){
        rewrite  ^(.*)$  /index.php?s=$1  last;   break;
    }
}













2015年11月5日 星期四

PHP urlencode() 和 rawurlencode()的差異


It will depend on your purpose. If interoperability with other systems is important then it seems rawurlencode is the way to go. The one exception is legacy systems which expect the query string to follow form-encoding style of spaces encoded as + instead of %20 (in which case you need urlencode).
這將取決於你的目的。如果與其他系統的互操作性是很重要的話,使用rawurlencode。
除非是舊系統的查詢字符串(query string)把空白視為+而不是%20,在這種情況下,才需要使用urlencode()

rawurlencode follows RFC 1738 prior to PHP 5.3.0 and RFC 3986 afterwards
rawurlencode 在PHP5.3.0之前遵循RFC 1738、之後遵循RFC3986
$ php -r 'echo urlencode(" ");'
+

urlencode encodes spaces as plus signs (not as %20 as done in rawurlencode)
urlencode 把空白編碼成加號,而不是rawurlencode 的%20
$ php -r 'echo rawurlencode(" ");'
%20

結論:
So which is preffered?
哪一種是首選
rawurlencode. go with the standard in this case. urlencode is only kept for legacy use
rawurlencode. 是標準,urlencode只是給舊版用的

參考資料:
http://stackoverflow.com/questions/996139/urlencode-vs-rawurlencode  urlencode vs rawurlencode?



linode centos7 安裝gitlab

在linode上新開(rebuild)一台centos 7 後

先更新軟體
# yum update
安裝自己常用的軟體
# yum install screen bash-completion
設定.screenrc ( linux screen 使用心得 )
# vim .screenrc


安裝gitlab

1. 安裝和設定所需的依賴( Install and configure the necessary dependencies )
# yum install curl openssh-server => linode已安裝
...
Nothing to do
# systemctl enable sshd => 無反應
# systemctl start sshd => 無反應
# yum install postfix => linode已安裝
...
Nothing to do
# systemctl enable postfix
ln -s '/usr/lib/systemd/system/postfix.service' '/etc/systemd/system/multi-user.target.wants/postfix.service'
# systemctl start postfix => 無反應
# firewall-cmd --permanent --add-service=http => 失敗,但跳過不打緊
FirewallD is not running
# systemctl reload firewalld => 失敗,但跳過不打緊
Job for firewalld.service failed. See 'systemctl status firewalld.service' and 'journalctl -xn' for details.

2. 安裝gitlab ( Add the GitLab package server and install the package )
# curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
...
Generating yum cache for gitlab_gitlab-ce...
Importing GPG key 0xE15E78F4:
 Userid     : "GitLab B.V. (package repository signing key) <packages@gitlab.com>"
 Fingerprint: 1a4c 919d b987 d435 9396 38b9 1421 9a96 e15e 78f4
 From       : https://packages.gitlab.com/gpg.key
# yum install gitlab-ce
...
Installed:
  gitlab-ce.x86_64 0:8.1.2-ce.0.el7

Complete!

3. 設定和啟動GitLab ( Configure and start GitLab )
# sudo gitlab-ctl reconfigure (自動跑,無需設定)
... 
gitlab Reconfigured!

4. 打開瀏覽器登入Gitlab ( Browse to the hostname and login )
預設帳號:
Username: root
Password: 5iveL!fe
第一次登陸後他會要你改密碼

這方法比我 2015年年初看到的這個方法
https://github.com/gitlabhq/gitlab-recipes/tree/master/install/centos
還要容易多了


更改GitLab的port

1. 編輯 /etc/gitlab/gitlab.rb 
# vim /etc/gitlab/gitlab.rb

external_url 'http://xxx.members.linode.com' => 'http://xxx.members.linode.com:1234'
2. 重啟GitLab
# gitlab-ctl reconfigure
重啟後原本80port就不能訪問了,改用1234 port訪問

更改Gitlab倉庫的port

https://stackoverflow.com/a/26935369  Gitlab with non-standard SSH port (on VM with Iptable forwarding)
修改 /etc/gitlab/gitlab.rb 
gitlab_rails['gitlab_shell_ssh_port'] = 766
重新配置gitlab:
# gitlab-ctl reconfigure

然後在gitlab後台可以看到新的倉庫地址,如: ssh://git@git.domain.com:766/group/project.git

測試gitlab是否能連上

$ ssh git@gitlab.com
Welcome to GitLab, @root
Connection to gitlab.com closed.



安裝nginx
# yum install nginx
啟動
# service nginx restart
http://xx.xx:1234/ => 開啟gitlab
http://xx.xx/ => 開啟nginx,與gitlab不衝突
CentOS 7 預設nginx的路徑在 /usr/share/nginx/html

設vhost
https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-on-centos-7
建立vhost路徑
# mkdir -p /var/www/example.com/html
編輯首頁內容
# vim /var/www/example.com/html/index.html  # 隨便寫些內容進去
模仿ubuntu格式建立sites-available和sites-enabled資料夾
# mkdir /etc/nginx/sites-available
# mkdir /etc/nginx/sites-enabled
編輯nginx.conf
# vim /etc/nginx/nginx.conf
http {}  區塊之間加入
include /etc/nginx/sites-enabled/*.conf; 
server_names_hash_bucket_size 64;
編輯vhost設定檔
# vim /etc/nginx/sites-available/example.com.conf
server {
    listen  80;

    server_name example.com www.example.com;

    location / {
        root  /var/www/example.com/html;
        index  index.html index.htm;
        try_files $uri $uri/ =404;
    }

    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
        root  /usr/share/nginx/html;
    }
}
啟用設定檔
# ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf
重啟nginx
# service nginx restart

同時開 http://example.com (記得新增DNS或hosts) 和原本網址,可以開啟兩個不同位置的程式

將A主機gitlab的project複製到B主機
A主機gitlab版本 GitLab 7.4.3
B主機gitlab版本 GitLab Community Edition 8.1.2
1. B主機gitlab登入後 => Profile Settings => SSH Keys => ADD SSH KEY => 將 A主機gitlab登陸用戶同名的SSH公鑰 cat ~/.ssh/id_rsa.pub  新增到B主機gitlab SSH Keys上
2. Dashboard => Projects => NEW PROJECT => Import project fromANY REPO BY URL =>
這時候把A主機的git網址貼上,如: http(s)://username:password@gitlab.company.com/group/project.git

即可導入
ps. 這方法雖然方便,但是當專案一大之後導入時間過久

安裝Percona 5.6
https://www.percona.com/doc/percona-server/5.6/installation/yum_repo.html
安裝Percona yum repository ( percona-release )
# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
測試 repository
# yum search percona
...
Percona-Server-server-55.x86_64 : Percona Server: a very fast and reliable SQL database server
Percona-Server-server-56.x86_64 : Percona Server: a very fast and reliable SQL database server
Percona-Server-server-57.x86_64 : Percona Server: a very fast and reliable SQL database server
...
安裝
# yum install Percona-Server-server-56
===============================================================================================================================
 Package                             Arch              Version                         Repository                         Size
===============================================================================================================================
Installing:
 Percona-Server-server-56            x86_64            5.6.28-rel76.1.el7              percona-release-x86_64             18 M
 Percona-Server-shared-56            x86_64            5.6.28-rel76.1.el7              percona-release-x86_64            652 k
     replacing  mariadb-libs.x86_64 1:5.5.44-1.el7_1
Installing for dependencies:
 Percona-Server-client-56            x86_64            5.6.28-rel76.1.el7              percona-release-x86_64            5.8 M
 libaio                              x86_64            0.3.109-13.el7                  base                               24 k
 perl-Data-Dumper                    x86_64            2.145-3.el7                     base                               47 k
檢查裝好了沒
# rpm -qa | grep Percona
Percona-Server-client-56-5.6.28-rel76.1.el7.x86_64
Percona-Server-shared-56-5.6.28-rel76.1.el7.x86_64
Percona-Server-server-56-5.6.28-rel76.1.el7.x86_64

調大linode的swap
由 Arch swap心得 得知,swap大小為ram兩倍(2GB)為佳,如何提高linode上的swap呢?
登陸linode後台 => 先將linode關機(Shut down) => 先將ext4的空間按Edit調小 ( CentOS 7 Disk (24064 MB, ext4) )成24064-1024-512=22528MB  => 將swap空間按Edit調大 ( 512MB Swap Image (512 MB, swap) )成2048MB => 重新啟動(Boot)機器


安全

因為用戶是透過ssh去gitlab拉取code的,所以要對sshd服務做些限制,以免外部IP惡意去try伺服器22端口(你ssh登錄成功後會跟你說之前失敗登錄了幾次和最後一次失敗的IP、時間)
https://unix.stackexchange.com/a/406264  +  https://unix.stackexchange.com/a/490120  Limit SSH access to specific clients by IP address

編輯 sshd_config 檔案

AllowUsers johndoe@192.168.1.* admin2@192.168.1.*
編輯後需重啟sshd服務

使用TCP包裝器(Using TCP wrappers)

/etc/hosts.deny 禁止所有主機

sshd : ALL

/etc/hosts.allow 加白

sshd : 192.168.1.0/24
sshd : x.x.x.x


gitlab 啟動失敗

https://stackoverflow.com/a/65439226   Gitlab Cannot start runsv is not running
# gitlab-ctl restart
fail: gitlab-git-http-server: runsv not running
fail: logrotate: runsv not running
fail: nginx: runsv not running
fail: postgresql: runsv not running
fail: redis: runsv not running
fail: sidekiq: runsv not running
fail: unicorn: runsv not running

原因: 

gitlab-runsvdir 沒跑
# systemctl status gitlab-runsvdir
● gitlab-runsvdir.service - GitLab Runit supervision process
   Loaded: loaded (/usr/lib/systemd/system/gitlab-runsvdir.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

解法

# systemctl start gitlab-runsvdir
# gitlab-ctl restart
ok: run: gitlab-git-http-server: (pid 24475) 1s
ok: run: logrotate: (pid 24481) 0s
ok: run: nginx: (pid 24488) 1s
ok: run: postgresql: (pid 24493) 0s
ok: run: redis: (pid 24502) 0s
ok: run: sidekiq: (pid 24507) 0s
ok: run: unicorn: (pid 24513) 0s



參考資料:
https://about.gitlab.com/downloads/#centos7 Install a GitLab CE Omnibus package on CentOS 7 (and RedHat/Oracle/Scientific Linux 7)
http://linode.blog6.info/install-os/installcentos2 Linode VPS 2-2 安裝CentOS作業系統
http://serverfault.com/questions/585528/set-gitlab-external-web-port-number Set gitlab external web port number