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中是否添加成功
安装apache
安装通用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不变)
安装nginx
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)
反向代理
安装mysql
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
<span style="color:#333333;">yum install gcc gcc-c++</span>
yum install gcc gcc-c++
#configure.cmake编译的(他的功能相当于./configure)
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
第4步:配置文件
拷贝配置文件(源配置在压缩包、解压后的目录中)
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的进程不在,找不到了,也就解释不了了
分析php.ini和php-fpm.conf
浏览器只能解析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