centos7 系统下搭建 lnmp 环境
目錄
- 目錄
- 概述
- 準備工作
- 開始編譯安裝
- 1. 安裝 Nginx
- 1. 解壓
- 2. 環境準備
- 3. 編譯過程
- 4. Nginx 服務
- 2. 安裝 MySQL
- 1. 解壓
- 2. 環境準備
- 3. 安裝 CMake 編譯器:
- 4. 編譯過程
- 5. 初始化數據庫
- 6. MySQL 服務
- 3. 安裝 PHP
- 1. 安裝依賴包
- 2. 編譯安裝
- 3. 配置 PHP
- 4. 整合 LNMP
- 1 編輯 Nginx 配置文件
- 2 編輯fastcgi_params文件
- 3 編輯測試頁
- 4 訪問站點測試效果
- 1. 安裝 Nginx
- 后記
概述
在之前的工作中,搭建過一次 zabbix 監控平臺,應用的就是 LNMP 環境,但都是用的 rpm 包直接安裝的。
由于是在阿里云封閉網絡環境中搭建的,要想二次利用 LNMP 架構就得重新配置,所以做了本次操作,全部組件都是源碼編譯,配置成型,方便以后遷移利用。
也編制了文檔,方便查閱、二次編輯。
準備工作
本次安裝用到的資源包(點擊可自動下載):
MySQL-5.6.40
Nginx-1.14.0
PHP-7.1.18
Apache-2.4.33:雖然不是 LAMP 架構,但還是準備了 Apache 的源碼包下載地址,方便你我他。
將源碼包統一放置在 /root/app 下: # ls -lh /root/app/
-rw-r–r–. 1 root root 8.7M May 31 14:17 httpd-2.4.33.tar.gz
-rw-r–r–. 1 root root 31M May 31 14:17 mysql-5.6.40.tar.gz
-rw-r–r–. 1 root root 993K May 31 14:17 nginx-1.14.0.tar.gz
-rw-r–r–. 1 root root 19M May 31 14:17 php-7.1.18.tar.gz
開始編譯安裝
1. 安裝 Nginx
1. 解壓
# tar -xf nginx-1.14.0.tar.gz
# cd nginx-1.14.0/
2. 環境準備
# yum -y install gcc
# useradd -s /sbin/nologin -M nginx
# id nginx
# mkdir -p /var/tmp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
3. 編譯過程
在 Nginx 解壓的目錄下執行
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre \
--with-file-aio \
--with-http_secure_link_module \
--with-threads 此時可能遇到的報錯:
錯誤 1:
./configure: error: the HTTP rewrite module requires the PCRE library.
錯誤 2:./configure: error: SSL modules require the OpenSSL library.
解決辦法(缺少依賴庫,安裝就好了)# yum -y install pcre-devel# yum -y install openssl-develconfigure 成功后,執行:
# make# make install
注:可在編譯結束后,通過 echo $? 來查看任務輸出碼,一般為 0 則是成功。
4. Nginx 服務
啟動服務:
# /usr/local/nginx/sbin/nginx# ss -antp |grep nginx
LISTEN 0 128 *:80 *:* users:((“nginx”,pid=8814,fd=6), (“nginx”,pid=8813,fd=6))
設置開機自啟動:
# tail -1 /etc/rc.d/rc.local
/usr/local/nginx/sbin/nginx
創建軟連接:# ln -s /usr/local//nginx/sbin/nginx /usr/bin/nginx
2. 安裝 MySQL
1. 解壓
# tar -xf mysql-5.6.40.tar.gz # cd mysql-5.6.40/
2. 環境準備
卸載系統原裝數據庫 mariadb
# rpm -qa | grep mariadb
mariadb-libs-5.5.56-2.el7.x86_64# rpm -e --nodeps mariadb-libs創建數據目錄
# mkdir -p /mydata/data還有很重要的兩步
# groupadd -g 27 mysql# useradd -u 27 -g 27 -s /sbin/nologin -M mysql# chown -R mysql.mysql /mydata/data/
注:MySQL5.5 之前的版本使用的是 gcc 編譯器,自5.5版本以后,就開始使用 CMake 編譯工具了,因此,在安裝源文件中找不到 configure 文件是正常的。
3. 安裝 CMake 編譯器:
# rpm -qa |grep cmake
# yum list |grep cmake
cmake.x86_64 2.8.12.2-2.el7 base
cmake-fedora.noarch 2.9.3-1.el7 epel
cmake-gui.x86_64 2.8.12.2-2.el7 base
cmake3.x86_64 3.11.0-1.el7 epel
cmake3-data.noarch 3.11.0-1.el7 epel
cmake3-doc.noarch 3.11.0-1.el7 epel
cmake3-gui.x86_64 3.11.0-1.el7 epel
extra-cmake-modules.noarch 5.36.0-1.el7 epel # yum -y install cmake
4. 編譯過程
進入解壓的 MySQL 目錄執行
環境檢查
# cmake -L可能有如下報錯:
… …
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)解決辦法:
# yum -y install ncurses-devel
另外要注意
錯誤的編譯信息會存放到解壓目錄下 CMakeCache.txt 文件中,所以每次解決完問題,重新編譯需要將此文件刪掉.- Cmake
# cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DMYSQL_DATADIR=/mydata/data \
-DMYSQL_TCP_PORT=3306 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 - make && make install
# make# make install
5. 初始化數據庫
先修改 mysql 目錄的屬主屬組 # chown -R mysql.mysql /usr/local/mysql
單純執行初始化命令會報錯,可能報錯如下:
2018-05-31 16:53:40 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).
2018-05-31 16:53:40 0 [Note] –secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
2018-05-31 16:53:40 0 [Note] /usr/local/mysql/bin/mysqld (mysqld 5.6.40) starting as process 87262 …
2018-05-31 16:53:40 87262 [Note] Plugin ‘FEDERATED’ is disabled.
/usr/local/mysql/bin/mysqld: Table ‘mysql.plugin’ doesn’t exist
2018-05-31 16:53:40 87262 [ERROR] Can’t open the mysql.plugin table. Please run mysql_upgrade to create it.
網上找了好多相似案例,終于用下面的方法解決了
先執行如下操作
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/mydata/data
再執行初始化命令
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/mydata/data
ls -h /mydata/data/
-rw-rw----. 1 mysql mysql 56 May 31 17:03 auto.cnf
-rw-rw----. 1 mysql mysql 76M Jun 1 09:21 ibdata1
-rw-rw----. 1 mysql mysql 48M Jun 1 09:21 ib_logfile0
-rw-rw----. 1 mysql mysql 48M May 31 16:56 ib_logfile1
-rw-rw----. 1 mysql mysql 33K Jun 1 09:20 lnmp.linux.com.err
-rw-rw----. 1 mysql mysql 6 May 31 17:14 lnmp.linux.com.pid
drwx------. 2 mysql mysql 4.0K May 31 16:56 mysql
drwx------. 2 mysql mysql 4.0K May 31 16:56 performance_schema
drwx------. 2 mysql mysql 94 Jun 1 09:21 test 6. MySQL 服務
啟動服務
# cd /usr/local/mysql/support-files/# cp my-default.cnf /etc/my.cnf# vim /etc/my.cnf# 此步驟暫不說明,請根據需求自行解決# /usr/local/mysql/bin/mysqld_safe --user=mysql &# 這里敲兩下回車# netstat -antp |grep mysqld
tcp6 0 0 :::3306 :::* LISTEN 87606/mysqld設置開機自啟動:
# cp mysql.server /etc/init.d/mysqldd# chmod +x /etc/init.d/mysqldd# /etc/init.d/mysqldd restart
Shutting down MySQL..180529 14:29:26 mysqld_safe mysqld from pid file
/mydata/data/LNMP.linux.com.pid ended SUCCESS!
[1]+ Done ./bin/mysqld_safe –user=mysql (wd: /usr/local/mysql)
(wd now: /usr/local/mysql/support-files)# chkconfig --add mysqldd# chkconfig mysqldd on# #chkconfig mysqldd --list
… …
mysqldd 0:off 1:off 2:on 3:on 4:on 5:on 6:off設置全局變量:
可以在 profile 文件中添加,也可以單獨在 profile.d 目錄中創建 .sh 文件,我一般用后者:
# ls -ld /etc/profile*
-rw-r–r–. 1 root root 1813 May 28 14:04 /etc/profile
drwxr-xr-x. 2 root root 4096 May 28 17:09 /etc/profile.d# vim mysql.sh# cat /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin# source /etc/profile.d/mysql.sh# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin
3. 安裝 PHP
1. 安裝依賴包
# yum -y install libxml2-devel bzip2-devel libmcrypt libmcrypt-devel mcrypt mhash mhash-devel
# yum -y install curl-devel libjpeg-devel libpng libpng-devel freetype freetype-develPS:為什么我知道安裝這些包,因為這是一遍一遍環境檢測教育出來的... ...
2. 編譯安裝
./configure \
--prefix=/usr/local/php7 \
--exec-prefix=/usr/local/php7 \
--bindir=/usr/local/php7/bin \
--sbindir=/usr/local/php7/sbin \
--includedir=/usr/local/php7/include \
--libdir=/usr/local/php7/lib/php \
--mandir=/usr/local/php7/php/man \
--with-config-file-path=/usr/local/php7/etc \
--with-mysql-sock=/tmp/mysql.sock \
--with-mcrypt=/usr/include \
--with-mhash \
--with-openssl \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-pdo-mysql=/usr/local/mysql \
--enable-mysqlnd \
--with-gd \
--with-iconv \
--with-zlib \
--enable-zip \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-xml \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--enable-gd-native-ttf \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--enable-opcache \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--without-gdbm \
--disable-fileinfo 為了方便以后的移植(也不知道用不用得上),我把一般能用到的參數都添加上了,此處特別強調一下 mysql 相關的參數,因為我為此重新編譯了 MySQL 和 PHP。
最開始編譯時就是從網上 copy 的,包括 - -with-mysql 參數,但是不知道從什么版本(后來查過官網才知道)開始,這個參數就被摒棄了。
重新編譯時,加了下面兩個參數:
–with-pdo-mysql=/usr/local/mysql
–enable-mysqlnd
加這兩個參數的意義,會在文章的后面簡單提到
詳解請查看官方文檔
- make && make install
# make# make install
3. 配置 PHP
- 拷貝各種配置文件:
#cd /root/app/php-7.1.18
#cp php.ini-production /etc/php.ini
#cd /usr/local/php7/etc
#cp php-fpm.conf.default php-fpm.conf
#cd /root/app/php-7.1.18/sapi/fpm
#cp init.d.php-fpm /etc/init.d/php-fpm
#chmod a+x /etc/init.d/php-fpm設置開機自啟動
#chkconfig --add php-fpm
#chkconfig --list php-fpm
...
php-fpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off 編輯配置文件,這很重要
至于各個參數的意義,請自行查找相應文檔
# vim /usr/local/php7/etc/php-fpm.conf
# cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
# vim /usr/local/php7/etc/php-fpm.d/www.conf[root@LNMP.linux.com /usr/local/php7/etc] LNMP
# grep -Ev '^$|^;' /usr/local/php7/etc/php-fpm.conf
[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log
include=/usr/local/php7/etc/php-fpm.d/*.conf[root@LNMP.linux.com /usr/local/php7/etc] LNMP
# grep -Ev '^$|^;' php-fpm.d/www.conf
[www]
user = nginx
group = nginx
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 15 # 這些參數自行計算修改,參考官方文檔或大神博客
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15注:以上值的大小必須遵循如下排列
pm.max_spare_servers > pm.start_servers > pm.min_spare_servers - 啟動服務
[root@LNMP.linux.com /usr/local/php7/etc] LNMP
# /etc/init.d/php-fpm start
Starting php-fpm done[root@LNMP.linux.com /usr/local/php7/etc] LNMP
# ss -antp |grep php-fpm
LISTEN 0 128 127.0.0.1:9000 : users:((“php-fpm”,pid=81980,fd=0),(“php-fpm”,pid=81979,fd=0),(“php-fpm”,pid=81978,fd=0),(“php-fpm”,pid=81977,fd=0),(“php-fpm”,pid=81976,fd=0),(“php-fpm”,pid=81975,fd=0),(“php-fpm”,pid=81974,fd=0),(“php-fpm”,pid=81973,fd=0),(“php-fpm”,pid=81972,fd=0),(“php-fpm”,pid=81971,fd=0),(“php-fpm”,pid=81970,fd=7))
注:
此時用 systemctl 查看 php-fpm 服務啟動狀態,看到是未啟動的話,就停止 php-fpm 服務.
然后 systemctl start php-fpm,之前的步驟已經設置過開機自啟動,此處不用再做。
4. 整合 LNMP
終于編譯完這些 balabala… 終于可以干點兒正事兒啦!!!1 編輯 Nginx 配置文件
整合 Nginx 和 PHP,改動內容如下:...location / {root html;index index.php a.php index.html index.htm;}...location ~ \.php$ {root /web/docs;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}
2 編輯fastcgi_params文件
- 編輯/usr/local//nginx/conf/fastcgi_params文件,并將內容修改為如下內容,配置fastcgi參數:
#grep -Ev '^$|^#' /usr/local/nginx/conf/fastcgi_params
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root\$fastcgi_script_name; # 改動的是這里
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param REDIRECT_STATUS 200;
3 編輯測試頁
在 /web/docs(我自定義了PHP初始頁位置,可以不改,默認放在Nginx的html目錄下)目錄下編寫 index.php 和 a.php ,內容如下:
#cat index.php<?phpphpinfo();?>
編寫連接數據庫的測試頁:
#cat a.php<?php$link=mysqli_connect("localhost","root","");if ($link)echo "Succeed!";elseecho "Fail!";mysqli_close();?>
4 訪問站點測試效果
訪問 $IP 可以看到 PHP 初始頁面 ~ nice
訪問 $IP/a.php 很可能會有http error 500的報錯 ~ XXX
我在測試數據庫連接這里卡了一天的時間,看了各個日志,參考了網友同類型報錯,但始終解決不了。
只好重新編譯,查找和MySQL相關的參數,如上文提到的,加了那兩個參數,再次編譯果然能用了。
成功之前,還有一個另類的報錯:
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /usr/local/nginx/html/a.php:7 Stack trace: #0 {main} thrown in /usr/local/nginx/html/a.php on line 2
這里和PHP版本有關,查看了官方文檔,發現自5.5.0版本開始廢棄了好多api,并在自 PHP 7.0.0 開始被移除。應使用 MySQLi 或 PDO_MySQL 擴展來替換之。
具體的可以參考官方文檔。鏈接:http://php.net/manual/zh/ref.mysql.php
突然想起郭德綱的那句話:“大難不死,必有下回”,在我這應驗了,深深的理解了什么叫絕望 T_T
成功之后竟然還有一個報警!!!Warning: mysqli_connect(): Headers and client library minor version mismatch. Headers:50640 Library:50556 in /usr/local/nginx/html/a.php on line 2
對于這個,我實在沒耐心繼續搞了,畢竟是利用了好多工作時間,欠的工作要補救一下了。也希望有大牛在評論下指點一二
后記
用了大概一周的時間,斷斷續續的編譯、搭建,學習了很多,但也發現不懂的更多。官方文檔和強大的網友總能給你驚喜,要是沒收到,那就歇一會兒再做就好了 ^_^
轉載于:https://www.cnblogs.com/nimo97/p/9704764.html
總結
以上是生活随笔為你收集整理的centos7 系统下搭建 lnmp 环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现在黄金多少钱一克?
- 下一篇: 求白狐歌词