容器技术交流

 找回密码
 立即注册
查看: 13132|回复: 2

搭建前后端web生产环境Linux+Apache+Nginx+MySQL+PHP

[复制链接]
发表于 2012-3-3 16:24:47 | 显示全部楼层 |阅读模式
本帖最后由 大鸟 于 2012-3-3 16:31 编辑
  1. 为什么不使用nginx+php(fastcgi)作为生产环境?
  2. php(fastcgi)不够稳定,容易出现50x错误,在生成相对复杂的页面时没有优势,长时间占用也会使php-cgi进程死去.
  3. 在安全性,多用户多站点的权限问题比较严重.php(fastcgi)在应对多用户多站点往往捉襟见肘,不易于实施.
  4. 整合其他语言,apache表现得游刃有余.资源利用恰到好处.
  5. 为什么采用nginx做前端,apache作为后端的方案?nginx在处理静态内容上较apache是几倍或几十倍的差异,因而放在前面过滤静态内容是最为恰当的.同时nginx也是一个负载均衡器,低资源消耗,高性能转发是它的特点.经过nginx在前面的过滤,后端的apache需要处理的内容相对就比较少了.只需负责处理动态内容就可以了.在性能与稳定性的权衡下,使用nginx+apache搭配会让它们在各自擅长的领域展现自身的价值.
复制代码
谈到Linux下的web生产环境,大家就会想到apache这个开源服务器软件.apache可以整合大多数应用,比如jsp,php,cgi,python等等,但是apache过于臃肿以及对静态文件响应过于缓慢让很多使用者感到头疼.而nginx作为新崛起的服务器软件,在很多方面超出apache,定位也很明确:高性能的 HTTP 和反向代理服务器.因而,本篇主要讲的是nginx作为前端,apache作为后端的应用环境搭建过程.

本教程以CentOS 5.4 32bit为环境.理论上适合其他Linux发行版本请自行测试.nginx,php,apache,mysql,pureftpd均为最新稳定版.

获取操作系统源更新.
yum update
yum -y install gcc gcc-c++ bison patch unzip mlocate flex wget automake autoconf gd cpp gettext readline-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel libidn libidn-devel openldap openldap-devel openldap-clients openldap-servers nss_ldap expat-devel libtool libtool-ltdl-devel

如果系统默认安装了apache,请先卸载.执行:
yum remove httpd
下载最新稳定版的程序源码包,以下都是到官方网站或sourceforge下载的源码包


(64位用户或部分连接失效请谷歌自行搜索适合的包!).






cd /usr/local/src
  1. wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.45.tar.gz/from/http://mysql.he.net/
  2. wget http://www.apache.org/dist/httpd/httpd-2.2.15.tar.gz
  3. wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
  4. wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
  5. wget http://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.bz2/download
  6. wget http://sourceforge.net/projects/mcrypt/files/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz/download
  7. wget http://sourceforge.net/projects/mhash/files/mhash/0.9.9.9/mhash-0.9.9.9.tar.bz2/download
  8. wget http://www.php.net/get/php-5.2.13.tar.gz/from/this/mirror
  9. wget http://www.lancs.ac.uk/~steveb/patches/php-mail-header-patch/php5-mail-header.patch
  10. wget http://pecl.php.net/get/memcache-2.2.5.tgz
  11. wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2
  12. wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz
  13. wget http://pecl.php.net/get/imagick-2.3.0.tgz
  14. wget http://download.suhosin.org/suhosin-0.9.29.tgz
  15. wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz
  16. wget http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
  17. wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz
  18. wget http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz
  19. wget http://sourceforge.net/projects/pcre/files/pcre/8.01/pcre-8.01.tar.gz/download
  20. wget http://nginx.org/download/nginx-0.7.65.tar.gz
  21. wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.28.tar.gz
复制代码



一.安装Mysql.安装最新稳定版5.1.45版本,并没有采用最新开发版.
groupadd mysql -g 27
useradd mysql -u 27 -g 27 -c "MySQL Server" -d /var/lib/mysql -m
cd /usr/local/src
tar -zxf mysql-5.1.45.tar.gz
cd mysql-5.1.45
./configure --prefix=/usr/local/mysql --localstatedir=/var/lib/mysql --with-unix-socket-path=/var/lib/mysql/mysql.sock --with-mysqld-user=mysql --enable-assembler --enable-thread-safe-client --with-extra-charsets=all --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile --with-plugins=partition,innodb_plugin,myisam,myisammrg
make && make install
cd ../
cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
/usr/local/mysql/bin/mysql_install_db --user=mysql
chown -R mysql.mysql /var/lib/mysql
chgrp -R mysql /usr/local/mysql/.
cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysql
chmod u+x /etc/init.d/mysql
chkconfig --level 345 mysql on
echo "/usr/local/mysql/lib/mysql" >> /etc/ld.so.conf
echo "/usr/local/lib" >>/etc/ld.so.conf
ldconfig
ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
ln -s /usr/local/mysql/include/mysql /usr/include/mysql
ln -s /usr/local/mysql/bin/mysql_config /usr/bin/mysql_config
service mysql start
/usr/local/mysql/bin/mysqladmin -u root password root
service mysql restart
service mysql stop
二.编译安装apache(httpd).apache的执行用户为nobody.
cd /usr/local/src
tar -zxf httpd-2.2.15.tar.gz
cd httpd-2.2.15
./configure --prefix=/usr/local/apache --enable-headers --enable-mime-magic --enable-proxy --enable-rewrite --enable-ssl --enable-suexec  --disable-userdir --with-included-apr --with-mpm=prefork --with-ssl=/usr --with-suexec-caller=nobody --with-suexec-docroot=/ --with-suexec-gidmin=100 --with-suexec-logfile=/usr/local/apache/logs/suexec_log --with-suexec-uidmin=100 --with-suexec-userdir=public_html
make
make install
mkdir /usr/local/apache/domlogs
cp /usr/local/apache/bin/apachectl /etc/init.d/httpd
1.编辑/etc/init.d/httpd,在首行#!/bin/sh下添加:
# Startup script for the Apache Web Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#              HTML files and CGI.
# processname: httpd
# pidfile: /usr/local/apache/logs/httpd.pid
# config: /usr/local/apache/conf/httpd.conf
ulimit -n 1024
ulimit -n 4096
ulimit -n 8192
ulimit -n 16384
ulimit -n 32768
保存退出.




 楼主| 发表于 2012-3-3 16:29:47 | 显示全部楼层
2.安装nginx
cd /usr/local/src
tar -zxf nginx-0.7.65.tar.gz
cd nginx-0.7.65
./configure --user=nobody --group=nobody --prefix=/usr/local/nginx --pid-path=/usr/local/nginx/logs/nginx.pid --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --http-client-body-temp-path=/tmp/nginx_client --http-proxy-temp-path=/tmp/nginx_proxy --http-fastcgi-temp-path=/tmp/nginx_fastcgi --with-http_stub_status_module
make
make install
2.1.添加init控制脚本
#! /bin/sh
ulimit -n 65535
# Description: Startup script for nginx
# chkconfig: 2345 55 25
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
CONFIGFILE=/usr/local/nginx/conf/nginx.conf
PIDFILE=/usr/local/nginx/logs/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0
do_start() {
$DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}
do_stop() {
kill -INT `cat $PIDFILE` || echo -n "nginx not running"
}
waitforexit() {
count=${2:-30}
while [ 0$count -gt 0 ]
do
   PIDS=`ps -C$NAME --no-heading e | grep $DAEMON` || break
   PIDS=`echo "$PIDS" | awk '{print $1}' | tr '\n' ' '`
   echo Remaining processes: $PIDS
   do_stop
   sleep 2
   count=`expr $count - 1`
done
if [ 0$count -eq 0 ];
then
   echo Remaining processes: $PIDS
   return 1
fi
return 0
}
do_reload() {
kill -HUP `cat $PIDFILE` || echo -n "nginx can't reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
do_start
echo "."
/etc/init.d/httpd start
;;
stop)
echo -n "Stopping $DESC: $NAME"
do_stop
echo "."
/etc/init.d/httpd stop
;;
reload)
echo -n "Reloading $DESC configuration..."
do_reload
echo "."
/etc/init.d/httpd restart
;;
restart)
echo -n "Restarting $DESC: $NAME"
waitforexit "nginx" 20
do_start
echo "."
/etc/init.d/httpd restart
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
exit 3
;;
esac
exit 0保存退出,给该文件赋予执行权限并设置开机启动
chmod 755 /etc/init.d/nginx
chkconfig --level 345 nginx on
2.2.修改nginx配置文件,位于:/usr/local/nginx/conf/目录
mkdir -p /var/cache/nginx/cached
chmod 600 /var/cache/nginx/cached
cd /usr/local/nginx/conf/
mv nginx.conf nginx.conf.bak
mkdir vhosts
vi nginx.conf
输入以下内容:
worker_processes  2;
worker_rlimit_nofile  20480;
events {
worker_connections  20480;
use epoll;
}
error_log  /usr/local/nginx/logs/error.log info;
http {
server_name_in_redirect off;
server_names_hash_max_size 2048;
server_names_hash_bucket_size 256;
include    mime.types;
default_type  application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout  60;
gzip on;
gzip_http_version 1.0;
gzip_min_length  1100;
gzip_comp_level  3;
gzip_buffers  4 32k;
# gzip_types    text/plain application/x-javascript text/xml text/css;
gzip_types    text/plain text/xml text/css application/x-javascript application/xml application/xml+rss text/javascript application/atom+xml;
ignore_invalid_headers on;
client_header_timeout  300;
client_body_timeout 300;
send_timeout     30;
reset_timedout_connection on;
connection_pool_size  256;
client_header_buffer_size 256k;
large_client_header_buffers 4 256k;
request_pool_size  32k;
output_buffers   4 32k;
postpone_output  1460;
proxy_cache_path  /var/cache/nginx/cached levels=2:2 keys_zone=global:100m inactive=60m max_size=500m;
proxy_temp_path  /tmp/nginx_proxy;
include "/usr/local/nginx/conf/vhosts/*.conf";
}保存退出.
五.为apache安装rpaf模块,该模块用于apache做后端时获取访客真实的IP.
1.使用apxs安装模块.这里要使用此前apache编译安装后的apxs
cd /usr/local/src/
tar -zxf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
/usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
 楼主| 发表于 2012-3-3 16:30:58 | 显示全部楼层
2.编辑/usr/local/apache/conftpd.conf,添加模块参数,查找LoadModule php5_module modulesbphp5.so,在下方添加:
LoadModule rpaf_module modules/mod_rpaf-2.0.so
#Mod_rpaf settings
RPAFenable On
RPAFproxy_ips 127.0.0.1 [your_ips]
RPAFsethostname On
RPAFheader X-Forwarded-For
上面出现的[your_ips]请修改为你本机所**web服务的ip.多个IP用空格空开.
六.安装ftp服务器:pure-ftpd
1.编译安装
cd /usr/local/src/
tar -zxf pure-ftpd-1.0.28.tar.gz
cd pure-ftpd-1.0.28
./configure --prefix=/usr/local/pureftpd --with-language=simplified-chinese --with-everything
make
make install
chmod 755 configuration-file/pure-config.pl
cp configuration-file/pure-config.pl /usr/local/pureftpd/sbin/
mkdir /usr/local/pureftpd/etc/
cp configuration-file/pure-ftpd.conf /usr/local/pureftpd/etc/
ln -s /usr/local/pureftpd/bin/pure-pw /usr/local/bin/
2.配置pure-ftpd,这里采用PureDB的验证方式.
vi /usr/local/pureftpd/etc/pure-ftpd.conf
查找 PureDB /etc/pureftpd.pdb 取消前面的#号并设置成PureDB/usr/local/pureftpd/etc/pureftpd.pdb
查找 PassivePortRange 取消前面的#号
其他参数根据需要进行修改
3.添加自启动.这里不创建init脚本.直接放在/etc/rc.local启动即可
echo "/usr/local/pureftpd/sbin/pure-config.pl /usr/local/pureftpd/etc/pure-ftpd.conf --daemonize" >> /etc/rc.local
至此.所有安装工作结束.
如何使用这套系统
一,做好必要的安全工作
设置用户家目录/home/user,相关配置参数文件,以及访问日志等目录的权限.
chmod 711 /home
chmod 711 /usr/local/pureftpd/etc
chmod 711 /usr/local/apache/confhosts
chmod 711 /usr/localinx/confhosts
chmod 711 /usr/local/apache/domlogs
chmod 711 /usr/local/apache/logs
chmod 600 ar/cacheinx/cached
二,如何创建用户
创建用户分两个步骤.第一步创建系统用户.该命令直接创建用户家目录.第二步创建ftp用户.创建该用户依赖系统用户的创建.步骤如下(以创建用户名为admin为例):
useradd admin -m -s /sbinlogin
pure-pw useradd admin -u admin -g admin -d /home/admin -m[第一次执行不可用]
pure-pw mkdb[仅限第一次执行]
注意.通过上述方法安装的ftp服务器在第一次创建用户的时候不可以在pure-pw useradd ...后直接添加参数-m更新ftp用户数据库.需要分两步执行.以后可以直接在创建用户时在后面添加参数-m,执行之后会提示让你输入密码.需要重复输入两次.
三.如何绑定域名
由于采用前后端操作.因此需要修改两个服务器软件的虚拟主机参数.实例如下(以admin.com为例,用户目录承接上文的/home/admin):
1.创建nginx虚拟主机参数
首先先把公共cache参数和proxy参数写进文件中
cd /usr/localinx/conf
touch cache.inc proxy.inc
然后分别编辑者两个文件。
vi cache.inc
proxy_cache       global;
proxy_cache_key   $host$uri$is_args$args;
#proxy_cache_valid 200 302 10m;
#proxy_cache_valid 301 1h;
#proxy_cache_valid any 1m;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
proxy_temp_file_write_size 64k;
proxy_max_temp_file_size   56m;
vi proxy.inc
proxy_connect_timeout 30s;
proxy_send_timeout   300;
proxy_read_timeout   300;
proxy_buffer_size    64k;
proxy_buffers     16 32k;
proxy_busy_buffers_size 64k;
#proxy_pass http://127.0.0.1:81;
proxy_redirect  off;
proxy_hide_header  Vary;
proxy_set_header   Host   $host;
proxy_set_header   X-Real-IP  $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
然后再编辑虚拟主机文件就会很清晰了
cd /usr/localinx/confhosts
touch admin.com.conf
vi admin.com.conf
输入以下内容:
server {
error_log ar/loginxhost-error_log warn;
listen 127.0.0.1:80;
server_name admin.com www.admin.com;
access_log /usr/local/apache/domlogs/admin.com combined;
location / {
root /home/admin/public_html;
proxy_cache_valid 200 301 302 10m;
proxy_cache_valid any 1m;
expires 1d;
proxy_pass http://127.0.0.1:81;
include proxy.inc;
include cache.inc;
}
location ~ .*\.(jpg|jpeg|png|gif|bmp|ico|js|css|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
proxy_cache_valid  200 10s;
expires 7d;
proxy_pass http://127.0.0.1:81;
include proxy.inc;
include cache.inc;
}
location ~ .*\.(php|jsp|cgi)?$ {
proxy_pass http://127.0.0.1:81;
include proxy.inc;
}
location ~ /\.ht {
deny all;
}
}保存退出,注意将上述出现的127.0.0.1替换本机**web服务的IP
2.创建apache虚拟主机配置文件
cd /usr/local/apache/confhosts
touch admin.com.conf
vi admin.com.conf
输入以下内容:
<VirtualHost 127.0.0.1:81>
ServerName admin.com
ServerAlias www.admin.com
DocumentRoot /home/admin/public_html
ServerAdmin admin@evlit.com
UseCanonicalName Off
php_admin_value open_basedir "/home/admin:/usrb/php:/usr/localb/php:/tmp"
<IfModule !mod_disable_suexec.c>
SuexecUserGroup admin admin
</IfModule>
ScriptAlias /cgi-bin/ /home/admin/public_html/cgi-bin/
</VirtualHost>保存退出,注意将上述出现的127.0.0.1替换本机**web服务的IP,用户名admin改为虚拟主机用户的名称.
四.如何管理MySQL数据库
1.下载最新版PhpMyAdmin源码包
mkdir -p ar/wwwml
chmod -R 711 ar/www
cd ar/wwwml
wget http://sourceforge.net/projects/ ... guages.zip/download
unzip phpMyAdmin-3.3.3-all-languages.zip
mv phpMyAdmin-3.3.3-all-languages phpmyadmin
2.增加apache配置,编辑httpd.conf,转到最后一行
cd /usr/local/apache/conf
vi httpd.conf /* shift+g转到最后一行 */
#Managed Tools
<VirtualHost 127.0.0.1:81 *>
ServerName localhost
ServerAlias pma.*
DocumentRoot ar/wwwml/phpmyadmin
ServerAdmin admin@localhost
UseCanonicalName Off
</VirtualHost>
同样,修改上述出现的127.0.0.1为你提供web服务的IP.重启apache后.我们打开绑定到服务器IP的pma.yourdomain.com即可访问到phpmyadmin.第一次使用.需要进行配置.具体配置请善用Google.
其他没有照顾到的地方自行添加即可.如perl,sendmail等.


原文出处:http://jafy00.blog.51cto.com/2594646/531137
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Archiver|URLOS ( 粤ICP备18087780号 )

GMT+8, 2025-7-5 14:47 , Processed in 0.026996 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表