编译安装部署Lnmp

编译安装nginx

http://nginx.org/

useradd -r -s /sbin/nologin nginx
yum -y install zlib gcc gcc-c++ libgcc zlib-devel pcre pcre-devel openssl openssl-devel libxslt-devel gd gd-devel GeoIP GeoIP-devel libxml2 libxml2-dev

tar xf nginx-1.22.0.tar.gz
cd nginx-1.22.0/
./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/nginx \
--with-file-aio \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module \
--with-http_image_filter_module \
--with-http_geoip_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/subsys/nginx \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_gunzip_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-pcre \
--with-http_v2_module

make -j 2 && make install

#配置
cd /usr/local/nginx
#修改部分配置
vim ./conf/nginx.conf
user nginx;
worker_processes  auto;
pid        /var/run/nginx.pid;
error_log  logs/error.log  notice;
worker_rlimit_nofile 65535;

events {
	#设置工作模式
    use epoll;
	#设置最大连接数
    worker_connections  65535;
}
http {
	#指明可被解析的文件类型
    include       mime.types;
    default_type  application/octet-stream;
	#定义日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $scheme  $request_filename $args';

    access_log  logs/access.log  main;
    
	#关闭显示nginx版本号
    server_tokens off;
    
    sendfile        on;
    #防止网络阻塞
    tcp_nopush     on;
    
    #keepalive_timeout  0;
    keepalive_timeout  65;


    #优化相关的配置
    server_names_hash_bucket_size 128;
    client_max_body_size 20m;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    
    #打开压缩
    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    
    #虚拟主机的开始
    server {
       #指定监听端口
        listen       80;
       #指定ip或者域名
        server_name  localhost 10.50.34.88;
       #指定字体 
        #charset koi8-r;
        charset utf-8;
        #指定虚拟主机日志
        access_log  logs/host.access.log  main;
    	#设置访问根时的回应
        location / {
            #设置工作目录
            root   html;
            #设置主页
            index  index.html index.htm;
        }
        #设置404时的页面            /404.html指的是工作目录下的404.html
        error_page  404              /404.html;
    
        #redirect server error pages to the static page /50x.html
        
        #指定5系列状态码时跳转页面
        error_page   500 502 503 504  /50x.html;
        #设置当访问/50x.html时的操作
        location = /50x.html {
            #设置当前的工作目录
            root   html;
        }
    }
}



#要不间断服务地重新启动Nginx,可以使用如下命令:
$ /usr/local/nginx/sbin/nginx -s reopen
$ /usr/local/nginx/sbin/nginx -s reload

#关闭Nginx服务
$ /usr/local/nginx/sbin/nginx -s stop
$ /usr/local/nginx/sbin/nginx -s quit

编译安装mysql

https://downloads.mysql.com/archives/community/

#安装依赖
yum -y install make gcc gcc-c++ ncurses ncurses-devel bison libtirpc-devel cmake3 bison-devel bison perl perl-devel openssl openssl-devel

#安装rpcsvc-proto
tar xf rpcsvc-proto-1.4.3.tar.xz
cd rpcsvc-proto-1.4.3/
./configure 
make -j 2 && make install

#新建用户
useradd -r -s /bin/false mysql
mkdir /data/mysql
chown mysql.mysql /data/mysql
#升级为10.2.1版本
#安装第三方scl源仓库
yum -y install centos-release-scl
#安装gcc 10.2.1 的版本
yum install devtoolset-10-gcc devtoolset-10-gcc-c++ devtoolset-10-binutils -y
#激活gcc 10.2.1
scl enable devtoolset-10 bash
#编译安装mysql
tar xf mysql-boost-8.0.28.tar.gz
cd mysql-8.0.28
cmake3 . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_UNIX_ADDR=/data/mysql/mysqld.sock \
-DEXTRA_CHARSETS=all \
-DMYSQL_USER=mysql  \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_unicode_ci \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DENABLED_PROFILING=1 \
-DMYSQL_TCP_PORT=3306 \
-DWITH_DEBUG=0  \
-DDOWNLOAD_BOOST=0 \
-DFORCE_INSOURCE_BUILD=1 \
-DWITH_BOOST=boost
make -j 12 && make install
#新建快捷方式
ln -s /usr/local/mysql/bin/* /usr/local/bin/
#新建日志文件夹
mkdir -p /usr/local/mysql/logs/
#新建配置文件
rm -rf /etc/my.cnf
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/logs/mysqld.pid
innodb_log_file_size=1024M
default-authentication-plugin=mysql_native_password
character-set-server=utf8
collation-server=utf8_bin
[client]
port=3306
default-character-set=utf8
socket=/data/mysql/mysql.sock

#修改根目录权限
chown -R mysql:mysql /usr/local/mysql/

#初始化
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

#复制服务管理脚本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

#添加服务
chkconfig --add mysqld

#启动服务
service mysqld start

#访问数据库
mysql

#修改root密码
mysql> alter user "root"@"localhost" identified by "xxxxxxx";
mysql> flush privileges;
#新建用户
mysql> create user 'root'@'%' identified by 'xxxxxxx';
mysql> grant all privileges on *.* to "root"@'%';
mysql> flush privileges;

如果编译过程中出现下面的问题,可以通过扩展swap解决,或者接着再编译也行

解决方案:

#获取要增加的2G的SWAP文件块
dd if=/dev/zero of=/swapfile bs=1k count=2048000
#创建SWAP文件
mkswap /swapfile 
#激活SWAP文件
swapon /swapfile   
#查看SWAP信息是否正确
swapon -s  
#添加到fstab文件中让系统引导时自动启动
echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab

swapfile文件的路径在/var/下,编译完后, 如果不想要交换分区了, 可以删除。

删除交换分区:

swapoff /swapfile
rm -rf /swapfile

至此,问题解决。

编译安装PHP

https://www.php.net/downloads.php

依赖库安装

yum -y install libxml2 libxml2-devel bzip2 bzip2-devel libjpeg-turbo  libjpeg-turbo-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel libcurl libcurl-devel libjpeg libjpeg-devel curl curl-devel openssl openssl-devel sqlite-devel

还需要手动安装libzip

$ cd /data/
$ wget https://libzip.org/download/libzip-1.3.2.tar.gz
$ tar xf libzip-1.3.2.tar.gz
$ cd libzip-1.3.2/
$ ./configure && make && make install
$ export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"

安装remi源

https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/

$ wget https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm
$ rpm -ivh remi-release-7.rpm

用remi源安装oniguruma5php

$ yum -y install --enablerepo=remi oniguruma5php oniguruma5php-devel

编译安装PHP7

下载php7安装包

https://www.php.net/downloads.php#v7.4.30

$ cd /data/
$ tar xf php-7.4.30.tar.gz
$ cd php-7.4.30/
$ ./configure  \
--prefix=/usr/local/php7  \
--enable-fpm  \
--with-fpm-user=nginx  \
--with-fpm-group=nginx  \
--with-pdo-mysql=mysqlnd  \
--with-mysqli=mysqlnd  \
--with-zlib  \
--with-curl  \
--enable-gd  \
--with-jpeg=/usr   \
--with-freetype=/usr  \
--with-openssl  \
--enable-mbstring  \
--enable-xml  \
--enable-session  \
--enable-ftp  \
--enable-pdo \
-enable-tokenizer  \
--with-zip
$ make && make install
$ cp php.ini-production  /usr/local/php7/lib/php.ini
$ cp sapi/fpm/php-fpm.service	 /usr/lib/systemd/system/

--with-pdo-mysql=mysqlnd

表示使用mysqlnd驱动,这里选项涉及两个概念,一个是pdo,另一个是mysqlnd.

PDO是PHP Data Objects的缩写,它是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以使得PHP应用不用去关心具体要连接的数据库类型,也就是说,如果使用PDO的API,可以在任何需要的时候无缝切换数据库服务器,比如从Oracle到MySQL,仅仅需要修改很少的PHP代码。它的功能类似于JDBC、ODBC、DBI之类接口。因此,这里的"--with-pdo-mysql"就是PHP与MySQL进行连接的方式。

mysqlnd是mysql native driver的简写,它是由PHP官方提供的mysql驱动连接代码,它出现的目的是代替旧的libmysql驱动,而libmysql是mysql官方自带的mysql与php连接的驱动,从PHP5.3开始已经不推荐使用libmysql驱动,而建议使用mysqlnd,而在PHP7版本中,libmysql驱动已经被移除。

因此,在PHP7中,“--with-mysql=mysqlnd”的写法已经被废除。另外,由于mysqlnd内置于PHP源代码,因此在编译安装php时就不需要预先安装好mysql, 这将减化不少安装工作量。

--with-mysqli=mysqlnd

mysqli叫做 “MySQL增强扩展”。也是PHP连接mysql数据库的一种方式,这里也使用mysqlnd驱动进行连接。

Nginx与PHP-FPM整合原理

PHP-FPM是一个第三方的FastCGI进程管理器,最先它是作为PHP的一个补丁来开发的,现在PHP-FPM已经集成到了PHP源码中,在安装PHP的时候,通过指定“--enable-fpm”选项即可启用PHP-FPM功能。

PHP-FPM管理的进程包含master进程和worker进程两种。master进程只有一个,主要负责监听端口,接收来自Web Server的请求,而worker进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌了一个PHP解释器,是PHP代码真正执行的地方。

那么Nginx又是如何发送请求给PHP-FPM的呢,这就要从Nginx层面讲起了,我们知道,Nginx不仅仅是一个Web服务器,也是一个功能强大的代理服务器,除了进行http请求的代理,也可以进行许多其他协议请求的代理,包括本节介绍的与PHP-FPM相关的FastCGI协议。为了能够使Nginx理解FastCGI协议,Nginx提供了一个FastCGI模块来将http请求映射为对应的FastCGI请求,这样,Nginx就可以将请求发送给PHP-FPM了,也就实现了Nginx与PHP-FPM的集成。

修改配置文件

$ cd /usr/local/php7/
$ cp etc/php-fpm.conf.default etc/php-fpm.conf
$ cat /usr/local/php7/etc/php-fpm.conf | egrep -v '((^$)|^;)'
[global]
include=/usr/local/php7/etc/php-fpm.d/*.conf
$ cd etc/php-fpm.d/
$ cp www.conf.default www.conf
$ cat /usr/local/php7/etc/php-fpm.d/www.conf | egrep -v '((^$)|(^;))'
[www]
user = nginx
group = nginx
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 100
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 50
  • user和group用于设置运行php-fpm进程的用户和用户组。

  • listen是配置php-fpm进程监听的IP地址以及端口,默认是127.0.0.1:9000

  • pm.max_children用于设置php-fpm的进程数。

  • pm:pm用来指定php-fpm进程池开启进程的方式,有两个值可以选择,分别是static(静态)和dynamic(动态)。

  • pm.max_children:在static方式下表示固定开启的php-fpm进程数量,在dynamic方式下表示开启php-fpm的最大进程数。

  • pm.start_servers:表示在dynamic方式下初始开启php-fpm进程数量。

  • pm.min_spare_servers:表示在dynamic方式空闲状态下开启的最小php-fpm进程数量。

  • pm.max_spare_servers:表示在dynamic方式空闲状态下开启的最大php-fpm进程数量,这里要注意pm.max_spare_servers的值只能小于等于pm.max_children的值。

配置Nginx来支持PHP

$ vim /usr/local/nginx/conf/nginx.conf
# 在server下配置个location
location ~ \.php$ {
    root           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和php-fpm服务

$ /usr/local/php7/sbin/php-fpm
$ /usr/local/nginx/sbin/nginx

测试Nginx对PHP的解析功能

创建一个info.php文件,内容如下:

<?php phpinfo(); ?>

然后通过浏览器访问http://www.laohe.icu/index.html,默认会在浏览器显示“Welcome to Nginx!”表示Nginx正常运行。

接着在浏览器中访问http://www.iaohe.icu/info.php,如果PHP能够正常解析,会出现PHP安装配置以及功能列表统计信息。

也可以通过如下命令查看PHP安装的模块信息:

/usr/local/php7/bin/php -m

通过输出可以判断,目前已经成功安装了哪些模块,同时确认需要的模块是否已经正常安装,这里重点需要注意的是mysqli、mysqlnd、pdo_mysql、gd、curl、openssl、pcre等常用功能模块是否已经安装好。

测试PHP连接MySQL是否正常

1、mysqli方式连接MySQL的代码

cat /usr/local/nginx/html/1.php

<?php
$conn = mysqli_connect('127.0.0.1', 'root', 'xxxxxxx', 'mysql');
if(!$conn){
die("数据库连接错误" . mysqli_connect_error());
}else{
echo"数据库连接成功";
}

2、pdo-mysql方式连接MySQL的代码

cat /usr/local/nginx/html/2.php

<?php
try{
$pdo=new pdo('mysql:host=127.0.0.1;dbname=mysql','root','xxxxxxx');
}catch(PDDException $e){
echo "数据库连接错误";
}
echo "数据库连接成功";
?>

posted @ 2023-02-20 09:57  厚礼蝎  阅读(43)  评论(0编辑  收藏  举报