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.\n";
}else{
echo mysql_error();
}
?>
# 服务器本地测试连接数据库
[root@web01 /application/nginx/conf]# /application/php/bin/php ../html/blog/test_mysql.php
mysql successful by xts.
# 浏览器测试如下