LNMP Web服务搭建

1. 常见WEB环境介绍

1.1 JAVA环境(主流)

# 常用的软件如下:
tomcat、resin、jboss、Weblogic

tomcat配合nginx proxy_pass代理功能来实现web环境。

1.2 Python Web环境

配合nginx uwsgi_pass代理功能来实现web环境。

1.3 PHP Web环境

配合nginx fastcgi_pass代理功能来实现web环境。

2. LNMP 组合工作流程

3. 二进制安装Mysql数据库

3.1 MySQL安装方式

MySQL安装方式 特点说明
yum/rpm安装 特点是简单、速度快,但是无法定制安装,适合新手
二进制安装 解压后简单配置即可使用,速度快,专业DBA常用该方式。
源码编译安装 特点是可以定制安装参数,但是安装时间较长。
源码软件结合yum/rpm来安装 把源码包制作成符合要求的rpm,结合了第一种和第三种的优点。

3.2 安装步骤介绍

(1)创建MySQL用户

[root@web01 ~]# useradd -s /sbin/nologin -g mysql -M mysql
useradd: group 'mysql' does not exist
[root@web01 ~]# groupadd mysql
[root@web01 ~]# useradd -s /sbin/nologin -g mysql -M mysql

# 创建存放软件包的目录
[root@web01 ~]# mkdir /home/xts/tools -p
[root@web01 ~]# cd /home/xts/tools/

(2)二进制方式安装MySQL

[root@web01 /home/xts/tools]# ls
mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
[root@web01 /home/xts/tools]# tar xf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
[root@web01 /home/xts/tools]# mv mysql-5.7.26-linux-glibc2.12-x86_64 /application/mysql-5.7.26
[root@web01 /home/xts/tools]# ln -s /application/mysql-5.7.26/ /application/mysql
[root@web01 /home/xts/tools]# ll /application/
total 0
lrwxrwxrwx  1 root root  26 Jun 12 20:03 mysql -> /application/mysql-5.7.26/
drwxr-xr-x  9 root root 129 Jun 12 20:00 mysql-5.7.26
lrwxrwxrwx  1 root root  26 May 19 20:37 nginx -> /application/nginx-1.18.0/
drwxr-xr-x 11 root root 151 May 19 20:37 nginx-1.18.0

(3)初始化MySQL配置文件my.cnf

[root@web01 /home/xts/tools]# cd /application/mysql
[root@web01 /application/mysql]# rpm -e --nodeps mariadb-libs  # 卸载系统自动安装的mariadb库,防止冲突。

# 手动编辑my.cnf并加入如下内容
[root@web01 /application/mysql]# vim /etc/my.cnf 
[mysqld]                                            # 服务器端模块名字
basedir = /application/mysql                        # MySQL安装目录
datadir = /application/mysql/data                   # MySQL数据文件目录
socket = /tmp/mysql.sock                            # MySQL服务端sock文件目录
server_id = 1                                       # MySQL实例ID
port = 3306                                         # MySQL端口号
log_error = /application/mysql/data/mysql.error     # MySQL错误日志存放位置

[mysql]                                             # MySQL客户端模块名
socket = /tmp/mysql.sock                            # MySQL客户端sock文件目录
prompt = mysql [\d]>                               # MySQL登录提示符

(4)初始化MySQL数据库文件

# 安装依赖包
[root@web01 /application/mysql]# yum -y install libaio-devel

# 创建数据文件目录并授权
[root@web01 /application/mysql]# mkdir -p /application/mysql/data -p
[root@web01 /application/mysql]# chown -R mysql.mysql /application/mysql/
[root@web01 /application/mysql]# ll -d /application/mysql/
drwxr-xr-x 10 mysql mysql 141 Jun 12 23:26 /application/mysql/

# 初始化数据库
[root@web01 /application/mysql]# /application/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/application/mysql/ --datadir=/application/mysql/data  # 初始化的时候,是要没有error就行。


## 初始化参数介绍
--initialize-insecure:关闭mysql安全策略。
--user=mysql:mysql用户
--basedir=/application/mysql/:mysql根目录
--datadir=/application/mysql/data:mysql数据文件目录

扩展:
--initialize:开启mysql安全策略,初始化完毕会生成一条临时密码。高安全环境使用。

4. 配置并启动MySQL数据库

4.1 设置MySQL启动脚本

[root@web01 /application/mysql]# cat >/etc/systemd/system/mysqld.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

4.2 启动MySQL数据库

[root@web01 /application/mysql/support-files]# systemctl start mysqld
[root@web01 /application/mysql/support-files]# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /etc/systemd/system/mysqld.service.
[root@web01 /application/mysql/support-files]# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/etc/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-06-12 23:40:05 CST; 13s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
 Main PID: 7540 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─7540 /application/mysql/bin/mysqld --defaults-file=/etc/my.cnf

Jun 12 23:40:05 web01 systemd[1]: Started MySQL Server.

4.3 检查启动是否有异常

[root@web01 /application/mysql]# ps -ef | grep [m]ysql
mysql      7540      1  0 23:40 ?        00:00:00 /application/mysql/bin/mysqld --defaults-file=/etc/my.cnf
[root@web01 /application/mysql]# netstat -lntup|grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      7540/mysqld

# 如果3306端口未启动,请查看/application/mysql/data/mysql.err日志进行调试。

4.4 配置MySQL命令的环境变量

[root@web01 /application/mysql]# echo 'export PATH=/application/mysql/bin:$PATH' >> /etc/profile
[root@web01 /application/mysql]# tail -1 /etc/profile
export PATH=/application/mysql/bin:$PATH
[root@web01 /application/mysql]# source /etc/profile
[root@web01 /application/mysql]# echo $PATH
/application/mysql/bin:/application/nginx/sbin/:/application/nginx/sbin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

4.5 登录测试

[root@web01 /application/mysql]# mysql
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 2
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql [(none)]>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql [(none)]>select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql [(none)]>

4.6 设置MySQL登录密码

[root@web01 /application/mysql]# mysqladmin -u root password 'xts123'
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
[root@web01 /application/mysql]# mysql                                           # 由于更改了密码,所以无法直接登录
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@web01 /application/mysql]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 5
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql [(none)]>

5. FastCGI介绍

5.1 什么是CGI

5.2 什么是FastCGI


5.3 FastCGI的运行原理

当有*.php这样的请求到达Nginx的时候,会由Nginx中的fastcgi_pass把该请求抛给PHP服务端。
在PHP服务端中会事先启动php_fpm服务(配置文件为php-fpm.conf),php_fpm服务收到fastcgi_pass抛过来的请求后,会由waepper发送给PHP解析器进行处理(配置文件php.ini)。
如果需要访问数据库就会访问数据库,如果不需要,就会直接把结果返回给Nginx。
访问原理图如下:

6. PHP(FastCGI)安装前的准备

6.1 检查确认Nginx和MySQL的安装路径

[root@web01 ~]# ll -d /application/mysql/
drwxr-xr-x 10 mysql mysql 141 Jun 12 23:26 /application/mysql/
[root@web01 ~]# ll -d /application/nginx/
drwxr-xr-x 11 root root 151 May 19 20:37 /application/nginx/

6.2 检查端口及启动情况

[root@web01 ~]# netstat -lntup|egrep "80|3306"
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6757/nginx: master  
tcp6       0      0 :::3306                 :::*                    LISTEN      6504/mysqld

6.3 安装PHP所需的lib库文件

[root@web01 ~]# yum install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel -y
[root@web01 ~]# yum install freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel libxslt-devel -y

6.4 安装yum无法安装的libiconv库

[root@web01 /server/tools]# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz
[root@web01 /server/tools]# ll 
total 6064
-rw-r--r-- 1 root  root  5166734 Jun  4 18:22 libiconv-1.16.tar.gz
drwxr-xr-x 9 mysql mysql     186 May 19 20:35 nginx-1.18.0
-rw-r--r-- 1 root  root  1039530 Apr 21 22:33 nginx-1.18.0.tar.gz
[root@web01 /server/tools]# tar xf libiconv-1.16.tar.gz 
[root@web01 /server/tools]# cd libiconv-1.16/
[root@web01 /server/tools/libiconv-1.16]# ./configure --prefix=/application/libiconv
[root@web01 /server/tools/libiconv-1.16]# make
[root@web01 /server/tools/libiconv-1.16]# make install

6.5 安装libmcrypt库

# 这是一个使用动态加载的模块化的libmcrypt。libmcrypt对于在程序运行时添加或移除算法是有用的。  libmcrypt目前不在被官方支持,安装时需要安装epel源。  libmcrypt官方地址为http://mcrypt.hellug.gr/lib/。
[root@web01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@web01 /server/tools/libiconv-1.16]# cd ..
[root@web01 /server/tools]# yum -y install libmcrypt-devel
[root@web01 /server/tools]# rpm -qa libmcrypt-devel
libmcrypt-devel-2.5.8-13.el7.x86_64

6.6 安装mhash加密扩展库

# mhash是基于离散数学原理不可逆向的PHP加密方式扩展库,其在默认情况下不会开启。mhash可以用于创建校验数值、消息摘要、消息认证码,以及无需原文的关键信息保存(如密码)等。它为PHP提供了多种散列算法,如MD5、SHA1、GOST等。可以通过MHASH_hashname()查看支持的算法。

# 注意:该扩展不能提供最新的散列算法。
#      该扩展结果原则上运算不可逆。

[root@web01 /server/tools]# yum install mhash -y
[root@web01 /server/tools]# rpm -qa libmcrypt-devel
libmcrypt-devel-2.5.8-13.el7.x86_64

7. 开始安装PHP(FastCGI方式)服务

7.1 获取PHP包

[root@web01 /server/tools]# wget http://mirrors.sohu.com/php/php-7.3.5.tar.gz
[root@web01 /server/tools]# ll -h
total 25M
drwxrwxr-x 20 root  root   4.0K Jun 13 16:04 libiconv-1.16
-rw-r--r--  1 root  root   5.0M Jun  4 18:22 libiconv-1.16.tar.gz
drwxr-xr-x  9 mysql mysql   186 May 19 20:35 nginx-1.18.0
-rw-r--r--  1 root  root  1016K Apr 21 22:33 nginx-1.18.0.tar.gz
-rw-r--r--  1 root  root    19M May  1  2019 php-7.3.5.tar.gz     # 检查软件包的完整性
# 注意:工作中如何选择PHP版本,取决于开发人员使用什么版本的PHP。

7.2 解压配置PHP

[root@web01 /server/tools]# tar xf php-7.3.5.tar.gz 
[root@web01 /server/tools]# cd php-7.3.5/
[root@web01 /server/tools/php-7.3.5]# ./configure 
--prefix=/application/php-7.3.5 
--enable-mysqlnd  
--with-mysqli=mysqlnd 
--with-pdo-mysql=mysqlnd 
--with-iconv-dir=/application/libiconv 
--with-freetype-dir 
--with-jpeg-dir 
--with-png-dir 
--with-zlib 
--with-libxml-dir=/usr 
--enable-xml 
--disable-rpath 
--enable-bcmath 
--enable-shmop 
--enable-sysvsem 
--enable-inline-optimization 
--with-curl 
--enable-mbregex 
--enable-fpm 
--enable-mbstring 
--with-gd 
--with-openssl 
--with-mhash 
--enable-pcntl 
--enable-sockets 
--with-xmlrpc 
--enable-soap 
--enable-short-tags 
--enable-static 
--with-xsl 
--with-fpm-user=nginx 
--with-fpm-group=nginx 
--enable-ftp 
--enable-opcache=no

## 配置成功显示如下:

7.3 编译PHP

## 编译时间较久,中途会停顿,不是卡住了。
## 最后一行出现这个:Don't forget to run 'make test'. 表示成功。
[root@web01 /server/tools/php-7.3.5]# make
[root@web01 /server/tools/php-7.3.5]# echo $?
0   # 返回0,表示安装成功
[root@web01 /server/tools/php-7.3.5]# make install
[root@web01 /server/tools/php-7.3.5]# echo $?
0

7.4 配置PHP引擎配置文件 php.ini(解析器)

(1)设置软连接以便访问

[root@web01 /server/tools/php-7.3.5]# ln -s /application/php-7.3.5/ /application/php
[root@web01 /server/tools/php-7.3.5]# ll /application/
total 0
drwxr-xr-x  6 root  root   56 Jun 13 16:04 libiconv
lrwxrwxrwx  1 root  root   26 Jun 12 20:03 mysql -> /application/mysql-5.7.26/
drwxr-xr-x 10 mysql mysql 141 Jun 12 23:26 mysql-5.7.26
lrwxrwxrwx  1 root  root   26 May 19 20:37 nginx -> /application/nginx-1.18.0/
drwxr-xr-x 11 root  root  151 May 19 20:37 nginx-1.18.0
lrwxrwxrwx  1 root  root   23 Jun 13 16:39 php -> /application/php-7.3.5/
drwxr-xr-x  9 root  root   88 Jun 13 16:32 php-7.3.5
[root@web01 /server/tools/php-7.3.5]# ls /application/php
bin  etc  include  lib  php  sbin  var

(2)查看PHP配置默认模板文件

[root@web01 /server/tools/php-7.3.5]# !l
ll php.ini-*
-rw-r--r-- 1 www www 71648 Apr 30  2019 php.ini-development   # 开发(测试)环境
-rw-r--r-- 1 www www 71920 Apr 30  2019 php.ini-production    # 生产环境

# 两个文件内容的不同可以使用vimdiff进行比对。

(3)拷贝PHP配置文件到PHP默认目录,并更改文件名为php.ini

[root@web01 /server/tools/php-7.3.5]# cp php.ini-development /application/php/lib/php.ini  # 学习用开发环境的配置文件,工作用生产环境的配置,或者环境部署成功后,再改成生产配置。
[root@web01 /server/tools/php-7.3.5]# ll /application/php/lib/php.ini 
-rw-r--r-- 1 root root 71648 Jun 13 16:51 /application/php/lib/php.ini

7.5 配置PHP服务(FastCGI模式)的配置文件php-fpm.conf

[root@web01 /application/php/etc]# cp php-fpm.conf.default php-fpm.conf
[root@web01 /application/php/etc]# cp php-fpm.d/www.conf.default php-fpm.d/www.conf   # 这是个特殊的包含文件,必须要有,否则后面启动服务会有报错ERROR: No pool defined。

7.6 启动PHP服务(FastCGI模式)

[root@web01 /application/php/etc]# /application/php/sbin/php-fpm 
[root@web01 /application/php/etc]# netstat -lntup|grep 9000
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      27769/php-fpm: mast

7.7 设置为开机自启动

[root@web01 /application/php/etc]# echo '/application/php/sbin/php-fpm' >> /etc/rc.local 
[root@web01 /application/php/etc]# tail -1 /etc/rc.local
/application/php/sbin/php-fpm

8. 配置Nginx支持PHP程序请求访问

8.1 修改Nginx配置文件

(1)查看当前配置

[root@web01 /application/nginx/conf]# cat -n nginx.conf
     1	worker_processes  1;
     2	error_log logs/error.log;
     3	events {
     4	    worker_connections  1024;
     5	}
     6	http {
     7	    include       mime.types;
     8	    default_type  application/octet-stream;
     9	    sendfile        on;
    10	    keepalive_timeout  65;
    11	    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    12	                      '$status $body_bytes_sent "$http_referer" '
    13	                      '"$http_user_agent" "$http_x_forwarded_for"';
    14	include extra/01_www.conf;
    15	include extra/02_blog.conf;
    16	include extra/03_bbs.conf;
    17	include extra/04_status.conf;
    18	}

(2)配置PHP程序解析,这里以Blog为例

[root@web01 /application/nginx/conf/extra]# cat 02_blog.conf
server {
 listen 80;
 server_name blog.etiantian.org;
 location / {
  root html/blog;
  index index.html index.htm;
 }
 location ~ .*.(php|php5)?$ {
  root html/blog;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  include fastcgi.conf;
 }
}

8.2 检查并启动Nginx

[root@web01 /application/nginx/conf/extra]# nginx -t
nginx: the configuration file /application/nginx-1.18.0//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.18.0//conf/nginx.conf test is successful
[root@web01 /application/nginx/conf/extra]# nginx -s reload

8.3 测试LNMP环境生效情况

(1)测试PHP解析请求是否OK

# 添加index.php
[root@web01 /application/nginx/conf]# echo '<?php phpinfo(); ?>' > ../html/blog/test_info.php
[root@web01 /application/nginx/conf]# cat ../html/blog/test_info.php
<?php phpinfo(); ?>

# 调整Windows机器的hosts文件,添加好对应的解析
192.168.1.51 www.etiantian.org bbs.etiantian.org blog.etiantian.org etiantian.org

# 访问测试
[root@web01 /application/nginx/conf]# ping blog.etiantian.org
PING www.etiantian.org (192.168.1.51) 56(84) bytes of data.
64 bytes from www.etiantian.org (192.168.1.51): icmp_seq=1 ttl=64 time=0.268 ms
^C
--- www.etiantian.org ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.268/0.268/0.268/0.000 ms

(2)针对Nginx请求访问PHP,然后PHP连接MySQL的情况进行测试

# 编辑test_mysql.php,加入如下内容
[root@web01 /application/nginx/conf]# vim ../html/blog/test_mysql.php
<?php
//$link_id=mysqli_connect('主机名','用户','密码');
$link_id=mysqli_connect('localhost','root','xts123') or mysql_error();
if($link_id){
echo "mysql successful by xts.
";
}else{
echo mysql_error();
}
?>

# 服务器本地测试连接数据库
[root@web01 /application/nginx/conf]# /application/php/bin/php ../html/blog/test_mysql.php 
mysql successful by xts.

# 浏览器测试如下

原文地址:https://www.cnblogs.com/xiets/p/13111265.html