SSH Tunneling via Apache

1 Comment

อุปกรณ์ที่มี

  1. Apache web server ที่ติด mod_proxy และ mod_proxy_connect หรือ Web proxy server อะไรก็ได้ที่รองรับคำสั่ง CONNECT
  2. Proxytunnel
  3. SSH client

เริ่มจากตั้งค่าให้ Apache ก่อน โดยกำหนดให้ Apache เป็น Forward Proxy

<VirtualHost *:80>
  ServerName blah.com
 
  ProxyRequests On
  ProxyVia On
  AllowCONNECT 22 80 443 563
  <Proxy *>
    Order allow,deny
    Allow from all
  </Proxy>
</VirtualHost>
  • ProxyRequests เพื่อให้ Apache ทำตัวเป็น ForwardProxy เอา request เรียกไปที่เครื่องอื่นต่อได้
  • ProxyVia เพื่อให้ Apache แปะไปที่ request ที่เรียกต่อไปด้วยว่า เรียกผ่าน Proxy ที่ไหนมา
  • AllowCONNECT ไว้บอกว่าจะใช้คำสั้ง CONNECT ยิงไปที่ปลายทางได้ที่ port ไรบ้าง
  • <Proxy wildcard-url> เพื่อกำหนดขอบเขตของ Host ที่จะให้ใช้ Proxy นี้เรียกต่อได้

จากนั้นไปเอา Proxytunnel มาคอมไพล์และติดตั้ง (ถ้าเป็น Linux คาดว่าจะสามารถทำผ่าน repository ได้เลยมั้ง Windows ก็มี .exe ให้ เพราะงั้นสามารถใช้ได้หมด) ความสนุกที่เหลือคือ เรียกใช้คำสั่ง

ssh user@targethost -o ProxyCommand='proxytunnel -p proxy1:port -r proxy2:port -d %h:%p -H "User-Agent: Mozilla/4.0 ( compatible\; MSIE 6.0\; Win32 ) \n"'

สำหรับ -r จะใส่หรือไม่ใส่ก็ได้ แต่ใช้สำหรับกรณีที่ต้องใช้ Proxy มากกว่า 1 ที่ ส่วน targethost คือเครื่องภายในเครือข่ายที่อยู่ที่เดียวกับ proxy ปลายทางที่ใส่ไว้ใน -r (หรือ -p ถ้าไม่ได้ใส่ -r ไว้)

รู้สึกซับซ้อนมาก จริงๆ มี Option สำหรับ bind port หรือจะทำให้เป็น Sock Server อีกแต่จะใช้แล้วค่อยมาเขียนจดอีกที

ApacheBench

Comments Off

กลางๆ สัปดาห์ที่แล้วพี่ที่ทำงานย้ายเครื่องที่เก็บ Trac และทำใหม่ ตอนแรกก็รู้สึกว่าช้าเมื่อเทียบกับที่เคยทำ ลองเปลี่ยนวิธีดูให้เหมือนกันกลับช้ากว่าเก่า เข้ามาใน IRC ถามว่าเป็นเพราะอะไรกลับได้ของเล่นมาใหม่ชิ้นนึงคือ ab ตอนแรกก็งงว่ามันคืออะไร ลองเล่นดูถึงได้เข้าใจ ก็เลยเริ่มจาก Trac ที่คิดว่าเร็วก่อน ผลปรากฏว่า

 
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
 
Benchmarking project.nytes.net (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
 
 
Server Software:        Apache/2.2.9
Server Hostname:        project.nytes.net
Server Port:            80
 
Document Path:          /
Document Length:        6008 bytes
 
Concurrency Level:      100
Time taken for tests:   33.960 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      6455000 bytes
HTML transferred:       6008000 bytes
Requests per second:    29.45 [#/sec] (mean)
Time per request:       3395.973 [ms] (mean)
Time per request:       33.960 [ms] (mean, across all concurrent requests)
Transfer rate:          185.62 [Kbytes/sec] received
 
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   10 253.0      0    7957
Processing:     0 3280 2846.3   2567   16780
Waiting:        0 3278 2846.7   2566   16779
Total:        134 3290 2846.9   2571   16780
 
Percentage of the requests served within a certain time (ms)
  50%   2571
  66%   3703
  75%   4661
  80%   5346
  90%   7370
  95%   9158
  98%  10729
  99%  13626
 100%  16780 (longest request)

ดูทั้งหมดแล้วสนใจอยู่ค่าเดียวคือ ค่าเฉลี่ยที่เว็บนี้รับได้คือประมาณ 30 requests ต่อวิ เหมือนเร็วนะแต่ลองเทียบกับเว็บอื่นในเครื่องมันกลับช้าลงไปเลยหละเพราะเว็บอื่นมันดันไปวิ่งๆ อยู่ที่ 400 – 500 requests ต่อวิ -_-! ว่าจะเทียบกับ redmine ด้วยแต่ขี้เกียจลงเพิ่มเลยไว้ก่อน

จริงๆ นี่เป็นเครื่องมือที่สองที่ได้เล่นไว้สำหรับทดสอบความสามารถของบริการต่างๆบนเซิร์ฟเวอร์ ตัวแรกคือ JMeter แต่อันนั้นจะทำงานต้องต้องมีจาวาในเครื่อง ก็เลยขี้เกียจลอง แต่ข้อดีของ JMeter คือมันทำอะไรได้เยอะกว่ามาก และสามารถแสดงกราฟให้เห็นได้ทันที แต่ ApacheBench หากอยากดูกราฟต้องให้เซฟมาเป็นไฟล์ แล้วเอามาดูอีกที และก็สามารถทดสอบได้เฉพาะ http/https เท่านั้น ถ้าไว้ทดสอบเว็บทั่วไปเท่านี้ก็คงเพียงพอแล้วมั้ง

GIT Apache Trac

3 Comments

เมื่อคืนกะว่าจะเอาโค้ดขึ้นเซอร์ฟเวอร์อีกรอบหลังจากมันหายไปเพราะลงเครื่องใหม่ นั่งลงไปลงมา เลยอยากลองของซะหน่อย svn มันไม่สะใจใช้ git ละกันปรากฏว่าทำมันทั้งคืนเจอปัญหานู่นนี่จนกว่าจะเสร็จเช้านี้ -_-” ทำเสร็จขอเขียนวิธีเก็บไว้เป็นที่ระทึกหน่อยว่ามันสาหัสต่างจาก svn ขนาดไหน
เริ่มจากเตรียม Apache ก่อนแต่จริงๆ ที่ลงไปก็ลงไปพร้อมอยู่แล้วอ่ะนะจาก svn แต่ถ้าใครยังไม่ได้เตรียมก็ลงตามด้านล่างก่อนละกัน

  1. เริ่มจากลง mod_dav และ mod_dav_fs ก่อน(เอ๊ะ หรือมันมาพร้อมกันไม่แน่ใจ) ถ้าจำไม่ผิดมันจะมีให้เลือกตอนติดจาก port เลยแต่ถ้าเป็น Ubuntu คิดว่าง่ายกว่านั้น apt-get install mod_dav หรือป่าวหว่าแป๊บเดียวก็เสร็จ ส่วนแมคอื่มช่างมันละกัน(จริงๆ คือไปจิ๊ก FreeBSD เอามาใส่เลยก็ได้ ^^!)
  2. จากนั้นกำหนดล๊อกไฟล์ของ DAV ว่าจะให้เป็นไฟล์ในใน httpd.conf ด้านล่างนี่ใช้ของดั้งเดิมที่แถมมาให้หลังจากติดจาก port ขี้เกียจแก้
    DavLockDB "/usr/local/var/DavLock"
  3. เตรียมไฟล์ที่เก็บรายชื่อคนที่เข้ามาใช้ได้ และก็รหัสผ่าน เอาแบบง่ายๆ นะ พอถามรหัสก็ใส่รหัสของ user นั้นไป
    htpasswd -c /path/to/password/file username
  4. กำหนด URL ที่จะให้ใช้ผ่านเว็บได้พร้อมกับกำหนดให้ URL นั้นสามารถใช้ DAV ได้
    Alias /project.git /path/to/repository
     
    <Location /project.git>
      #กำหนดให้ URL นี้สามารถใช้ webdav เข้ามาดูได้
      DAV on
     
      #จะเข้ามาดูได้ต้องตรวจสอบกันหน่อย(อยากได้พิศดาร ก็ไปหาดูในเว็บ Apache ละกัน)
      AuthType Basic
      AuthName Project name
      AuthUserFile /path/to/password/file
     
      #จะเข้ามาที่ URL นี้ได้ต้องมีรายชื่ออยู่ใน AuthUserFile (ถ้าอยากให้เข้ามาดูได้แต่ไม่สามารถแก้ไขได้ก็ใส่ <LimitExcept> ไป แต่ขี้เกียจเขียน ยาว
      require valid-user
    </Location>
  5. สั่ง Apache เริ่มใหม่ซักหนึ่งรอบแล้วลองเข้าไปที่ URL ที่ใส่ไว้ดูด้วยโปรแกรมที่ใช้ webdav ได้(อย่าง Finder Cyberduck หรือจะเอาแบบพื้นๆ ก็ Telnet เข้าไปแล้วใช้ PROPFIND ลองเรียกดู ถ้าได้ก็ผ่าน)

เอาหละจบไปหนึ่งส่วนต่อไปก็ถึงตา git จริงๆ ส่วนนี้ไม่ค่อยมีอะไร(หรือป่าว -_-”) ลองดูละกัน

  1. เริ่มจากไปที่ตำแหน่งที่จะเอาไว้เก็บโค้ดที่ฝั่ง server แล้วสั่ง init repository ซะ
    $git init --bare
    ที่ใส่ bare เพราะว่าตำแหน่งนี้เราไม่ได้ไว้ใช้ทำงานมีแต่ config ล้วนๆ เพราะงั้นไม่ต้องเอาไปซ่อน สร้างมันตรงนี้เลย
    เพิ่มเติม: หลังจาก init bare เสร็จต้องสั่ง git update-server-info ด้วยอีกรอบเพื่อให้มันสร้าง refs ในแฟ้ม info ไม่งั้น push เข้ามาไม่ได้
  2. ที่ฝั่งไคลเอ็นท์ไปที่ตำแหน่งของโปรเจคจากนั้นก็สั่ง init เหมือนกันพร้อมกับเอาไฟล์ยัดใส่ไปในนั้นให้พร้อม
    $cd /path/to/project
    $git init
    $git add .
    $git commit
  3. หลังจากได้ git ที่ฝั่งไคลเอ็นท์แล้วจับมันส่งมาที่ฝั่งเซิร์ฟเวอร์ซะ
    $git push user@server:/path/to/repository master -f
    ไอ้ขั้นนี้แหละทำแสบมาก หาต้ังนานเพราะว่า webdav มันดันไม่สามารถสร้าง branch ให้ได้แล้วไอ้ branch master มันก็ไม่สร้างแต่แรกให้ไม่รู้ทำไมต้องใช้ ssh ส่งเข้ามาก่อนพร้อมขืนใจให้มันสร้างให้
    เพิ่มเติม: พลาดเองจากตอนกำหนด DavLock ใน Apache ครับคือถ้ากำหนดถูก Apache สามารถสร้าง lock ได้ขั้นนี้ก็ไม่ต้อง
  4. หลังจากนั้นเวลาแก้ไขไฟล์อะไร พอต้องการ merge รวมกับฝั่งเซิร์ฟเวอร์ก็ใช้คำสั่ง
    $git config remote.upload.url http://username@host/location
    $git push upload master
    คำว่า master สามารถเปลี่ยนได้แล้วแต่ branch ที่เราจะยัด ส่วนบรรทัดแรกเป็นการกำหนดตำแหน่งของ repository ซึ่งถ้าไปหาในเว็บทั้งหลายแหล่ มันดันมี – อยู่ระหว่าง git กับ config คาดว่าเป็นรุ่นเก่า หลังจากนี้ repository ในเครื่องเรากับเซิร์ฟเวอร์ก็จะเหมือนกันหละ

โอ่ถึงตัวสุดท้ายกันเสียที อันนี้เหมือนจะไม่ยากแต่ต้องไปแก้โค้ดนิดหน่อยเพื่อให้มันใช้ได้(ก็หวังว่าปลั๊กอินรุ่นใหม่ออกมาจะไม่ต้องแก้นะ)

  1. ติดตั้ง Trac ซักที่ด้วยคำสั่ง
    $trac-admin /path/to/trac initenv
  2. จากนั้นไปเอา GitPlugins มาพร้อมกับขยาย
  3. แก้ไขไฟล์ tracext/git/PyGIT.py บรรทัดที่ 316 เป็น
    #assert all(e is not None for e in self.__rev_cache)
    (เอามันออกนั่นแหละ ^^!)
  4. สั่งมันติดตั้งซะ
    $python setup.py install
  5. แก้ไข config ของ Trac
    repository_dir = /path/to/repository
    repository_type = git
    จากนั้นลองเข้า Trac ผ่านหน้าเว็บดูก็น่าจะได้หละ

ขั้นตอนแค่นี้แหละ ไม่ยาวใช่มะๆ หามันทั้งคืนเลย -_-!!! เห้อไม่น่าลองของแปลกเลย แต่จะทำครึ่งๆ กลางๆ ซะก็ยังไงอยู่ ทำจนเสร็จจนได้หละ
อ้างอิง:

Older Entries