Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 15 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
15
Dung lượng
355,21 KB
Nội dung
Sử dụngCGIScriptvớiNginx trên
OpenSUSE 11.4
Cách đây vài ngày chúng tôi đã giới thiệu tới các bạn lợi ích của chuẩn kết
nối CGI và cách sử dụngCGIScriptvớiNginx trên Fedora 15. Tuy nhiên
ngày nay, OpenSUSE (hệ điều hành chiến lược của Novell) hiện được sửdụng khá
phổ biến ở Châu Âu và ngày càng chiếm được số lượng người dùng yêu thích
linux cũng như mới bắt đầu làm quyen với linux do sự dễ cài đặt, dễ sửdụng và
giao diện thân thiện của hệ điều hành. Vì vậy nhu cầu sử dụngCGI scripts (Perl
scripts) là rất lớn.
Cũng như trên Fedora, CGI không đáp ứng cho OpenSUSE theo mặc định. Để
khắc phục thiếu sót này chúng ta cần truy vấn proxy cho các scriptCGI tới Thttpd
(một máy chủ nhỏ hỗ trợ CGI), tiếp theo sửdụng một CGI wrapper để đáp ứng
CGI script. Sau đây là các bước tiến hành trên phiên bản OpenSUSE 11.4.
Lưu ý chung
Ở đây chúng tôi sửdụng website www.example.com với thư mục root là
/srv/www/www.example.com/web/; cấu hình vhost nằm trong tập tin cấu hình
chính của nginx /etc/nginx/nginx.conf.
Sử dụng Thttpd
Đầu tiên chúng tôi sẽ mô tả cách cấu hình nginx để truy vấn proxy cho CGIscript
(có phần mở rộng .cgi hoặc .pl) tới Thttpd. Và cấu hình Thttpd chạy trên cổng
8000.
Hãy bắt đầu bằng việc cài đặt Thttpd. Là một gói cho OpenSUSE, nhưng
ThttpdCGI cần được vá, do đó chúng ta tải về gói src.rpm cho OpenSUSE 11.4, vá
nó và xây dựng một gói rpm mới.
Đầu tiên cần kích hoạt kho lưu trữ của openSUSE-11.4-Source bằng lệnh:
yast
Vào Software > chọn Software Repositories:
Kích hoạt kho openSUSE-11.4-Source và thoát khỏi YaST:
Chúng ta cần cài đặt các công cụ cần thiết để xây dựng một gói rpm mới:
zypper install patch automake glibc-devel gcc flex
compat-readline4 db-devel wget gcc-c++ make vim libtool
Tiếp theo tải về gói src.rpm của Thttpd cho OpenSUSE 11.4:
cd /usr/src
zypper source-install thttpd
Bây giờ là lúc tải bản vá cho thư mục /usr/src/packages/SOURCES/ và chỉnh sửa
tập tin /usr/src/packages/SPECS/thttpd.spec cho phù hợp:
cd /usr/src/packages/SOURCES
wget -O thttpd-2.25b-ipreal.patch
http://www.danielclemente.com/amarok/ip_real.txt
Mở /usr/src/packages/SOURCES/thttpd-2.25b-ipreal.patch
vi /usr/src/packages/SOURCES/thttpd-2.25b-ipreal.patch
… và chỉnh sửa hai dòng đầu tiên của phiên bản gốc:
thttpd-2.25b/libhttpd.c 2003-12-25
20:06:05.000000000 +0100
+++ thttpd-2.25b-patched/libhttpd.c 2005-01-09
00:26:04.867255248 +0100
[ ]
Loại bỏ phần được đánh dấu để trở thành như sau:
libhttpd.c 2003-12-25 20:06:05.000000000 +0100
+++ libhttpd.c 2005-01-09 00:26:04.867255248 +0100
[ ]
Tiếp theo vào đường dẫn /usr/src/packages/SPECS/ và sửa lại thttpd.spec:
cd /usr/src/packages/SPECS/
vi thttpd.spec
Thêm vào đó dòng Patch13: thttpd-2.25b-ipreal.patch và
%patch13:
[ ]
Patch0: %{name}-%{version}-configure.patch
Patch1: %{name}-%{version}-dirs.patch
Patch2: %{name}-%{version}-time_h.patch
Patch3: %{name}-%{version}-newautoconf.patch
Patch4: %{name}-%{version}-sec.patch
Patch5: %{name}-%{version}-static.patch
Patch6: %{name}-%{version}-pie.patch
Patch7: %{name}-%{version}-syslogtocern.diff
Patch8: %{name}-%{version}-overflow.diff
Patch9: %{name}-%{version}-chown.diff
Patch10: %{name}-%{version}-zerolen.patch
Patch11: %{name}-%{version}-strcpy.patch
Patch12: thttpd-2.25b-getline.patch
Patch13: thttpd-2.25b-ipreal.patch
[ ]
%prep
%setup -q -a 1
%patch0
%patch1
%patch2
%patch3
%patch4
%patch5
%patch6
%patch7
%patch8
%patch9
%patch10
%patch11
%patch12
%patch13
[ ]
Xây dựng gói Thttpd rpm như sau:
rpmbuild -ba thttpd.spec
Thttpd rpm sẽ được khởi tạo trong /usr/src/packages/RPMS/x86_64
(/usr/src/packages/RPMS/i386 nếu hệ thống của bạn là i386) vì vậy hãy vào đó:
cd /usr/src/packages/RPMS/x86_64
ls -l
server1:/usr/src/packages/RPMS/x86_64 # ls -l
total 276
-rw-r r 1 root root 278693 Oct 5 17:20 thttpd-
2.25b-181.1.x86_64.rpm
server1:/usr/src/packages/RPMS/x86_64 #
Cài đặt gói Thttpd như sau:
rpm -ivh thttpd-2.25b-181.1.x86_64.rpm
Sau đó chúng ta sao lưu tập tin gốc /etc/thttpd.conf và tạo một cái mới:
mv /etc/thttpd.conf /etc/thttpd.conf_orig
vi /etc/thttpd.conf
# BEWARE : No empty lines are allowed!
# This section overrides defaults
# This section _documents_ defaults in effect
# port=80
# nosymlink # default = !chroot
# novhost
# nocgipat
# nothrottles
# host=0.0.0.0
# charset=iso-8859-1
host=127.0.0.1
port=8000
user=wwwrun
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
dir=/srv/www
cgipat=**.cgi|**.pl
nochroot
Điều này sẽ làm cho Thttpd nghe trên cổng 8000 của địa chỉ 127.0.0.1; thư mục
root là /srv/www.
Tạo hệ thống liên kết khởi động cho Thttpd:
chkconfig -f add thttpd
Và chạy nó:
/etc/init.d/thttpd start
Tiếp theo là tạo tập tin /etc/nginx/proxy.conf:
vi /etc/nginx/proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
Bây giờ bạn mở tập tin cấu hình vhost
vi /etc/nginx/nginx.conf
và thêm location /cgi-bin {} vào nội dung của server {}:
server {
[ ]
location /cgi-bin {
include proxy.conf;
proxy_pass http://127.0.0.1:8000;
}
[ ]
}
Khởi động lại nginx:
/etc/init.d/nginx reload
Bởi vì thư mục root của Thttpd là /srv/www, location /cgi-bin được chuyển tới
/srv/www/cgi-bin (điều này đúng cho toàn bộ vhost của bạn, do đó mỗi vhost phải
đặt các CGIscript của nó trong /srv/www/cgi-bin; như vậy môi trường chia sẻ
hosting sẽ bị hạn chế. Giải pháp là chúng ta sửdụngCGI wrapper được trình bày
trong mục 3 của bài viết).
Tạo thư mục:
mkdir /srv/www/cgi-bin
… và đặt các CGIscript trong đó rồi thực thi chúng. Vì mục đích thử nghiệm nên
chúng tôi sẽ tạo ra một Perl script nhỏ có tên Hello World (thay vì hello_world.cgi
bạn có thể dùng phần mở rộng .pl -> hello_world.pl):
vi /srv/www/cgi-bin/hello_world.cgi
#!/usr/bin/perl -w
# Tell perl to send a html header.
# So your browser gets the output
# rather then <stdout>(command line
# on the server.)
print "Content-type: text/html\n\n";
# print your basic html tags.
# and the content of them.
print "<html><head><title>Hello World!!
</title></head>\n";
print "<body><h1>Hello world</h1></body></html>\n";
chmod 755 /srv/www/cgi-bin/hello_world.cgi
Mở trình duyệt của bạn lên và thử nghiệm script:
http://www.example.com/cgi-bin/hello_world.cgi
Nếu mọi thứ đều ok bạn sẽ thấy trang sau:
Sử dụng Fcgiwrap
Fcgiwrap là một CGI wrapper có thể được sửdụng trong môi trường chia sẻ
hosting bởi nó cho phép mỗi vhost sửdụng thư mục cgi-bin riêng.
Gói fcgiwrap không có sẵn cho OpenSUSE, bạn cần xây dựng riêng cho mình.
Đầu tiên là cài đặt một số điều kiện:
zypper remove patterns-openSUSE-minimal_base
zypper install git patch automake glibc-devel gcc flex
compat-readline4 db-devel wget gcc-c++ make vim libtool
FastCGI-devel
Tạo các symlink dưới đây;
ln -s /usr/include/fastcgi/fastcgi.h
/usr/local/include/
ln -s /usr/include/fastcgi/fcgi_config.h
[...]... đặt fcgiwrap trong /usr/local/sbin/fcgiwrap Tiếp theo chúng ta cài đặt gói spawn-fcgi để cho phép chạy fcgiwrap như một daemon: zypper install spawn-fcgi Khởi động fcgiwrap: spawn-fcgi -u nginx -g nginx -s /var/run/fcgiwrap.socket -S -M 0700 -F 1 -P /var/run/spawn-fcgi.pid /usr/local/sbin/fcgiwrap Bạn có thể tìm thấy socket fcgiwrap trong /var/run/fcgiwrap.socket, thuộc sở hữu bởi user và nhóm nginx. .. /usr/include/fastcgi/fcgi_stdio.h /usr/local/include/ ln -s /usr/include/fastcgi/fcgiapp.h /usr/local/include/ ln -s /usr/include/fastcgi/fcgimisc.h /usr/local/include/ ln -s /usr/include/fastcgi/fcgio.h /usr/local/include/ ln -s /usr/include/fastcgi/fcgios.h /usr/local/include/ Và sau đó bạn có thể xây dựng fcgiwrap: cd /usr/local/src/ git clone git://github.com/gnosek/fcgiwrap.git cd fcgiwrap autoreconf... socket fastcgi_pass unix:/var/run/fcgiwrap.socket; # Fastcgi parameters, include the standard ones include /etc /nginx/ fastcgi_params; # Adjust non standard parameters (SCRIPT_ FILENAME) fastcgi_param SCRIPT_ FILENAME $document_root$fastcgi _script_ name; } [ ] } Khởi động lại nginx: /etc/init.d /nginx reload Tiếp theo chúng ta tạo thư mục cgi- bin (/srv/www/www.example.com /cgi- bin) bởi vì cần định nghĩa root... /etc /nginx/ nginx.conf và thêm location /cgi- bin {} trong nội dung của server {}: server { [ ] location /cgi- bin/ { # Disable gzip (it makes scripts feel slower since they have to complete # before getting gzipped) gzip off; # Set the root to /usr/lib (inside this location this means that we are # giving access to the files under /usr/lib/cgibin) root /srv/www/www.example.com; # Fastcgi socket fastcgi_pass... /var/www/www.example.com; trong nội dung của location /cgi- bin {}: mkdir /srv/www/www.example.com /cgi- bin Sau đó đặt CGI script vào và thực thi chúng Để thử nghiệm chúng tôi tạo ra một Perl script nhỏ có tên Hello World (thay vì hello_world .cgi bạn có thể dùng phần mở rộng pl -> hello_world.pl): vi /srv/www/www.example.com /cgi- bin/hello_world .cgi #!/usr/bin/perl -w # Tell perl to send a html header... print "Hello World!! \n"; print "Hello world\n"; chmod 755 /srv/www/www.example.com/cgibin/hello_world .cgi Mở trình duyệt của bạn lên và thử nghiệm script: http://www.example.com /cgi- bin/hello_world .cgi Nếu mọi thứ đều ổn bạn sẽ thấy trang sau: ... socket fcgiwrap trong /var/run/fcgiwrap.socket, thuộc sở hữu bởi user và nhóm nginx Nếu không muốn khởi động fcgiwrap thủ công cho từng thời điểm khởi động hệ thống, mở /etc/init.d/boot.local vi /etc/init.d/boot.local Thêm lệnh spawn-fcgi vào cuối tập tin – điều này sẽ tự động khởi chạy fcgiwrap vào cuối quá trình boot #!/usr/bin/perl -w # Tell perl to send a html header # So your browser gets the . Sử dụng CGI Script với Nginx trên
OpenSUSE 11. 4
Cách đây vài ngày chúng tôi đã giới thiệu tới các bạn lợi ích của chuẩn kết
nối CGI và cách sử dụng. chủ nhỏ hỗ trợ CGI) , tiếp theo sử dụng một CGI wrapper để đáp ứng
CGI script. Sau đây là các bước tiến hành trên phiên bản OpenSUSE 11. 4.
Lưu ý chung