從零搭建LNMP環境


  • Linux就是環境所在的操作系統;
  • Nginx則是一個「高性能的HTTP和反向代理服務器」,官網地址:http://nginx.org/
  • MySQL則是一個方便地對數據進行增刪改查的數據庫管理系統,官網地址:http://www.mysql.com/
  • PHP則是用來處理具體請求的腳本語言,官網地址:http://www.php.net/

運用這4件工具,最簡單直接的一個用途就是搭建一個網站,例如現在我的個人網站就是在「LNMP」上面跑的

其實在Nginx開始受到關注之前,「LAMP」是搭建網站比較流行的選擇,即LinuxApacheMySQLPHP

這里我們使用的不是LNMP的一鍵安裝包,而是難度稍微高「一點」的逐個安裝,這樣做或許能讓你對這個環境的細節有更好的理解,而且對各部分的定制程度可以達到最高。

  1. 要安裝什么程序?——PHP,NGINX,MYSQL;
  2. 安裝的這個程序,在編譯時需要哪些擴展或者哪些庫?(例如PHP安裝OpenSSL,NGINX安裝openssl);
  3. 下載這些擴展和庫,下載完壓縮包后解壓縮得到這些庫的代碼,或者進一步地編譯這些庫並安裝到一個指定的路徑下;
  4. 編譯程序,將需要的庫、擴展添加到編譯選項中,指定程序的安裝路徑;
  5. 安裝完成,測試。

因此下面的內容就是上面這5步的循環。那么,開始吧。

在開始前,先安裝一些通常來說應該已經有的組件,不過以防沒有可以檢查並安裝一下。對於使用CentOS的用戶在root權限下輸入命令:

yum -y install gcc automake autoconf libtool make gcc-c++ glibc

 安裝PHP

為了開啟PHP的一些功能(例如對png格式的支持等),首先需要安裝一些庫,CentOS命令如下:

yum -y install libmcrypt-devel mhash-devel libxslt-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 \
krb5 krb5-devel libidn libidn-devel openssl openssl-devel

#錯誤:

yum [Errno 256] No more mirrors to try 解決方法
  • 輸入下面的命令即可解決問題:
  • yum clean all

庫已經安裝好了,要注意的是在編譯PHP時可能會說缺少其中的幾個庫,到時候請各位在百度(或者谷歌)搜一下這個庫的官網,使用wget下載然后解壓然后安裝到你指定的一個目錄,最后在編譯PHP時指定這個庫安裝后的路徑即可。為了方便演示,接下來碰到這個問題時,我默認使用以下的幾個路徑:

所有下載的壓縮包放在「/home/download/」這個文件夾下;

所有的壓縮包解壓后的路徑也是「/home/download/」,即如果壓縮包名字是「openssl-1.0.1e.tar.gz」,那么解壓后「/home/download/」下會有一個名字為「openssl-1.0.1e」的文件夾;

所有的庫安裝路徑都是「/home/reetsee/environment/lib/」,指定安裝路徑的方法下面會有。

要注意的是:如果你也使用「/home/xxx/…」 這樣的格式,最好保證這個「xxx」不是用戶名,或者說「/home/xxx」不是用戶目錄。比較好的做法是你在/home下創建一個目錄並使用這個目 錄,例如在/home下使用mkdir xxx。具體原因會在Nginx的安裝部分會提到403 Forbidden的時候講解。

現在可以開始嘗試安裝PHP了,首先我下載了PHP 5.4.29,不下載最新版的原因是我擔心它和某些庫會有兼容性問題(但我沒有查證過這種問題是否存在)。在命令行下我先把當前目錄切換到「/home/download/」,然后輸入下面的命令進行下載:

 

wget http://cn2.php.net/get/php-5.4.29.tar.gz/from/this/mirror

 

下載后執行解壓操作,並切換到PHP的代碼目錄:

tar zxvf mirror
cd php-5.4.29

執行以下命令對PHP的安裝進行設置:

./configure --prefix=/home/reetsee/environment/php  --enable-fpm --with-mcrypt \
--enable-mbstring --disable-pdo --with-curl --disable-debug  --disable-rpath \
--enable-inline-optimization --with-bz2  --with-zlib --enable-sockets \
--enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex \
--with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli \
--with-gd --with-jpeg-dir --with-openssl

對上面的命令作一下簡單的說明:

    從總體來看就是設置安裝的PHP需要或不需要哪些功能,安裝目錄是什么, 需要哪些庫

    –prefix=/home/reetsee/environment/php :把PHP安裝在「/home/reetsee/environment/php」目錄下

    –enable-fpm :為了讓Nginx和PHP能夠互相「交談」,需要一個叫做FastCGI的工具,因此PHP需要使用PHP-FPM來管理FastCGI。

    –with-openssl :安裝OpenSSL庫

    其它的「–with-xxx」即需要xxx庫,「–enable-yyy」即開啟yyy的支持,「–disable-zzz」即禁用zzz。

在這一步,Ubuntu或者CentOS的用戶十有八九會出現類似 「configure: error: mcrypt.h not found. Please reinstall libmcrypt.」的問題,這是因為缺少了mcrypt這個庫(對於Ubuntu用戶缺少的可能是其它庫),那么接下來就把它下載並安裝。

下載並安裝缺失的庫——以mcrypt為例:

在搜索引擎得知mcrypt的官網,進入源碼下載的頁面,復制「libmcrypt-2.5.7.tar.gz」的下載地址,切換到目錄「/home/reetsee/download/」執行下載並安裝的操作:

wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gz
tar zxvf libmcrypt-2.5.7.tar.gz
cd libmcrypt-2.5.7
./configure --prefix=/home/reetsee/environment/lib/mcrypt
make && make install

這樣就把mcrypt安裝到「/home/reetsee/environment/lib/mcrypt」下了

在PHP的源碼目錄進行「./configure …」時,將原本的「–with-mcrypt」更改為「–with-mcrypt=/home/reetsee/environment/lib/mcrypt」,粗體部分就是你安裝mcrypt的目錄

———— mcrypt安裝結束 ————

回到PHP源碼的目錄重新configure,這次輸入的命令要將mcrypt的安裝路徑添加進去,具體命令變為:

 

./configure --prefix=/home/reetsee/environment/php  --enable-fpm --with-mcrypt=/home/reetsee/environment/lib/mcrypt \
--enable-mbstring --disable-pdo --with-curl --disable-debug  --disable-rpath \
--enable-inline-optimization --with-bz2  --with-zlib --enable-sockets \
--enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex \
--with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli \
--with-gd --with-jpeg-dir --with-openssl

 

最后配置成功會出現「Thank you for using PHP.」

 

+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE.  By continuing this installation |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+

Thank you for using PHP.

config.status: creating php5.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/fpm/php-fpm.conf
config.status: creating sapi/fpm/init.d.php-fpm
config.status: creating sapi/fpm/php-fpm.service
config.status: creating sapi/fpm/php-fpm.8
config.status: creating sapi/fpm/status.html
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands
View Code

 

如果你是用Ubuntu,會遇到很多編譯依賴問題,例如上面的mcrypt的缺失,可以參考這篇博客:http://www.cnblogs.com/alexqdh/archive/2012/11/20/2776017.html

配置完就輸入以下命令進行安裝:

make && make install

安裝需要一段時間,可以喝杯茶~

安裝完后還有一點收尾工作,首先是配置php-fpm,首先是切換到php的安裝目錄下的etc文件夾:

cd /home/reetsee/environment/php/etc/

然后執行下面的命令:

cp php-fpm.conf.default php-fpm.conf

再對php-fpm.conf的內容進行修改,將「user = nobody」,「group = nobody」分別改為「user = www-data」,「group = www-data」,即如下圖所示:

保存后需要保證名為「www-data」的用戶以及組存在,因此在命令行執行下列語句:

 

groupadd www-data
useradd -g www-data www-data

 

這樣PHP的安裝配置工作就大體完成了 😀

不放心的可以編寫一個簡單的php腳本來測試一下有沒有輸出:

<?php
/** /home/reetsee/tmp/phpinfo.php **/
echo phpinfo();
?>

然后執行:

/home/reetsee/environment/php/bin/php phpinfo.php

如果看到PHP有關的信息,起碼說明PHP本身的安裝成功了。

但是還有一些手尾要做:

  1. 創建php.ini文件,這個文件是對php一些運行選項進行配置的文件,非常重要,以后肯定會用到。官方文檔在這里:http://www.php.net/manual/zh/ini.php。方法是將PHP源碼目錄下的「php.ini-production」文件復制到PHP安裝目錄下的「lib/」文件夾,並且重命名為「php.ini」。在我的機器上,輸入命令「cp   /home/download/php-5.4.29/php.ini-production   /home/reetsee/environment/php/lib/php.ini」即可完成。
  2. 設置php-fpm.pid的路徑,這個文件記錄了php-fpm的進程id,以后你要重啟php-fpm時可以通過命令(假設你在PHP的安裝目錄下)「kill -USR2 `cat var/run/php-fpm.pid`」。注意那兩個引號是反引號「`」,不是單引號或者雙引號。具體的做法是編輯PHP安裝目錄下的「etc/php-fpm.conf」文件,找到「pid = 」這一行,將前面的分號「;」去掉。如下圖所示:

 

[global]
; Pid file
; Note: the default prefix is /home/reetsee/environment/php/var
; Default Value: none
;pid = run/php-fpm.pid

 

編輯后:

[global]
; Pid file
; Note: the default prefix is /home/reetsee/environment/php/var
; Default Value: none
pid = run/php-fpm.pid

至此就大功告成了。在下面安裝完Nginx后,會啟動php-fpm,到時候在PHP安裝目錄下就能看到 「var/run/php-fpm.pid」文件了。

安裝Nginx

安裝Nginx前也有一些庫需要下載,分別是pcre,zlib以及openssl 。這里要說明的是下載這3個庫的壓縮包后,對其進行解壓縮即可,無需安裝。openssl要下載是因為Nginx在安裝時需要的是openssl的源碼(與PHP的安裝不同)。

下載並解壓pcre:

  • http://download.csdn.net/download/cyuyan112233/7422611
  • tar zxvf pcre-8.34.tar.gz

下載並解壓zlib:

wget http://zlib.net/zlib-1.2.8.tar.gz
tar zxvf zlib-1.2.8.tar.gz

下載並解壓openssl:

wget http://www.openssl.org/source/openssl-1.0.1g.tar.gz
tar zxvf openssl-1.0.1g.tar.gz

好了,必要的庫已經下載好,現在就正式開始下載Nginx並安裝。首先下載Nginx並解壓縮:

wget http://nginx.org/download/nginx-1.4.2.tar.gz
tar zxvf nginx-1.4.2.tar.gz

切換到Nginx的源碼目錄 「/home/reetsee/download/nginx-1.4.2」進行安裝前的配置,根據你pcre、zlib、openssl所在的源碼目錄以及Nginx的最終安裝路徑,輸入配置命令,我的配置命令如下:

 

1 ./configure --prefix=/home/reetsee/environment/nginx \
2 --with-http_ssl_module \
3 --with-pcre=/home/download/pcre-8.34 \
4 --with-zlib=/home/download/zlib-1.2.8 \
5 --with-openssl=/home/download/openssl-1.0.1g

 

這里附上一個配置說明列表(參考自http://www.nginx.cn/install):

 1 –prefix=path 定義一個目錄,存放服務器上的文件 ,也就是nginx的安裝目錄。默認使用 /usr/local/nginx。
 2 –sbin-path=path 設置nginx的可執行文件的路徑,默認為 prefix/sbin/nginx.
 3 –conf-path=path 設置在nginx.conf配置文件的路徑。nginx允許使用不同的配置文件啟動,通過命令行中的-c選項。默認為prefix/conf/nginx.conf.
 4 –pid-path=path 設置nginx.pid文件,將存儲的主進程的進程號。安裝完成后,可以隨時改變的文件名 , 在nginx.conf配置文件中使用 PID指令。默認情況下,文件名 為prefix/logs/nginx.pid.
 5 –error-log-path=path 設置主錯誤,警告,和診斷文件的名稱。安裝完成后,可以隨時改變的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默認情況下,文件名 為prefix/logs/error.log.
 6 –http-log-path=path 設置主請求的HTTP服務器的日志文件的名稱。安裝完成后,可以隨時改變的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默認情況下,文件名 為prefix/logs/access.log.
 7 –user=name 設置nginx工作進程的用戶。安裝完成后,可以隨時更改的名稱在nginx.conf配置文件中 使用的 user指令。默認的用戶名是nobody。
 8 –group=name 設置nginx工作進程的用戶組。安裝完成后,可以隨時更改的名稱在nginx.conf配置文件中 使用的 user指令。默認的為非特權用戶。
 9 –with-select_module –without-select_module 啟用或禁用構建一個模塊來允許服務器使用select()方法。該模塊將自動建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
10 –with-poll_module –without-poll_module 啟用或禁用構建一個模塊來允許服務器使用poll()方法。該模塊將自動建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
11 –without-http_gzip_module — 不編譯壓縮的HTTP服務器的響應模塊。編譯並運行此模塊需要zlib庫。
12 –without-http_rewrite_module 不編譯重寫模塊。編譯並運行此模塊需要PCRE庫支持。
13 –without-http_proxy_module — 不編譯http_proxy模塊。
14 –with-http_ssl_module — 使用https協議模塊。默認情況下,該模塊沒有被構建。建立並運行此模塊的OpenSSL庫是必需的。
15 –with-pcre=path — 設置PCRE庫的源碼路徑。PCRE庫的源碼(版本4.4 – 8.30)需要從PCRE網站下載並解壓。其余的工作是Nginx的./ configure和make來完成。正則表達式使用在location指令和 ngx_http_rewrite_module 模塊中。
16 –with-pcre-jit —編譯PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。
17 –with-zlib=path —設置的zlib庫的源碼路徑。要下載從 zlib(版本1.1.3 – 1.2.5)的並解壓。其余的工作是Nginx的./ configure和make完成。ngx_http_gzip_module模塊需要使用zlib 。
18 –with-cc-opt=parameters — 設置額外的參數將被添加到CFLAGS變量。例如,當你在FreeBSD上使用PCRE庫時需要使用:–with-cc-opt=”-I /usr/local/include。.如需要需要增加 select()支持的文件數量:–with-cc-opt=”-D FD_SETSIZE=2048″.
19 –with-ld-opt=parameters —設置附加的參數,將用於在鏈接期間。例如,當在FreeBSD下使用該系統的PCRE庫,應指定:–with-ld-opt=”-L /usr/local/lib”.
配置說明列表

執行configure成功后進行安裝:

make && make install

要驗證Nginx是否安裝成功了,可以切換到Nginx的安裝目錄(我的是「/home/reetsee/environment/nginx」),然后啟動Nginx:

 

./sbin/nginx

 

然后你在瀏覽器中訪問你的機器的IP地址(有公網IP的可以訪問公網IP,沒有的可以打開CentOS的瀏覽器然后訪問「127.0.0.1」),是不是就看到很漂亮的「Welcome to nginx!」了?如果你訪問時出現「403 Forbidden」,那么極其有可能你的nginx下的html所在的絕對路徑中的某些文件夾的權限沒有r或者x你是否將Nginx安裝到你的個人文件夾下了?例如你的用戶名叫「abc」,然后你安裝到了「/home/abc」下的子目錄中?如果是的話,那就是權限不夠了,因為Nginx的worker進程默認用戶為「nobody」。

 

解決方法有3個:

 

  1. 一個是把Nginx安裝到其它目錄,可以查看到效果(安裝到其它目錄后,記得先把原本運行的Nginx給kill掉);
  2. 第二個是將沒有權限的目錄加上rx權限;
  3. 第三個是在nginx安裝目錄下編輯「conf/nginx.conf」,將「#user  nobody」改為「user  root」
  • 但是極其不建議使用第2種以及第3種方法,因為這樣會有安全風險,如果你正在使用虛擬機測試或者僅僅是試用一下機器驗證一下效果,那么就可以使用上面任何3種方法。
  • 下面就讓Nginx通過PHP的FastCGI處理請求,首先到nginx的安裝目錄下,修改「conf/nginx.conf」文件,找到如下內容:
1 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
2 #   
3 #location ~ \.php$ {
4 #    root           html;
5 #    fastcgi_pass   127.0.0.1:9000;
6 #    fastcgi_index  index.php;
7 #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
8 #    include        fastcgi_params;
9 #}  

將第3~第7個「#」去掉,就是取消注釋,同時將「/scripts$fastcgi_script_name」改為「$document_root$fastcgi_script_name」,即變為下面這樣:

1 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
2 #   
3 location ~ \.php$ {
4     root           html;
5     fastcgi_pass   127.0.0.1:9000;
6     fastcgi_index  index.php;
7     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
8     include        fastcgi_params;
9 }

使用vim的列操作可以很快去掉它們。

在nginx的安裝目錄下,新增一個PHP文件「html/index.php」,文件內容如下:

<?php
echo phpinfo();
?>

接下來就啟動php-fpm以及重啟nginx:

/home/reetsee/environment/php/sbin/php-fpm                 #啟動php-fpm
/home/reetsee/environment/nginx/sbin/nginx -s reload    #重啟nginx

然后打開瀏覽器,訪問一下「機器ip/index.php」,例如「127.0.0.1/index.php」,如果你看到PHP的輸出信息了~恭喜就成功啦~那么Nginx的安裝完成了。效果圖如下:

 

 

 

 

圖中的藍色框內如果出現了php.ini,就證明加載php.ini配置文件成功了。

如果你失敗了歡迎留言。

另外是關於nginx.conf中的「127.0.0.1:9000」,這個其實是php-fpm的監聽端口,是可以在php-fpm.conf中設置的。沒有特殊需要使用默認即可。

 

安裝MySQL

現在到最麻煩的一步了——安裝MySQL。

說它麻煩是第一個是因為自從Orcale把MySQL收過來后到它的官網上下載一個MySQL就費力了不少,要找很久才能找到想要的下載連接,而且現在你上官網,不翻牆很有可能找不到下載連接! 我就是這樣被坑了很久,我以為是官網網頁出BUG了,當選擇MySQL的版本時,對應的下載列表並沒有更新,后來查看了一些網頁的源碼發現網頁中使用了部 分來自Google域名下的js,而最近Google在中國被全面封殺,開了GoAgent重新連接才把列表正常刷出來了(說句題外話最近GoAgent 也有點不好使了)。

第二個是因為MySQL安裝后要設置的東西蠻多的,當時我也摸索了比較久。強烈建議大家也摸索一下MySQL的安裝以及初始配置,在官方文檔中有非常詳細的介紹。我選擇MySQL5.5就是因為官網明確了這個版本是肯定在CentOS 6.x運行的

  1 #!/bin/bash
  2 
  3 echo_red(){
  4         echo -e "\033[31m [ $1 ] \033[0m"
  5 }
  6 yum install yum-utils
  7 yum-complete-transaction --cleanup-only
  8 package-cleanup --dupes
  9 package-cleanup --problems
 10 yum -y update
 11 
 12 MYSQL_DIR=/usr/local/mysql
 13 MYSQL_SRC=/usr/local/src
 14 DATA_DIR=/data/mysql
 15 
 16 #check development tools requried by mysql
 17 #echo -e "\033[31m [ Checking for gcc...... ] \033[0m"
 18 echo_red "Checking for gcc......"
 19 #rpm -qa|grep gcc-[0-9] || yum install gcc && echo -e "\033[32m GCC installed \033[0m"
 20 rpm -qa|grep gcc-[0-9] || yum install gcc && echo_red "Gcc install"
 21 #echo -e "\033[31m [ Checking for gcc-c++......] \033[0m"
 22 echo_read "Checking for gcc-c++......"
 23 #rpm -qa|grep gcc-c++ || yum install gcc-c++ && echo -e "\033[32m GCC-C++ installed \033[0m"
 24 rpm -qa|grep gcc-c++ || yum install gcc-c++ && echo_red "GCC-C++ installed"
 25 
 26 #echo -e "\033[31m [ Checking for bison...... ] \033[0m"
 27 echo_red "Checking for bison..."
 28 #rpm -qa|greo bison || yum install bison && echo -e "\033[32m BISON installed \033[0m"
 29 rpm -qa|greo bison || yum install bison && echo_red "BISON installed"
 30 
 31 #echo -e "\033[31m [ Checking for ncurses...... ] \033[0m"
 32 echo_red "Chking for ncurses..."
 33 #rpm -qa|grep ncurses || yum install ncurses && echo -e "\033[32m NCURSES installed \033[0m"
 34 rpm -qa|grep ncurses || yum install ncurses && echo_red "NCURSES installed"
 35 
 36 #echo -e "\033[31m [ Checking for ncurses-devel...... ] \033[0m"
 37 read_red "Checking for ncurses-devel..."
 38 #rpm -qa|grep ncurses-devel || yum install ncurses-devel && echo -e "\033[32m NCURSES-DEVEL installed \033[0m"
 39 rpm -qa|grep ncurses-devel || yum install ncurses-devel && echo_red "NCURSES-DEVEL installed"
 40 
 41 #echo -e "\033[31m [ Checking for wget...... ] \033[0m"
 42 echo_red "Checking for wget..."
 43 #rpm -qa|grep wget||yum -y install wget && echo -e "\033[32m wget installed \033[0m"
 44 rpm -qa|grep wget||yum -y install wget && echo_red "wget installed"
 45 
 46 # check if already installed  mysql, if exists ,remove it
 47 rpm -qa|grep mysql
 48 if [ $? -eq 0 ];then
 49   yum remove mysql mysql-server -y
 50   echo ""
 51   #echo "\033[32m Mysql already removed \033[0m"
 52   echo_red "Mysql already removed..."
 53   echo ""
 54 else
 55   #echo "\033[32m Mysql does not exist \033[0m"
 56   echo_red "Mysql does not exist"
 57 fi
 58 #check user mysql exists or not
 59 id mysql > /dev/null 2>&1
 60 if [ $? -eq 0  ];then
 61    echo ""
 62    #echo -e "\033[31m User mysql exists,now remove it;and add a new acount  \033[0m"
 63    echo_red "User mysql exists,now remove it;and add a new acount"
 64    /usr/sbin/userdel -r mysql
 65    /usr/sbin/groupadd -g 3306 mysql
 66    /usr/sbin/useradd -u 3306 -g mysql -M -s /sbin/nologin mysql
 67    #echo -e "\033[32m User mysql created \033[0m"
 68    echo_red "User mysql created"
 69 else
 70    echo ""
 71    #echo -e "\033[31m User mysql does not exists ,now we will create it \033[0m"
 72    echo_red "User mysql dose not exists,now we will create it"
 73    /usr/sbin/groupadd -g 3306 mysql
 74    /usr/sbin/useradd -u 3306 -g mysql -M -s /sbin/nologin mysql
 75    #echo -e "\033[32m User mysql created \033[0m"
 76    echo_red "User mysql created"
 77 fi
 78 
 79 #yum remove mysql 2>/mnt/error.log
 80 #yum install gcc* gcc-c++ ncurses-devel* bison wget
 81 
 82 #Download and install cmake for mysql 5.5 or newer distribution
 83 cd $MYSQL_SRC
 84 #echo -e "\003[32m Beginning download...... \033[0m"
 85 echo_red "Beginning download..."
 86 wget http://www.cmake.org/files/v2.8/cmake-2.8.5.tar.gz
 87 #echo -e "\033[31m Download Ended \033[0m"
 88 echo_red "Download Ended"
 89 echo ""
 90 #echo -e "\033[32m Beginning uncompress and install......\033[0m"
 91 echo_red "Beginning uncompress and install..."
 92 tar -xzvf cmake-2.8.5.tar.gz
 93 cd cmake-2.8.5
 94 ./configure
 95 make && make install
 96 #echo -e "\033[31m Install Ended \033[0m"
 97 echo_red "Install Ended"
 98 
 99 
100 #Download and install mysql tarball
101 cd $MYSQL_SRC
102 #echo -e "\033[32m Beginning download...... \033[0m"
103 echo_red "Beginning download..."
104 wget http://dev.mysql.com/Downloads/MySQL-5.5/mysql-5.5.27.tar.gz
105 #echo -e "\033[31m DownloadE Ended \033[0m"
106 echo_red "Download Ended"
107 echo ""
108 #echo -e "\033[32m Beginning uncompress and install...... \033[0m"
109 echo_red "Beginning uncompress and install..."
110 tar -zxf mysql-5.5.27.tar.gz
111 cd mysql-5.5.27
112 cmake -DCMAKE_INSTALL_PREFIX=$MYSQL_DIR -DMYSQL_DATADIR=$DATA_DIR/data -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWTIH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DMYSQL_TCP_PORT=3306
113 make && make install
114 #echo -e "\033[31m Install Ended \033[0m"
115 echo_red "Install Ended"
116 
117 # now configure you installation
118 mkdir -p $DATA_DIR/data
119 mkdir -p $DATA_DIR/log
120 chown -R mysql:mysql $DATA_DIR
121 chmod -R 755 $DATA_DIR
122 
123 # use my-medium.cnf as my.cnf
124 cp support-files/my-medium.cnf /etc/my.cnf
125 
126 #initialized database
127 $MYSQL_DIR/scripts/mysql_install_db --user=mysql --basedir=$MYSQL_DIR --datadir=$DATA_DIR/data
128 
129 # use mysql.server as mysqld
130 cp support-files/mysql.server /etc/init.d/mysqld
131 chmod +x /etc/init.d/mysqld
132 
133 # set mysql as system service and start when system boot
134 /sbin/chkconfig --add mysqld
135 /sbin/chkconfig mysqld on
136 
137 
138 # create soft links
139 cd /usr/local/bin
140 ln -s /usr/local/mysql/bin/mysql mysql &&
141 ln -s /usr/local/mysql/bin/mysqldump mysqldump &&
142 ln -s /usr/local/mysql/bin/mysqladmin mysqladmin
143 
144 #echo "Start the mysql service"
145 echo_red "Start the mysql service"
146 service mysqld start
147 
148 #echo -e "\033[31m You have installed mysql successfull "
149 echo_red "You have installed mysql successfull"
150 #echo -e "\033[32m END END END END \033[0M"
151 echo_red "END..........................................................................................................."
Mysql安裝腳本

最后就是給MySQL數據庫里的「root」賬號一個密碼:

./bin/mysqladmin -u root password '123abc'

里面的「123abc」替換成你自己想要設置的密碼即可。要注意的是這個MySQL的root不是指操作系統的root,而是指這個數據庫管理系統的root,以后我們就可以使用這個賬號對數據庫進行添加用戶、賦予權限等操作,所以一定要設置一個密碼。

至此,繁瑣的MySQL安裝就所剩無幾了!Congratulations

最后還有幾件事要做:

 

  1. 使用「root」賬戶進入MySQL管理系統中;
  2. 在MySQL內創建一個叫做「hello」的賬號,為它設置密碼;
  3. 在MySQL內建立一個名為「hello_db」的數據庫,然后讓「hello」賬號擁有對「hello_db」數據庫的完全操作權限;
  4. 退出MySQL管理系統,使用「hello」賬戶進入MySQL管理系統中;
  5. 在「hello_db」數據庫中創建一張名為「hello_table」的表,在里面插入一條數據;
  6. 編寫一個簡單的PHP文件,通過瀏覽器的訪問將上面一步中插入的數據顯示在網頁上。

 

當我們完成最后的這幾件事,就真正宣告LNMP搭建成功,所有東西都能串起來了!

MySQL與用戶創建、權限賦予的相關操作,請參見官方文檔的賬戶管理部分。下面主要使用的MySQL指令是「CREATE USER」以及「GRANT」。

使用「root」賬戶進入MySQL管理系統中:

./bin/mysql -u root -p

在MySQL內創建一個叫做「hello」的賬號,為它設置密碼:

在mysql中輸入以下語句:

 1 CREATE USER 'hello'@'localhost' IDENTIFIED BY '123456'; 

在使用MySQL語句時,有個好習慣是對於命令的保留字使用全大寫的形式,這樣語句會更好的易讀性。上面的「123456」是密碼,替換成你自己的密碼即可。

在上面的「@localhost」是有經過一些考慮,目前對於我們來說,我們的MySQL和PHP部署的機器是一樣的,因此PHP通過 localhost就可以訪問數據庫。因此我們希望只有本地的連接可以訪問數據庫,來自其它IP或者域名的連接不能訪問數據庫,這樣做的好處是即便你的密 碼泄露了,入侵者也無法直接通過網絡來操作數據庫,除非你的機器登陸密碼被入侵者知道了,他才能夠直接登陸到你的機器,然后通過localhost訪問數 據庫。

如果你將「@localhost」替換成「@127.0.0.1」,那么只有IP為127.0.0.1的連接才能夠訪問數據庫。如果你不想對連接進行過濾,所有連接都能夠訪問到數據庫,那么你上網查資料應該替換成什么吧,我不會告訴你的:)

在MySQL內建立一個名為「hello_db」的數據庫,然后讓「hello」賬號擁有對「hello_db」數據庫的完全操作權限:

首先是創建數據庫「hello_db」:

CREATE DATABASE hello_db;

然后是讓「hello」賬號擁有對「hello_db」數據庫的完全操作權限:

GRANT ALL ON hello_db.* TO 'hello'@'localhost';

上面的「ALL」即所有權限,「hello_db.*」即權限是針對hello_db下的所有表,「‘hello’@‘localhost’」即來自localhost的名為「hello」的用戶。

退出MySQL管理系統,使用「hello」賬戶進入MySQL管理系統中:

先退出:

 exit; 

然后以「hello」賬號進入MySQL:

 ./bin/mysql -u hello -p 

輸入密碼后即可。

在「hello_db」數據庫中創建一張名為「hello_table」的表,在里面插入一條數據:

使用「hello_db」數據庫:

 USE hello_db; 

建一張名為「hello_table」的表(下面普通的換行不會執行語句,MySQL在換行時檢測到分號「;」才會執行語句):

CREATE TABLE `hello_table`(
`id` INT(10) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`content` VARCHAR(256) DEFAULT 'Hello LNMP!'
);

 

 

注意!上面對於表名如「hello_table」,列名如「id」和「content」,它們使用的引號是反引號「`」,不是單引號

 

這樣一張表就建立好了,通過命令「SHOW TABLES」就可以看到。然后就是往里面插入一條數據:

 INSERT INTO `hello_table` (`id`, `content`) VALUES(1, 'Hello World! Hello LNMP!'); 

出現 「Query OK, 1 row affected」就證明成功了!

 

編寫一個簡單的PHP文件,通過瀏覽器的訪問將上面一步中插入的數據顯示在網頁上:

 

切換到Nginx安裝目錄下的「html」文件夾:

cd /home/reetsee/environment/nginx/html/
新建一個名為「lnmp.php」的文件,內容如下:
 1 <?php
 2 $con = mysqli_connect('localhost:3306', 'hello', '123456', 'hello_db');
 3 
 4 //檢查連接是否出錯
 5 if (mysqli_connect_errno($con)) {
 6     echo 'Failed to connect to MySQL: ' . mysqli_connect_error() . "\n";
 7     die("Connect to database failed.\n");
 8 }
 9 
10 //執行讀取數據的語句
11 $query  = 'SELECT `id`, `content` FROM `hello_table` WHERE `id`=1;';
12 $result = mysqli_query($con, $query);
13 $row    = mysqli_fetch_array($result, MYSQLI_ASSOC);
14 
15 //輸出結果
16 echo $row['content'];
17 
18 //關閉連接
19 mysqli_close($con);
20 ?>

里面的用戶名、密碼等替換成自己的。沒用過PHP的同學要留意PHP中雙引號和單引號的含義是不同的。注意上面在初始化連接時的端口號「3306」不能少呀。

保存后將這個文件的權限設置為755,即執行命令「chmod 755 lnmp.php」。

接下來就打開瀏覽器,訪問一下「127.0.0.1/lnmp.php」,是不是就看到了萬眾期待的「Hello World! Hello LNMP!」?效果如下:

安裝Nginx的過程中,nginx.conf中有一行fastcgi_pass,里面指定通過TCP/IP協議進行通信的,如果你的Nginx與PHP 是部署在同一台機器(即非分布式部署,就像這篇博文所說的那樣部署),可以使用Unix域套接字進行通信,據說性能會有一點點提高。

 

把LNMP環境搭建起來后,可玩性就很強了,例如在上面放一個WordPress(安裝快到沒朋友),或者在上面搭建其它你喜歡的應用和服務

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM