centos7源码编译安装lamp/lnmp
阅读原文时间:2022年04月07日阅读:1

centos7源码编译安装lamp/lnmp

线程:是各种工种(cpu调度的是线程)

进程 是一件事情, 线程 是 同一个时间范围内 同时干多件事情

只是线程 有共享变量,线程在进程内互相通信。

总结

源码编译方式的软件安装三部曲:

1、下载(找官网)、解压、进入解压后的目录

2、编译参数

3、make && make install安装

php扩展安装舞步曲:

1、下载(找pecl)、解压、进入解压后的目录

2、使用php自带的二进制脚本phpize弄成可编译的

3、编译参数

4、make && make install安装

5、将扩展添加到php.ini中,重启php,看php -m中是否添加成功

安装通用6步曲(和总结那3步是一样的,只是上面写的粗旷,这里细化了):

1、下载

2、解压

3、进入解压后的目录

4、配置编译参数(./configure …..的)

5、编译 make

6、使用echo $?看是否有错误。

注意点:这些几步曲,是汉字概括的总结,是为了方便记忆。具体的安装还是以指令为主

1、缺少依赖,安装依赖时,在缺少的那个依赖后面,加上-devel(开发版)

2、安装依赖也可以用echo  $?看

3、如果是./configure的时候缺少依赖-》安装依赖-》依赖安装完成-》继续make

如果是make的时候缺少依赖-》安装依赖-》依赖安装完成-》删除第2步解压后的目录-》重新解压-》重新./configure(防止一些奇怪错误的发生)

                centos7安装apache

1、先下载(要装这3个)
wget  https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.6.3.tar.gz
wget  https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.6.1.tar.gz
wget  https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.32.tar.gz

2、安装 apr
tar xf  apr-1.6.3.tar.gz     #解压
cd apr-1.6.3    #每个安装包,解压后都有configure(编译参数)
./configure  --prefix=/usr/local/apr  #make(编译之前)先使用comfigure配置下。首选配置就是指定安装目录
yum install gcc gcc-c++  -y
make && make install
2、安装 apr-util
tar xf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1
 ./configure  --prefix=/usr/local/apr-util  --with-apr=/usr/local/apr/
yum install expat-devel   #注意:make的时候出现,依赖错误。安装完依赖之后,把解压的删掉,重新解压。在进行configure,这样防止一些奇怪的问题出现
make && make install
2、安装httpd
tar xf httpd-2.4.32.tar.gz
cd httpd-2.4.32
yum install pcre-devel  openssl-devel -y  #依赖找-devel开发版的
./configure --prefix=/usr/local/httpd  --sysconfdir=/usr/local/httpd/etc/ --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
make && make install

apache配置多站点:基于端口(不同的端口指向不同的根目录)

1、在httpd.conf中修改;注意:下图白色注释要去掉不然报错

2、修改/usr/local/httpd/etc/extra/httpd-vhosts.conf

3、访问(下图的防火墙没有关,所以不能在浏览器访问)

apache配置多站点:基于域名(不同的域名指向不同的根目录)

1、在httpd.conf中修改;注意:下图白色注释要去掉不然报错

2、修改/usr/local/httpd/etc/extra/httpd-vhosts.conf

3、在/etc/hosts中加入域名

4、访问(下图的防火墙没有关,所以不能在浏览器访问)

每一个软件运行都有基于一个用户名的

平滑重启:用户一边访问,后台一边重启(等该进程访问完毕,才重启。并且pid不变)

wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar xf nginx-1.12.2.tar.gz
cd nginx-1.12.2
groupadd www
useradd  -g www www -M -s /sbin/nologin
yum install openssl-devel pcre-devel gcc gcc-c++ -y
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module  --with-http_gzip_static_module  --with-http_sub_module --with-pcre
make && make install

配置文件大致解释

总结:配置文件是嵌套式的,http块中配置server(虚拟主机)

其他的配置方式,如伪静态、gzip压缩等。请点击查看

user  www www;  //用户运行

worker_processes  auto; //nginx 的进程数  master 主进程 worker 工作进程

#error_log  logs/error.log;

#error_log  logs/error.log  notice;   //各种日志

#error_log  logs/error.log  info;

pid        /var/run/nginx.pid;       //进程pid存放位置

# 修改 文件描述符 ulimit -SHn 65535  /etc/profile

events {

worker_connections  65535;     //每个work进程打开的最大连接数

}

http {

公共的配置项,除server外,全是公共的配置项

server {

}

}

http{

//文件扩展名与文件类型映射表

include       mime.types;  //location对应的,后缀和值都在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"';

#access_log  logs/access.log  main;

//下图是,变量和访问日志里值的对比

sendfile  on  //普通应用为on  下载io的为off

#客户端请求单个文件的最大字节数

client_max_body_size 8m; //上传文件 默认是1M

#防止网络阻塞

tcp_nopush on;

tcp_nodelay on;

#客户端相关设置

keepalive_timeout 60; //连接超时时间,单位是秒

client_header_timeout 10;  #客户端请求头读取超时时间

client_body_timeout 10; #设置客户端请求主体读取超时时间

send_timeout 10; #响应客户端超时时间

#gzip模块设置

gzip on; #开启gzip压缩输出

gzip_min_length 1k; #最小压缩文件大小

gzip_buffers 4 16k; #压缩缓冲区

gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)

#压缩等级 1-9 等级越高,压缩效果越好,节约宽带,但CPU消耗大

gzip_comp_level 2;

#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。

gzip_types text/plain application/x-javascript text/css application/xml;

#前端缓存服务器缓存经过压缩的页面

#虚拟主机定义

server {

listen       80; #监听端口

server_name  localhost; #访问域名

#charset koi8-r; #编码格式,若网页格式与此不同,将被自动转码

#access_log  logs/host.access.log  main; #虚拟主机访问日志定义

location / { #对URL进行匹配

root   html; #访问路径,可相对也可绝对路径

index  index.html index.htm;  #首页文件。以下按顺序匹配

}

#error_page  404              /404.html; #错误信息返回页面

# redirect server error pages to the static page /50x.html

error_page   500 502 503 504  /50x.html;

location = /50x.html {

root   html;

}

#访问URL以.php结尾则自动转交给127.0.0.1

# proxy the PHP scripts to Apache listening on 127.0.0.1:80

#location ~ \.php$ {

#    proxy_pass   http://127.0.0.1;

#}

#php脚本请求全部转发给FastCGI处理

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

#location ~ \.php$ {

#    root           html;

#    fastcgi_pass   127.0.0.1:9000;

#    fastcgi_index  index.php;

#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

#    include        fastcgi_params;

#}

#禁止访问.ht页面 (需ngx_http_access_module模块)

# deny access to .htaccess files, if Apache's document root

# concurs with nginx's one

#location ~ /\.ht {

#    deny  all;   //禁止后缀为.ht的访问,和apache那权限差不多

#}

}

}

基于端口/域名配置多站点:

基于端口的多站点配置(域名不变,端口变)

使用场景:1、内网测试;2、接口(不同功能模快,弄个站点,调用)

注意:访问时,拿ip带上不同的端口号

基于域名的多站点配置(端口不变,域名变)端口也可以写成不一样的。

1、一台服务器放多个项目,都可以在公网进行访问

注意:访问时,使用不同的域名(因为端口都是80)

反向代理

负载均衡,请点击参考我这篇博文

wget  https://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.59.tar.gz
tar xf mysql-5.5.59.tar.gz
cd mysql-5.5.59
groupadd mysql
useradd -g mysql  mysql -M  -s /sbin/nologin
yum install cmake ncurses-devel  autoconf

&nbsp;<span style="color:#333333;">yum install gcc gcc-c++</span>


#configure.cmake编译的(他的功能相当于./configure)

&nbsp;&nbsp;&nbsp;&nbsp;cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_DEBUG=0 -DWITH_READLINE=1 -DWITH_EMBEDDED_SERVER=1 -DENABLED_LOCAL_INFILE=1
make && make isntall

初始化数据库后才能启动

初始化数据库

cd /usr/local/mysql/scripts

./mysql_install_db --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql

启动mysql

cd /usr/local/mysql/support-files

./mysql.server start|stop|restart

连接数据库(默认密码为空,要关防火墙)

注意:如果你是链接虚拟机上的mysql,要改成你内网ip

修改完后,刷新权限

删除匿名用户

cd /usr/local/mysql/bin

会报一个找不到mysql….这一系列命令的错

PATH="$PATH:/usr/local/mysql/bin";    //设置成永久生效的全局变量,将它添加到vim /etc/profile的最后一行

1、Enter current password for root (enter for none)    //输入当前root用户的密码,是'',直接回车

2、Set root password?    //设置root的新密码,输入y

New password    //输入新密码

Re-enter new password    //在输入一遍新密码

3、Remove anonymous users?    //删除匿名用户,输入y

4、Disallow root login remotely?    禁止root用户的远程登录(也就是说,root用户只能在服务器登录。用普通用户连接navicat),输入y

5、Remove test database and access to it?    //删除测试数据库,输入y

6、Reload privilege tables now?    //刷新权限,输入y

创建并给普通用户分配权限

供其连接远程工具navicat等

grant select,delete,update,insert on blog.* to 'blog'@'192.168.2.101' identified by '123456';

flush privileges;

设置全局变量

vim  /etc/profile

PATH="$PATH:/usr/local/mysql/bin"   //永久生效

命令行执行

export PATH="$PATH:/usr/local/mysql/bin"  //临时执行

或者 cp  /usr/local/mysql/bin/mysql  到  /usr/bin

配置文件详解

让mysql还是用/etc/init.d启动

cd /usr/local/mysql/support-files/  #切换进mysql安装目录下的启动脚本

cp mysql.server /etc/init.d/mysql    #mysql的启动脚本,复制到/etc/init.d并下面改个名字

/etc/init.d/mysql start                     #使用新指令启动mysql

注意:这里的配置文件,随便复制出去一个,改成my.cnf就能用了

配置文件my.cnf

存放的位置探讨:

https://www.toutiao.com/i6391756230875939330/

[client]

port = 3306

socket = /tmp /mysql.sock

[mysqld]

user = mysql             #数据库初始化时指定的,初始化没指定,直接在配置文件中改

port = 3306

socket = /tmp/mysql.sock

basedir = /usr/local/mysql  #数据库初始化时指定的,初始化没指定,直接在配置文件中改

datadir = /data/mysql/data/  #数据库初始化时指定的,初始化没指定,直接在配置文件中改

max_connections = 3000  #MySQL允许最大的进程连接数,如果经常出现Too Many Connections的错误提示,则需要增大此值。默认100(此处修改就是永久修改)

查看最大连接数  show variables like ‘%connections%’

查看当前最大连接数  show processlist

set global  max_connections=300;//临时修改

永久修改:是改配置文件  然后重启数据库

注意:这些全局变量都是在my.cnf中配置的,如果没有就是默认

解决方法:

现在线上正用着呢,不能停并发大,连接数不够用了。

就用set global先设置,配置文件的也改咯。有时间咯在重启mysql

#sort_buffer_size = 2M  //connection级参数,在每个connection(session)第一次需要使用这个buffer的时候,一次性分配设置的内存。

Sort_Buffer_Size 并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会耗尽系统内存资源。例如:500个连接将会消耗 500*sort_buffer_size(8M)=4G内存

Sort_Buffer_Size 超过2KB的时候,就会使用mmap() 而不是 malloc() 来进行内存分配,导致效率降低。 系统默认2M,使用默认值即可

#join_buffer_size = 2M  #用于表间关联缓存的大小,和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享。系统默认2M,使用默认值即可

thread_cache_size = 300  #默认38

服务器线程缓存这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能.通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。设置规则如下:

1GB 内存配置为8,

2GB配置为16,

3GB配置为32,

4GB或更高内存,可配置更大。

#thread_concurrency = 8  #系统默认为10,使用10先观察

设置thread_concurrency的值的正确与否, 对mysql的性能影响很大, 在多个cpu(或多核)的情况下,错误设置了thread_concurrency的值, 会导致mysql不能充分利用多cpu(或多核), 出现同一时刻只能一个cpu(或核)在工作的情况。

thread_concurrency应设为CPU核数的2倍. 比如有一个双核的CPU, 那么thread_concurrency的应该为4;2个双核的cpu, thread_concurrency的值应为8

query_cache_size = 64M  #在MyISAM引擎优化中,这个参数也是一个重要的优化参数。但也爆露出来一些问题。

机器的内存越来越大,习惯性把参数分配的值越来越大。这个参数加大后也引发了一系列问题。

我们首先分析一下 query_cache_size的工作原理:一个SELECT查询在DB中工作后,DB会把该语句缓存下来,当同样的一个SQL再次来到DB里调用时,DB在该(查询的)表没发生变化的情况下把结果从缓存中返回给Client。

这里有一个关建点,就是DB在利用Query_cache工作时,要求该语句涉及的表在这段时间内没有发生变更。

那如果该表在发生变更时,Query_cache里的数据又怎么处理呢?

首先要把Query_cache和该表相关的语句全部置为失效,然后在写入更新。那么如果Query_cache非常大,该表的查询结构又比较多,查询语句时效也慢,一个更新或是Insert就会很慢,这样看到的就是Update或是Insert怎么这么慢了。

所以在数据库写入量或是更新量也比较大的系统,该参数不适合分配过大。而且在高并发,写入量大的系统,建议把该功能禁掉。

query_cache_limit = 4M  #指定单个查询能够使用的缓冲区大小,缺省为1M

query_cache_min_res_unit = 2k  #默认是4KB,设置值大,对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费

查询缓存碎片率 = qcache_free_blocks / qcache_total_blocks * 100%

#如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。

#查询缓存利用率 = (query_cache_size – qcache_free_memory) / query_cache_size * 100%

#查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。

#查询缓存命中率 = (qcache_hits – qcache_inserts) / qcache_hits * 100%

#default-storage-engine = MyISAM

#default_table_type = InnoDB      #开启失败,因为你上面设置的表引擎不是innodb

myisam_recover  #自动检查和修复没有适当关闭的 MyISAM 表

skip-name-resolve

lower_case_table_names = 1

server-id = 1 #主从配置,1为master

innodb_buffer_pool_size = 2048M       //默认是物理内存的50%

这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的可以,然而Innodb在默认的 innodb_buffer_pool_size 设置下却跟蜗牛似的。由于Innodb把数据和索引都缓存起来,无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存(相对于物理内存计算的)。一些应用于 key_buffer 的规则有 — 如果你的数据量不大,并且不会暴增,那么无需把 innodb_buffer_pool_size 设置的太大了

log-bin = mysql-bin  #binlog日志文件,记录【增删改】的sql语句,这样就是开启了,如果数据库出问题了,可以恢复。该文件默认保存在/usr/local/mysql/data/mysql-bin.00001…(存的是二进制看不懂)

expire_logs_days        =7                       #binlog过期清理时间(单位天),清理之前要确定自己备份过数据库

几种常见的数据库错误(都是报下图)

思路:看报错去错误日志 cd /usr/local/mysql/data/主机名.err

第1种:innodb_buffer_pool_size = 1G  设置大于服务器内存

第2种:drwxr-xr-x.  5 root root  4096 Apr 19 03:25 data //运行用户时mysql(前面那root),改成root后就写不进去了

第3种:配置项写错

使用/usr/local/mysql/bin下的工具

修改密码

mysqladmin -uroot -p'123456' password 'root'  //新密码要和password中间空个格

binlog日志转成sql语句

/usr/local/mysql/bin/mysqlbinlog  binlog日志 > heh.sql //其实这就是增量数据

数据库备份 恢复

物理备份: xtrabackup(几十G用这个)

逻辑备份:mysqldump(数据量不是太多10G以下)

日志数据备不备份都行,不重要,丢失也没事

原则:异地备份  恢复演练  速度(建议:专门弄个只有备份权限的用户,进行操作)

导出数据以及表结构

/usr/local/mysql/bin/mysqldump  -uroot -p123456  数据库名 >/home/test.sql

只导结构  不导出数据

/usr/local/mysql/bin/mysqldump  -uroot -p123456 -d 数据库名 > /home/test.sql

只导数据 不导结构

/usr/local/mysql/bin/mysqldump  -uroot -p123456 -t 数据库名 > /home/test.sql

导入数据

source  /home/test.sql

全量备份和增量备份

完整的数据=全量mysqldump备份数据+binlog的实时数据

1、备份数据 && 进行binglog的日志切割(通过--flush-logs,全量备份时重新生成一个binlog日志)

/usr/local/mysql/bin/mysqldump  --flush-logs  -uroot -p112233 hehe > /home/hehe.sql  //备份

2、将--flush-logs生成的binlog日志,转成sql语句

3、此时就可以恢复了,先导入全量(直接备份库的sql)-》在导入增量(binlog日志转化成的sql)

读写分离

读写分离根据主从配置实现,代码层面上的读(从库)和写(主库)的分开

读写分离是代码层面上的(写连主库;读连从库,多个从库放到一个数组中随机选择);

主从配置是运维配置层面上的

解决问题:

1 网站访问量大

2 解决备份数据(专门弄个从库mysqldump用)

主从的原理

(1)    master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
 (2)    slave将master的binary log events拷贝到自己的中继日志(relay log);
 (3)    slave重做中继日志(执行binglog中的sql语句)中的事件,将改变反映它自己的数据。

可能问题:

1、对实时性要求特别高,写到了主数据库 但是从数据库的数据没有同步过去(这种情况,多发生于主库大量写入,同步延迟)

解决:在主库旁加个redis数据库,写入的时候连redis一起写入,查的时候先查redis库。过xx毫秒后,查询自动切换到从库

2、主数据库 如果有问题(如挂了)。Insert update delete会有影响。从库select  基本上没问题(多个机房放多个从服务器,不能都挂咯吧)

上图,不需要我们在代码上进行读写分离,而能达到主从切换的效果,他是个中间件。他能判断我们的sql语句,insert、update、delete发给主,select发给从。

网站架构

数据库多实例的配置(基于端口的,memcache和redis也可以这样干):一台服务器上让他跑好几个数据库,这样就不用买1个数据库买一台服务器了

配置主从复制

注意:我这配的是一主一从的(我这是真实服务器),多主一从的话,只需要在从库使用CHANGE MASTER…..配置不同的主库即可(就是多次执行这个指令)

总结:代码层的操作,主从库都用各自的普通用户连接,注意权限

首先,配置master主数据库

log-bin=mysql-bin #my.cnf中开启binlog日志

server-id  = 1  #my.cnf中,主的一定是1

//分配普通用户,从库复制时需要用到(通过从库的CHANGE MASTER配置,从库上用这个账号登录,将主库的binlog复制到自己的中继日志)

grant replication slave on *.* to 'repl'@'47.94.21.171' identified by '123456';

//注意:如果是自己弄俩虚拟主机搭的内网,ip那写 ip或ip/子网掩码 如 192.168.2.0/255.255.255.0

flush privileges;   //刷新权限,在从库服务器使用该账号进行登录测试,能登录成功,在进行下一步

show  master status #查看主库状态

然后,配置 从数据库

第1步:修改配置文件(修改的是从库的)

read-only = 1         //只读(不能写)自己加

replicate-do-db = test5  //要复制的数据库(复制主库中的哪个数据库)填一个不存在的库,配置成功后,在从主库中创建该库,然后看从库是不是多了一个库,就知道

server-id       = 2   #从库编号,非1即可。建议用ip的最后一位,好记

注意:改完后重启数据库

第2步:配置master 不然他也不知道去哪复制啊(登录进mysql,执行该命令)

//复制的时候复制这个
CHANGE MASTER TO MASTER_HOST='47.94.21.171', MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='1234RD='123456',MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=565;

//写在这是为了方便看,这和上面那指令一样

CHANGE MASTER TO

MASTER_HOST='47.94.21.171', //主库ip

MASTER_PORT=3306,

MASTER_USER='repl', //主库设置的那普通用户

MASTER_PASSWORD='123456',

MASTER_LOG_FILE='mysql-bin.000004', //查看主库状态的file。#从哪个二进制日志开始复制(因为重启后会生成新的binlog)

MASTER_LOG_POS=1659;   //查看主库状态的position #从哪个位置开始复制

第3步:开启主从配置

start slave  #启动slave。开启之后才会有俩yes,俩yes代表配置成功

stop slave #停止slave的指令

show slave status    //查看slave同步状态

注意:俩都为no是没启动;replicate_do_db那如果是多个,中间以逗号分隔,就是多个主库(这样配叫,多主一从)

原因:主库没关防火墙,也有可能是selinux没关。

看这个http://www.mamicode.com/info-detail-2207077.html

4、从库创建个普通用户,使用普通用户连接从库(此时insert就无法执行成功了)

安装php

官网地址: http://php.net/

wget http://hk1.php.net/get/php-7.1.18.tar.gz/from/this/mirror

wget http://cn2.php.net/get/php-7.1.16.tar.gz/from/this/mirror  #第1步:下载,我装的这个

tar xf php.tar.gz #解压

cd php-7.1.16/  #切换进目录

安装依赖

yum install libxml2-devel curl-devel libjpeg-devel libpng-devel freetype-devel libxslt-devel -y

epel源(eprl 是yum的一个软件源,里面包含了许多基本源里没有的软件)

yum install http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y #更新erp源

yum install libmcrypt-devel -y #安装依赖

yum install libxslt-devel -y

第2步:编译参数(编译时候会报缺少依赖的错误,所以就给依赖放上面了)

注意注意注意!!!编译参数分3种,建议根据自己的需要进行复制

第1种:nginx的;

第2种:apache的;

第3种:nginx和apache通用的;

主要区别在于:

Nginx的编译参数用:--enable-fpm --with-fpm-user=www --with-fpm-group=www

Apache的编译参数用:--with-apxs2=/usr/local/httpd/bin/apxs

Nginx的编译参数

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir=/usr/local/freetype --with-mcrypt --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --with-xmlrpc --enable-zip --enable-soap --with-gettext --enable-opcache --with-xsl

注意:

1、--with-fpm-user=www用户可以新建,也可以nginx和mysql共用一个;

2、--with-mysql=mysqlnd  php7以下的加这个参数,7以上已经不让用mysql连接了

Apache的编译参数

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir=/usr/local/freetype --with-mcrypt --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --with-xmlrpc --enable-zip --enable-soap --with-gettext --enable-opcache --with-xsl --with-apxs2=/usr/local/httpd/bin/apxs

生成.so模块的关键在--with-apxs2=/usr/local/httpd/bin/apxs

既用apache也用nginx的编译参数

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir=/usr/local/freetype --with-mcrypt --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --with-xmlrpc --enable-zip --enable-soap --with-gettext --enable-opcache --with-xsl --with-apxs2=/usr/local/httpd/bin/apxs

注意:

1、少编译一个模块,对php运行的效率可能就高一些(就是用nginx或apche)

2、启动php时,会报[26-May-2018 08:50:44] ERROR: [pool www] cannot get uid for user 'www'这个错误,原因是编译参数中有--with-fpm-user=www --with-fpm-group=www而/etc/passwd中却没有www用户

第3步:安装

make && make install

问题:假如我们安装好后,需要重新编译怎么办呢??

正确的方法是:删除解压目录,重新解压,重新编译。如果是编译完,加参数的话,无需删除,直接加参数重新编译即可

赶时间方法是:

1、去解压后的目录,新参数跟在旧参数后面,直接重新编译(而不是只编译新添加的)

2、然后执行make && make install

拷贝配置文件(源配置在压缩包、解压后的目录中)

cp php.ini-development  /usr/local/php/etc/php.ini #开发环境的配置文件(php.ini-production生产环境用这个)

cd  /usr/local/php/etc

cp php-fpm.conf.default  php-fpm.conf #该文件在/usr/local/php/etc下面(文件最后一行引入了php-fpm.d/*.conf)

cd php-fpm.d

cp www.conf.default  www.conf  #php-fpm.d中的

目录分析

├── bin

|--- php 和 phpize

├── etc

├── include

├── lib

├── php

├── sbin #./php-fpm启动脚本

└── var

nginx配置php

说白了就是反向搭理,将php的文件转发给php处理

localtion / {

root html;

index index.php index.html index.htm; //解析这几种文件

}

location ~ \.php$ {

fastcgi_pass   127.0.0.1:9000;

fastcgi_index  index.php;

include        fastcgi.conf;

}

然后启动nginx,去执行php文件(随便建一个php去访问)

1、转圈:防火墙的问题

2、Find not found:配置的问题

解决1:fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; 导致的

include        fastcgi_params; 改成引入fastcgi.conf配置文件

解决2:还有可能是你代码目录所有者,不是nginx的www用户:

apache配置php

1、DirectoryIndex里面加上 index.html index.php #添加index.php

2、找到:

AddType  application/x-compress .Z

AddType application/x-gzip .gz .tgz

添加如下内容

AddType application/x-httpd-php .php  //注意 .php前面有一个空格

3、apache是给php当做一个模块加载进来,才能解析

LoadModule php7_module        modules/libphp7.so #编译安装没错的话,会自动加载进来

Apache和nginx处理php的区别

1、Apche杀掉php-fpm进程后照样能使用。因为它把php当做apache的一个模块(.so的模块)加载进来的。给模块注释掉才不能用

2、Nginx是以反向代理形式(找)php的,如果php这个9000的进程不在,找不到了,也就解释不了了

浏览器只能解析html、css、js这样的文件。

后端语言解释器,解释成浏览器能理解的。

通过nginx返回给浏览器

cgi(后端语言和nginx之间的通讯协议)  fast-cgi

php-fpm是进程管理器(5.4之后才有)

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

php.ini  是解释器(php-fpm的worker进程)的配置文件

php-fpm.conf 相当于是(php-fpm的master进程)的配置文件

php.ini配置文件

disable_functions =   //禁止运行的函数  system  exec  eval

max_execution_time = 30   //php脚本最大执行时间为30秒 0,则表示无时间限制

memory_limit = 128M       //允许运行php脚本占用的最大内存为8M,线上设为256

按top->shift+m->c 处理的数据越多占内存越大,一般是30M

error_reporting = E_ALL //开发环境   生产环境  E_ALL & ~E_DEPRECATED & ~E_STRICT

display_errors = On  //开启报错

post_max_size = 8M  //post最大文件限制

extension_dir  //扩展库放的目录  redis memcache

extension    //引入扩展库的文件名  redis.so

upload_max_filesize = 2M  //上传文件的最大(nginx配置文件中也有个限制)

session.save_handler = files   //配置session 写入方式 文件  内存  memcache tcp://127.0.0.1:11211

session.name = PHPSESSID   //session名  cookie

session.save_path = "/tmp” 默认session写入的位置

php-fpm.conf配置文件

user = www

group = www

listen = 127.0.0.1:9000

pm = dynamic

pm.max_children = 5

pm.start_servers = 2

pm.min_spare_servers = 1

pm.max_spare_servers = 3

slowlog = log/$pool.log.slow