本文是本人在搭建阿里云的ECS服务器环境的时候,结合阿里云提供的文档和本身编译安装过程当中的各类ERROR得来。php
适用对象html
适用于熟悉Linux操做系统,刚开始使用阿里云进行建站的我的用户。mysql
基本流程linux
使用云服务器 ECS 搭建LNMP平台的操做步骤以下:nginx
1.准备编译环境
2.安装nginx
3.安装mysql
4.安装php-fpm
5.测试访问c++
步骤一:准备编译环境web
本文主要说明手动安装LNMP平台的操做步骤,您也能够在云市场购买LNMP镜像直接启动ECS,以便快速建站。sql
一、系统版本说明数据库
1.# cat /etc/redhat-release 2.CentOS release 6.5 (Final)
注:这是本文档实施时参考的系统版本。您的实际使用版本可能与此不一样,下文中的nginx,mysql,及php版本,您也能够根据实际状况选择相应版本。
二、关闭SELINUXbootstrap
修改配置文件,重启服务后永久生效。
# sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
命令行设置当即生效。
# setenforce 0
三、安全组设置
在ECS安全组放行需访问的端口和访问白名单,下面的示例表示容许全部IP访问服务器的80端口。您能够根据实际状况放行容许访问的客户端IP。
步骤二:安装nginx
Nginx是一个小巧而高效的Linux下的Web服务器软件,是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,已经在一些俄罗斯的大型网站上运行多年,目前不少国内外的门户网站、行业网站也都在是使用Nginx,至关稳定。
一、添加运行nginx服务进程的用户
1.# groupadd -r nginx 2.# useradd -r -g nginx nginx
二、下载源码包解压编译。
# wget http://nginx.org/download/nginx-1.10.2.tar.gz # tar xvf nginx-1.10.2.tar.gz -C /usr/local/src # yum groupinstall "Development tools" # yum -y install gcc wget gcc-c++ automake autoconf libtool libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed pcre-devel openssl-devel # cd /usr/local/src/nginx-1.10.2 # ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/run/nginx.lock \ --http-client-body-temp-path=/var/tmp/nginx/client \ --http-proxy-temp-path=/var/tmp/nginx/proxy \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi \ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ --http-scgi-temp-path=/var/tmp/nginx/scgi \ --user=nginx \ --group=nginx \ --with-pcre \ --with-http_v2_module \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-http_auth_request_module \ --with-mail \ --with-mail_ssl_module \ --with-file-aio \ --with-ipv6 \ --with-threads \ --with-stream \ --with-stream_ssl_module # make && make install # mkdir -pv /var/tmp/nginx/client
三、添加SysV启动脚本。
# vim /etc/init.d/nginx #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/etc/nginx/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval killall -9 nginx } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac
四、赋予脚本执行权限。
# chmod +x /etc/init.d/nginx
五、添加至服务管理列表,设置开机自启。
# chkconfig --add nginx # chkconfig nginx on
六、启动服务。
# service nginx start
七、浏览器访问可看到默认欢迎页面。
步骤三:安装mysql
一、准备编译环境。
# yum groupinstall "Server Platform Development" "Development tools" -y # yum install cmake -y
二、准备mysql数据存放目录。
# mkdir /mnt/data # groupadd -r mysql # useradd -r -g mysql -s /sbin/nologin mysql # id mysql uid=497(mysql) gid=498(mysql) groups=498(mysql)
三、更改数据目录属主属组。
# chown -R mysql:mysql /mnt/data
四、解压编译在MySQL官网下载的稳定版源码包,这里使用的是5.6.24版本
# tar xvf mysql-5.6.24.tar.gz -C /usr/local/src # cd /usr/local/src/mysql-5.6.24 # cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/mnt/data \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DMYSQL_TCP_PORT=3306 \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci
若出现以下错误:
CMake Error at cmake/ssl.cmake:247 (MESSAGE): Cannot find appropriate system libraries for SSL. Make sure you've specified a supported SSL version. Consult the documentation for WITH_SSL alternatives Call Stack (most recent call first): CMakeLists.txt:446 (MYSQL_CHECK_SSL) -- Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH) CMake Error at cmake/readline.cmake:85 (MESSAGE): Curses library not found. Please install appropriate package, remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel. Call Stack (most recent call first): cmake/readline.cmake:128 (FIND_CURSES) cmake/readline.cmake:218 (MYSQL_USE_BUNDLED_EDITLINE) CMakeLists.txt:448 (MYSQL_CHECK_EDITLINE) -- Configuring incomplete, errors occurred! See also "/usr/local/src/mysql-5.6.38/CMakeFiles/CMakeOutput.log". See also "/usr/local/src/mysql-5.6.38/CMakeFiles/CMakeError.log".
执行此操做:
rm CMakeCache.txt yum install ncurses-devel
接着:
# make && make install
五、修改安装目录的属组为mysql。
# chown -R mysql:mysql /usr/local/mysql/
六、初始化数据库。
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mnt/data/
注:在CentOS 6.5版操做系统的最小安装完成后,在/etc目录下会存在一个my.cnf,须要将此文件改名为其余的名字,如:/etc/my.cnf.bak,不然,该文件会干扰源码安装的MySQL的正确配置,形成没法启动。
七、拷贝配置文件和启动脚本。
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld # chmod +x /etc/init.d/mysqld # cp support-files/my-default.cnf /etc/my.cnf
八、设置开机自动启动。
# chkconfig mysqld on # chkconfig --add mysqld
九、修改配置文件中的安装路径及数据目录存放路径。
# echo -e "basedir = /usr/local/mysql\ndatadir = /mnt/data\n" >> /etc/my.cnf
十、设置PATH环境变量。
# echo "export PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh # source /etc/profile.d/mysql.sh
十一、启动服务。
# service mysqld start
若出现以下错误:
Starting MySQL.Logging to '/mnt/data/localhost.localdomain.err'. The server quit without updating PID file (/mnt/data/localh[FAILED]ldomain.pid). [root@localhost mysql]# service mysqld start Starting MySQL.The server quit without updating PID file (/mnt/data/localhost.localdomain.pid). [FAILED]
若从新初始化会遇到这种问题:
[root@localhost scripts]# ./mysql_install_db --user=mysql --datadir=/mnt/data/ FATAL ERROR: Could not find ./bin/my_print_defaults If you compiled from source, you need to run 'make install' to copy the software into the correct location ready for operation. If you are using a binary release, you must either be at the top level of the extracted archive, or pass the --basedir option pointing to that location.
而后咱们接着往下走:
[root@localhost scripts]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/mnt/data & [1] 16068 [root@localhost scripts]# Installing MySQL system tables...2017-12-01 01:23:46 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2017-12-01 01:23:46 0 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap. 2017-12-01 01:23:46 0 [Note] /usr/local/mysql/bin/mysqld (mysqld 5.6.38) starting as process 16077 ... 2017-12-01 01:23:46 16077 [Note] InnoDB: Using atomics to ref count buffer pool pages 2017-12-01 01:23:46 16077 [Note] InnoDB: The InnoDB memory heap is disabled 2017-12-01 01:23:46 16077 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2017-12-01 01:23:46 16077 [Note] InnoDB: Memory barrier is not used 2017-12-01 01:23:46 16077 [Note] InnoDB: Compressed tables use zlib 1.2.7 2017-12-01 01:23:46 16077 [Note] InnoDB: Using CPU crc32 instructions 2017-12-01 01:23:46 16077 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2017-12-01 01:23:46 16077 [Note] InnoDB: Completed initialization of buffer pool 2017-12-01 01:23:46 16077 [Note] InnoDB: The first specified data file ./ibdata1 did not exist: a new database to be created! 2017-12-01 01:23:46 16077 [Note] InnoDB: Setting file ./ibdata1 size to 12 MB 2017-12-01 01:23:46 16077 [Note] InnoDB: Database physically writes the file full: wait... 2017-12-01 01:23:46 16077 [Note] InnoDB: Setting log file ./ib_logfile101 size to 48 MB 2017-12-01 01:23:46 16077 [Note] InnoDB: Setting log file ./ib_logfile1 size to 48 MB 2017-12-01 01:23:46 16077 [Note] InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0 2017-12-01 01:23:46 16077 [Warning] InnoDB: New log files created, LSN=45781 2017-12-01 01:23:46 16077 [Note] InnoDB: Doublewrite buffer not found: creating new 2017-12-01 01:23:46 16077 [Note] InnoDB: Doublewrite buffer created 2017-12-01 01:23:46 16077 [Note] InnoDB: 128 rollback segment(s) are active. 2017-12-01 01:23:46 16077 [Warning] InnoDB: Creating foreign key constraint system tables. 2017-12-01 01:23:46 16077 [Note] InnoDB: Foreign key constraint system tables created 2017-12-01 01:23:46 16077 [Note] InnoDB: Creating tablespace and datafile system tables. 2017-12-01 01:23:46 16077 [Note] InnoDB: Tablespace and datafile system tables created. 2017-12-01 01:23:46 16077 [Note] InnoDB: Waiting for purge to start 2017-12-01 01:23:46 16077 [Note] InnoDB: 5.6.38 started; log sequence number 0 2017-12-01 01:23:46 16077 [Note] RSA private key file not found: /mnt/data//private_key.pem. Some authentication plugins will not work. 2017-12-01 01:23:46 16077 [Note] RSA public key file not found: /mnt/data//public_key.pem. Some authentication plugins will not work. 2017-12-01 01:23:47 16077 [Note] Binlog end 2017-12-01 01:23:47 16077 [Note] InnoDB: FTS optimize thread exiting. 2017-12-01 01:23:47 16077 [Note] InnoDB: Starting shutdown... 2017-12-01 01:23:48 16077 [Note] InnoDB: Shutdown completed; log sequence number 1625977 OK Filling help tables...2017-12-01 01:23:48 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2017-12-01 01:23:48 0 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap. 2017-12-01 01:23:48 0 [Note] /usr/local/mysql/bin/mysqld (mysqld 5.6.38) starting as process 16099 ... 2017-12-01 01:23:48 16099 [Note] InnoDB: Using atomics to ref count buffer pool pages 2017-12-01 01:23:48 16099 [Note] InnoDB: The InnoDB memory heap is disabled 2017-12-01 01:23:48 16099 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2017-12-01 01:23:48 16099 [Note] InnoDB: Memory barrier is not used 2017-12-01 01:23:48 16099 [Note] InnoDB: Compressed tables use zlib 1.2.7 2017-12-01 01:23:48 16099 [Note] InnoDB: Using CPU crc32 instructions 2017-12-01 01:23:48 16099 [Note] InnoDB: Initializing buffer pool, size = 128.0M 2017-12-01 01:23:48 16099 [Note] InnoDB: Completed initialization of buffer pool 2017-12-01 01:23:48 16099 [Note] InnoDB: Highest supported file format is Barracuda. 2017-12-01 01:23:48 16099 [Note] InnoDB: 128 rollback segment(s) are active. 2017-12-01 01:23:48 16099 [Note] InnoDB: Waiting for purge to start 2017-12-01 01:23:48 16099 [Note] InnoDB: 5.6.38 started; log sequence number 1625977 2017-12-01 01:23:48 16099 [Note] RSA private key file not found: /mnt/data//private_key.pem. Some authentication plugins will not work. 2017-12-01 01:23:48 16099 [Note] RSA public key file not found: /mnt/data//public_key.pem. Some authentication plugins will not work. 2017-12-01 01:23:48 16099 [Note] Binlog end 2017-12-01 01:23:48 16099 [Note] InnoDB: FTS optimize thread exiting. 2017-12-01 01:23:48 16099 [Note] InnoDB: Starting shutdown... 2017-12-01 01:23:49 16099 [Note] InnoDB: Shutdown completed; log sequence number 1625987 OK To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: /usr/local/mysql/bin/mysqladmin -u root password 'new-password' /usr/local/mysql/bin/mysqladmin -u root -h localhost.localdomain password 'new-password' Alternatively you can run: /usr/local/mysql/bin/mysql_secure_installation which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. See the manual for more instructions. You can start the MySQL daemon with: cd . ; /usr/local/mysql/bin/mysqld_safe & You can test the MySQL daemon with mysql-test-run.pl cd mysql-test ; perl mysql-test-run.pl Please report any problems at http://bugs.mysql.com/ The latest information about MySQL is available on the web at http://www.mysql.com Support MySQL by buying support/licenses at http://shop.mysql.com New default config file was created as /usr/local/mysql/my.cnf and will be used by default by the server when you start it. You may edit this file to change server settings WARNING: Default config file /etc/my.cnf exists on the system This file will be read by default by the MySQL server If you do not want to use this, either remove it, or use the --defaults-file argument to mysqld_safe when starting the server [1]+ 完成 /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/mnt/data
查看如下mysql的状态:
[root@localhost scripts]# service mysqld status MySQL is not running, but lock file (/var/lock/subsys/mysql[FAILED]
启动与重启均没问题:
[root@localhost scripts]# service mysqld start Starting MySQL.Logging to '/mnt/data/localhost.localdomain.err'. [ OK ] [root@localhost scripts]# service mysqld restart Shutting down MySQL. [ OK ] Starting MySQL. [ OK ]
登录:
# mysql -h 127.0.0.1
步骤四:安装php-fpm
Nginx自己不能处理PHP,做为web服务器,当它接收到请求后,不支持对外部程序的直接调用或者解析,必须经过FastCGI进行调用。若是是PHP请求,则交给PHP解释器处理,并把结果返回给客户端。PHP-FPM是支持解析php的一个FastCGI进程管理器。提供了更好管理PHP进程的方式,能够有效控制内存和进程、能够平滑重载PHP配置。
一、安装依赖包。
yum install libmcrypt libmcrypt-devel mhash mhash-devel libxml2 libxml2-devel bzip2 bzip2-devel
二、解压官网下载的源码包,编译安装。
# tar xvf php-5.6.23.tar.bz2 -C /usr/local/src # cd /usr/local/src/php-5.6.23 # ./configure --prefix=/usr/local/php \ --with-config-file-scan-dir=/etc/php.d \ --with-config-file-path=/etc \ --with-mysql=/usr/local/mysql \ --with-mysqli=/usr/local/mysql/bin/mysql_config \ --enable-mbstring \ --with-freetype-dir \ --with-jpeg-dir \ --with-png-dir \ --with-zlib \ --with-libxml-dir=/usr \ --with-openssl \ --enable-xml \ --enable-sockets \ --enable-fpm \ --with-mcrypt \ --with-bz2 \ --with-curl # make && make install
三、添加php和php-fpm配置文件。
# cp /usr/local/src/php-5.6.23/php.ini-production /etc/php.ini # cd /usr/local/php/etc/ # cp php-fpm.conf.default php-fpm.conf # sed -i 's@;pid = run/php-fpm.pid@pid = /usr/local/php/var/run/php-fpm.pid@' php-fpm.conf
四、添加php-fpm启动脚本。
# cp /usr/local/src/php-5.6.23/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm # chmod +x /etc/init.d/php-fpm
五、添加php-fpm至服务列表并设置开机自启。
# chkconfig --add php-fpm # chkconfig --list php-fpm # chkconfig php-fpm on
六、启动服务。
# service php-fpm start
若出现以下状况:
[root@localhost etc]# service php-fpm start Starting php-fpm [01-Dec-2017 02:31:24] WARNING: Nothing matches the include pattern '/usr/local/php/etc/php-fpm.d/*.conf' from /usr/local/php/etc/php-fpm.conf at line 125. [01-Dec-2017 02:31:24] ERROR: No pool defined. at least one pool section must be specified in config file [01-Dec-2017 02:31:24] ERROR: failed to post process the configuration [01-Dec-2017 02:31:24] ERROR: FPM initialization failed failed
执行此操做:
[root@localhost etc]# cd php-fpm.d/ [root@localhost php-fpm.d]# ll 总用量 20 -rw-r--r-- 1 root root 18517 12月 1 02:27 www.conf.default [root@localhost php-fpm.d]# cp www.conf.default www.conf [root@localhost php-fpm.d]# service php-fpm start Starting php-fpm done [root@localhost php-fpm.d]#
七、添加nginx对fastcgi的支持,首先备份默认的配置文件。
# cp /etc/nginx/nginx.conf /etc/nginx/nginx.confbak # cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf
编辑/etc/nginx/nginx.conf,在所支持的主页面格式中添加php格式的主页,相似以下:
location / { root /usr/local/nginx/html; index index.php index.html index.htm; }
取消如下内容前面的注释:
location ~ \.php$ { root /usr/local/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name; include fastcgi_params; }
从新载入nginx的配置文件。
# service nginx reload
在/usr/local/nginx/html/新建index.php的测试页面,内容以下。
# cat index.php php $conn=mysql_connect('127.0.0.1','root',''); if ($conn){ echo "LNMP platform connect to mysql is successful!"; }else{ echo "LNMP platform connect to mysql is failed!"; } phpinfo(); ?>
浏览器访问测试,如看到如下内容则表示LNMP平台构建完成。
Done!
若有疑问,欢迎各位大佬指点、批评。