小白鬚要的LNMP搭建教程

本文是本人在搭建阿里雲的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!

若有疑問,歡迎各位大佬指點、批評。

相關文章
相關標籤/搜索