Nginx ("engine x") 是一個高性能的 HTTP 和反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。
Nginx 是由 Igor Sysoev 爲俄羅斯訪問量第二的 Rambler.ru 站點開發的,它已經在該站點運行超過兩年半了。Igor
將源代碼以類BSD許可證的形式發佈。
Nginx 超越 Apache 的高性能和穩定性,使得國內使用 Nginx 作爲 Web
服務器的網站也越來越多,但是網上吹噓勝於apche10倍實在比較誇張,apache經過優化之後處理PHP頁面速度還是不錯的,比fastcgi方式
要穩定的多。
本文就是整合了nginx和apache,由nginx處理靜態頁,apache處理php頁面
安裝步驟
系統要求:Linux 2.6+ 內核,本文中的Linux操作系統爲CentOS 4.8,另在RedHat AS4上也安裝成功
一、獲取相關開源程序:
所需軟件:
eaccelerator-0.9.5.3.tar.bz2
gd-2.0.35.tar.gz
httpd-2.2.14.tar.bz2
mysql-5.1.42.tar.gz
php-5.2.12.tar.bz2
ZendOptimizer-3.3.9-linux-glibc21-i386.tar.gz
nginx-0.7.64.tar.gz
pcre-8.0.tar.gz
-------------------------------------------------------------------------------------------------
安裝之前要確保系統中安裝了以下這些包。
我們可以用rpm -qa |grep 來查看系統是否裝
bzip2-devel
zlib-devel
libjpeg-devel
libpng-devel
libtiff-devel
freetype-devel
openssl-devel
libxml2-devel
gettext-devel
這些包一般都安了,除了最後一個,我們可以在光盤裏找到用rpm -ivh 來安裝上.
二、安裝MYSQL
# tar -zxvf mysql-5.1.42.tar.gz
# cd mysql-5.1.42
# groupadd mysql
# useradd -g mysql -s /sbin/nologin -M mysql
# ./configure --prefix=/usr/local/www/mysql --with-charset=gbk
--with-extra-charsets=all --enable-thread-safe-client
--localstatedir=/var/data
# make && make install
# cp support-files/my-large.cnf /etc/my.cnf
# chown -R mysql.mysql /usr/local/www/mysql/
# /usr/local/www/mysql/bin/mysql_install_db --user=mysql
# chown -R root.root /usr/local/www/mysql/
# chown -R mysql.mysql /var/data
啓動數據庫服務,並添加到自啓動
# /usr/local/www/mysql/bin/mysqld_safe --user=mysql &
# netstat -ant
查看3306端口
加入自動啓動服務隊列:
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod 755 /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld on
添加root密碼
# /usr/local/www/mysql/bin/mysqladmin -u root password "123456"
測試一下:
# /usr/local/www/mysql/bin/mysql -u root -p
輸入密碼:123456,看能不能進入到數據庫
配置庫文件搜索路徑
# echo "/usr/local/www/mysql/lib/mysql">>/etc/ld.so.conf
# ldconfig
# ldconfig -v
# echo "export PATH=$PATH:/usr/local/www/mysql/bin">>/etc/profile
# source /etc/profile
三、安裝gd
# tar -jxvf gd-2.0.35.tar.bz2
# cd gd-2.0.35
# ./configure --prefix=/usr/local/www/gd --with-png --with-freetype
--with-jpeg --with-zlib --with-fontconfig
# make
#如果GD報錯:configure.ac:64: warning: macro `AM_ICONV' not found in library
你就make clean一下,然後再make
# make install
----------------------------------------------
四、安裝Apache
# groupadd www
# useradd -g www -s /sbin/nologin -M www
# tar -jxvf httpd-2.2.14.tar.bz2
# cd httpd-2.2.14
# cd srclib/apr
# ./configure --prefix=/usr/local/www/apr --enable-threads
--enable-other-child --enable-static
# make && make install
# cd ../apr-util
# ./configure --prefix=/usr/local/www/apr-util
--with-apr=/usr/local/www/apr
# make && make install
# cd ../..
# ./configure --prefix=/usr/local/www/apache --enable-so
--enable-rewrite --with-apr=/usr/local/www/apr
--with-apr-util=/usr/local/www/apr-util
# make
# make install
#vi /usr/local/www/apache/conf/httpd.conf
(1)找到DocumentRoot "/usr/local/www/apache/htdocs"
修改爲:DocumentRoot "/var/www"
(2)找到
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all //這句改爲Allow from all
</Directory>
(3)找到<Directory "/usr/local/www/apache/htdocs">
修改爲:<Directory "/var/www">
(4)找到
Options Indexes FollowSymLinks //這行註釋掉,禁止目錄列表
(5)找到
<IfModule !mpm_netware_module>
<IfModule !mpm_winnt_module>
User daemon //改爲www
Group daemon //改爲www
</IfModule>
</IfModule>
添加到自啓動
# cp /usr/local/www/apache/bin/apachectl /etc/rc.d/init.d/httpd
然後 vi /etc/rc.d/init.d/httpd 添加(#!/bin/sh下面)
# chkconfig: 2345 10 90
# description: Activates/Deactivates Apache Web Server
最後,運行chkconfig把Apache添加到系統的啓動服務組裏面:
# chkconfig --add httpd
# chkconfig httpd on
五、安裝PHP
# tar -jxvf php-5.2.12.tar.bz2
# cd php-5.2.12
# ./configure --prefix=/usr/local/www/php
--with-apxs2=/usr/local/www/apache/bin/apxs
--with-mysql=/usr/local/www/mysql --with-gd=/usr/local/www/gd
--with-config-file-path=/usr/local/www/php --enable-mbstring=all
--enable-xml --disable-rpath --enable-bcmath --enable-shmop
--enable-sysvsem --enable-inline-optimization --enable-mbregex
--with-zlib --enable-sockets --enable-soap --enable-exif --with-zlib-dir
--with-bz2 --with-libxml-dir
# make
# make install
# cp php.ini-dist /usr/local/www/php/php.ini
整合apache與php
# vi /usr/local/www/apache/conf/httpd.conf
找到AddType application/x-gzip .gz .tgz在其下加以下內容
AddType application/x-httpd-php .php
查找:(設置WEB默認文件)
DirectoryIndex index.html
改成:
DirectoryIndex index.php index.html index.htm
保存退出
service httpd restart
然後在目錄中建一個文件用來測試php情況
在htdocs目錄下建一個測試頁
vi index.php
<?php
phpinfo();
?>
保存退出
重啓apache
六、安裝PHP擴展
1、安裝eaccelerator加速軟件
eaccelerator是php的加速軟件,使用後php的執行效率會有很大幅度的提升。
# tar jxvf eaccelerator-0.9.5.3.tar.bz2
# cd eaccelerator-0.9.5.3
# /usr/local/www/php/bin/phpize
# ./configure --enable-eaccelerator=shared
--with-php-config=/usr/local/www/php/bin/php-config
# make
# make install
編譯安裝後我們會看到屏幕提示的eaccelerator.so所在的目錄,php5.2.x系列是在/usr/local/www/php/lib
/php/extensions/no-debug-non-zts-20060613,記住這個路徑,待會要用到
修改php.ini
# vi /usr/local/www/php/php.ini
安裝php擴展
在文件最後,[zend]之前,注意,這部分內容務必放在[zend]之前,不然可能會出現不可預期的服務器問題。添加下列信息:
[eaccelerator]
zend_extension="/usr/local/www/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="3600"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
# mkdir /tmp/eaccelerator
# chmod 777 /tmp/eaccelerator
2、安裝Zend
# tar -zxvf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
# cp
ZendOptimizer-3.3.9-linux-glibc23-i386/data/5_2_x_comp/ZendOptimizer.so
/usr/local/www/php/lib/php/extensions/no-debug-non-zts-20060613/
# vi /usr/local/www/php/php.ini
[Zend Optimizer]
zend_optimizer.optimization_level=1
zend_optimizer.encoder_loader=0
zend_extension="/usr/local/www/php/lib/php/extensions/no-debug-non-zts-20060613/ZendOptimizer.so"
在瀏覽器中打開phpinfo()那個測試頁,如果出現以下內容,證明安裝成功!
This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
with eAccelerator v0.9.5.3, Copyright (c) 2004-2006 eAccelerator, by
eAccelerator
with Zend Optimizer v3.3.9, Copyright (c) 1998-2009, by Zend
Technologies
3、安裝PDO_MYSQL
# tar zxvf PDO_MYSQL-1.0.2.tgz
# cd PDO_MYSQL-1.0.2/
# /usr/local/www/php/bin/phpize
# ./configure --with-php-config=/usr/local/www/php/bin/php-config
--with-pdo-mysql=/usr/local/www/mysql
# make
# make install
# vi /usr/local/www/php/php.ini
添加
extension_dir =
"/usr/local/www/php/lib/php/extensions/no-debug-non-zts-20060613/"
extension="pdo_mysql.so"
七、nginx反向代理
1.Tcmalloc 優化Nginx性能
64位操作系統請先安裝libunwind庫,32位操作系統不要安裝。libunwind庫爲基於64位CPU和操作系統的程序提供了基本的堆棧輾轉開
解功能,其中包括用於輸出堆棧跟蹤的API、用於以編程方式輾轉開解堆棧的API以及支持C++異常處理機制的API。
# tar zxvf libunwind-0.99-alpha.tar.gz
# cd libunwind-0.99-alpha/
# CFLAGS=-fPIC ./configure
# make CFLAGS=-fPIC
# make CFLAGS=-fPIC install
2、安裝google-perftools:
# tar zxvf google-perftools-0.97.tar.gz
# cd google-perftools-0.97/
# ./configure
# make && make install
# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
# /sbin/ldconfig
查看是否好用,啓動nginx
# lsof -n|grep tcmalloc
如果出現下面的就表示成功了
----------------------------------------
nginx 4322 www 10w REG 8,2 0 682436
/var/tmp/tcmalloc.4322
nginx 4323 www 12w REG 8,2 0 682438
/var/tmp/tcmalloc.4323
nginx 4324 www 14w REG 8,2 0 682439
/var/tmp/tcmalloc.4324
nginx 4325 www 16w REG 8,2 0 682440
/var/tmp/tcmalloc.4325
nginx 4326 www 18w REG 8,2 0 682441
/var/tmp/tcmalloc.4326
nginx 4327 www 20w REG 8,2 0 682442
/var/tmp/tcmalloc.4327
nginx 4328 www 22w REG 8,2 0 682443
/var/tmp/tcmalloc.4328
nginx 4329 www 24w REG 8,2 0 682444
/var/tmp/tcmalloc.4329
mysqld_sa 5284 root mem REG 8,2 1388088 62997
/usr/local/lib/libtcmalloc.so.0.0.0
mysqld 5397 mysql mem REG 8,2 1388088 62997
/usr/local/lib/libtcmalloc.so.0.0.0
---------------------------------------------
3.安裝 pcre
#tar zxvf pcre-8.0.tar.gz
#cd pcre-8.0
#./configure
#make && make install
4、安裝nginx
# tar zxvf nginx-0.7.64.tar.gz
# cd nginx-0.7.64
# ./configure --with-http_stub_status_module
--with-google_perftools_module --prefix=/usr/local/www/nginx --user=www
--group=www
# make && make install
修改nginx的配置文件
我這裏是把原先的重命名然後新建了一個nginx.conf
---------------------------------------------------
user www;
worker_processes 8;
pid logs/nginx.pid;
google_perftools_profiles /var/tmp/tcmalloc;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
}
http{
include mime.types;
default_type application/octet-stream;
access_log off;
error_log /dev/null;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 120;
#fastcgi_connect_timeout 300;
#fastcgi_send_timeout 300;
#fastcgi_read_timeout 300;
#fastcgi_buffer_size 64k;
#fastcgi_buffers 4 64k;
#fastcgi_busy_buffers_size 128k;
#fastcgi_temp_file_write_size 128k;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css
application/xml;
gzip_vary on;
include vhost/*.conf;
}
---------------------------------------------
vhost/www.test.com.conf的內容
---------------------------------------------
server
{
listen 80;
server_name www.yahunet.com;
index index.html index.htm index.php;
root /var/www/;
location /nginx {
stub_status on;
auth_basic "NginxStatus";
# auth_basic_user_file conf/htpasswd;
#密碼由apache的htpasswd工具來產生
access_log off;
}
location / {
location ~ .*\.(php|php5)?$ {
index index.php;
root /var/www/;
proxy_pass http://127.0.0.1:81;
}
include proxy.conf;
if ( !-e $request_filename) {
proxy_pass http://127.0.0.1:81;
}
location ~* \.(jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
root /var/www/;
expires 30d;
break;
}
}
location ~* \.(js|css)$ {
if (-f $request_filename) {
root /var/www/;
expires 1d;
break;
}
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#如果需要記錄把下面的註釋去掉
# log_format access '$http_x_forwarded_for - $remote_user [$time_local]
"$request"'
# '$status $body_bytes_sent "$http_referer"'
# '"$http_user_agent" $remote_addr';
# access_log logs/www.yahunet.com_access.log access;
}
-------------------------------------------------
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 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 30;
proxy_send_timeout 30;
proxy_read_timeout 60;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_next_upstream error timeout invalid_header http_500 http_503
http_404;
proxy_max_temp_file_size 128m;
#Nginx cache
client_body_temp_path client_body 1 2;
proxy_temp_path proxy_temp 1 2;
#client_body_temp_path /tmpfs/client_body_temp 1 2;
#proxy_temp_path /tmpfs/proxy_temp 1 2;
#fastcgi_temp_path /tmpfs/fastcgi_temp 1 2;
----------------------------------------------
修改apache的端口爲81
啓動 nginx
#/usr/local/www/nginx/sbin/nginx
然後我們用IE測試一下 http://IP地址或域名 就可以看到nginx的默認的頁面證明nginx已經啓動
關閉 nginx
# kill -QUIT `cat /usr/local/www/nginx/logs/nignx.pid`
重啓 nginx
# kill -HUP `cat /usr/local/www/nginx/logs/nignx.pid`
把nginx加入到系統服務
# vi /etc/rc.d/init.d/nginx
#!/bin/bash
# Startup script for the nginx Web Server
# chkconfig: - 85 15
# description: nginx is a World Wide Web server. It is used to serve
# HTML files and CGI.
# processname: nginx
# pidfile: /usr/local/www/nginx/logs/nginx.pid
# config: /usr/local/www/nginx/conf/nginx.conf
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
NGINX_HOME=/usr/local/www/nginx/sbin
NGINX_CONF=/usr/local/www/nginx/conf
if [ ! -f "$NGINX_HOME/nginx" ]
then
echo "nginxserver startup: cannot start"
exit
fi
case "$1" in
'start')
$NGINX_HOME/nginx -c $NGINX_CONF/nginx.conf
echo "nginx start successful"
;;
'stop')
killall -TERM nginx
;;
esac
# chmod a+x /etc/rc.d/init.d/nginx
# chkconfig --add nginx
# chkconfig nginx on
八、用tmpfs加速nginx和php
1、加速nginx
# mkdir /tmpfs
編輯/etc/fstab,加入
tmpfs /tmpfs tmpfs size=1024m,mode=1777 0 0
編輯/usr/local/nginx/conf/proxy.conf,將緩存目錄均指向/tmpfs
client_body_temp_path /tmpfs/client_body_temp 1 2;
proxy_temp_path /tmpfs/proxy_temp 1 2;
fastcgi_temp_path /tmpfs/fastcgi_temp 1 2;
此分區可視情況適當調整大小,此處設置爲1G
2、加速php
# mkdir /tmpfs/eaccelerator
# chmod 777 /tmpfs/eaccelerator
# vi /usr/local/www/php/php.ini
eaccelerator.cache_dir="/tmp/eaccelerator"
改爲:
eaccelerator.cache_dir="/tmpfs/eaccelerator"
注:/tmpfs重啓後就沒有了,eaccelerator需要手工創建
可以寫一個創建eaccelerator目錄的腳本
# vi /usr/local/www/eacc.sh
#!/bin/sh
/bin/mkdir /tmpfs/eaccelerator
/bin/chmod 777 /tmpfs/eaccelerator
/etc/init.d/httpd restart
# chmod a+x /usr/local/www/eacc.sh
# echo "/usr/local/www/eacc.sh">>/etc/rc.local
九、優化Linux內核參數
# vi /etc/sysctl.conf
在末尾增加以下內容:
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_synack_retries= 1
net.ipv4.tcp_syn_retries = 1
使配置立即生效:
# /sbin/sysctl -p
# vi /etc/security/limits.conf
* soft nofile 51200
* hard nofile 102400
* soft noproc 51200
* hard noproc 102400
# ulimit -SHn 51200
十、Apache優化
1 apache-mpm.conf
httpd.conf去註釋
Include conf/extra/httpd-mpm.conf
# vi /usr/local/www/apache/conf/extra/httpd-mpm.conf
<IfModule mpm_prefork_module>
ServerLimit 1024
StartServers 15
MinSpareServers 15
MaxSpareServers 30
MaxClients 1024
MaxRequestsPerChild 0
</IfModule>
-------------------------------
ServerLimit
默認的MaxClient最大是256個線程,如果想設置更大的值,就的加上ServerLimit這個參數。20000是ServerLimit這個參
數的最大值。如果需要更大,則必須編譯apache,此前都是不需要重新編譯Apache。
-------------------------------
2 apache-keepalive
httpd.conf去註釋
# Include conf/extra/httpd-default.conf
# vi /usr/local/www/apache/conf/extra/httpd-default.conf
Timeout 120 #與nginx的保持一至
KeepAlive On
MaxKeepAliveRequests 1000
KeepAliveTimeout 5
十一、MYSQL 的優化
1、Tcmalloc 優化mysql性能
# vi /etc/init.d/mysqld
添加一行export LD_PRELOAD=/usr/local/lib/libtcmalloc.so
重新啓動mysql
# lsof -n|grep tcmalloc
如果出現下面的就表示成功了
----------------------------------------
nginx 4322 www 10w REG 8,2 0 682436
/var/tmp/tcmalloc.4322
nginx 4323 www 12w REG 8,2 0 682438
/var/tmp/tcmalloc.4323
nginx 4324 www 14w REG 8,2 0 682439
/var/tmp/tcmalloc.4324
nginx 4325 www 16w REG 8,2 0 682440
/var/tmp/tcmalloc.4325
nginx 4326 www 18w REG 8,2 0 682441
/var/tmp/tcmalloc.4326
nginx 4327 www 20w REG 8,2 0 682442
/var/tmp/tcmalloc.4327
nginx 4328 www 22w REG 8,2 0 682443
/var/tmp/tcmalloc.4328
nginx 4329 www 24w REG 8,2 0 682444
/var/tmp/tcmalloc.4329
mysqld_sa 5284 root mem REG 8,2 1388088 62997
/usr/local/lib/libtcmalloc.so.0.0.0
mysqld 5397 mysql mem REG 8,2 1388088 62997
/usr/local/lib/libtcmalloc.so.0.0.0
---------------------------------------------
2、優化/etc/my.cnf
1)確認在“[mysqld]”部分加入了“skip-innodb”和“skip-bdb”參數;
2)確認在“[mysqld]”部分加入了“skip-name-resolve”和“skip-locking”參數;
3)如果不需要的話,可以將二進制日誌(binlog)停掉,方法是將“log-bin”註釋掉;
4)在內存允許的情況下,對一些參數進行重新配置,目標在於將大部分操作集中於內存中,儘量不進行磁盤操作,對於我的 MYSQL
服務器我是如下修改的,基於 2G 內存情況:
[mysqld]
key_buffer=512M
max_allowed_packet=4M
table_cache=1024
thread_cache=64
join_buffer_size=32M
sort_buffer=32M
record_buffer=32M
max_connections=512
wait_timeout=120
interactive_timeout=120
max_connect_errors=30000
long_query_time=1
max_heap_table_size=256M
tmp_table_size=128M
thread_concurrency=8
myisam_sort_buffer_size=128M
你可以根據“show status”命令返回的狀態進行微調。我主要注意以下變量的數值,越小越好,最好爲零:)
Created_tmp_disk_tables
Created_tmp_tables
Created_tmp_files
Slow_queries
在啓動腳本中使用“--log-slow-queries=/home/logs/mysql_slow.log”參數,以便進行 SQL
語句的優化工作,這個其實是很很重要的工作。記得一定要在 my.cnf 中設置“long_query_time=1”才行。
Nginx+Apache+Mysql+Php+eaccelerator+Zend構建高性能的WEB服務器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
sql語法、關係建模
死瘦宅
2019-02-24 22:35:22
MySQL 事務、函數、觸發器、數據庫備份、權限管理
死瘦宅
2019-02-24 22:35:12
MySQL数据库集群-PXC方案
wy53780
2020-04-23 13:55:07
《從0到1學習Flink》—— Flink 讀取 Kafka 數據批量寫入到 MySQL
zhisheng
2019-02-24 21:04:11
SpringBoot 填坑 (一) | CentOS7.4 環境下,表時間字段默認值設置失效
一個優秀的廢人
2019-02-24 15:33:55
mysql-存儲過程
雙子城
2019-02-24 13:43:57
jmeter學習指南之操作 mysql 數據庫
小強測試
2019-02-24 13:34:06
20190222全天的實驗
清歡難尋
2019-02-24 13:17:21
MongoDB索引優化詳解
geekpy
2019-02-24 14:20:06
Sql server中一些Select檢索高級用法
wbzjacky
2019-02-24 13:12:37
Linux基本操作命令
wbzjacky
2019-02-24 13:12:38
真實的模擬***綜合實驗
wbzjacky
2019-02-24 13:12:37
三層交換機的HSRP、vlan、端口聚合
wbzjacky
2019-02-24 13:12:37