这个脚本是使用shell编写,为了快速在生产环境上部署lnmp/lamp/lnmpa(Linux、Nginx/Tengine/OpenResty、MySQL/MariaDB/Percona、PHP),适用于CentOS 6~7(包括redhat)、Debian 6~8、Ubuntu 12~16的32位和64位。 脚本特性 持续不断更新 源码编译安装,大多数源码是最新stable版,并从官方网址下载 提供多个数据库版本(MySQL-5.7, MySQL-5.6, MySQL-5.5, MariaDB-10.1, MariaDB-10.0, MariaDB-5.5, Percona-5.6, Percona-5.5, AliSQL-5.6, PostgreSQL, MongoDB) 提供多个PHP版本(PHP-7.1, PHP-7.0,PHP-5.6, PHP-5.5,PHP-5.4,PHP-5.3) 提供Nginx、Tengine、OpenResty 提供多个Apache版本(Apache-2.4,Apache-2.2) 根据自己需求安装PHP缓存加速器,提供ZendOPcache、xcache、apcu、eAccelerator。及php加解密工具ionCube、ZendGuardLoader、swoole、xdebug、Composer 根据自己需求安装Pureftpd、phpMyAdmin 根据自己需求安装memcached、redis jemalloc优化MySQL、Nginx 提供添加、删除虚拟主机脚本 提供Nginx/Tengine/OpenResty/Apache、MySQL/MariaDB/Percona、PHP、Redis、phpMyAdmin升级脚本 提供本地、远程(服务器之间rsync)、阿里云OSS、腾讯云COS和upyun备份 提供CentOS 6、7下HHVM安装 安装步骤 yum -y install wget screen curl python#for CentOS/Redhat #apt-get -y install wget screen curl python# for Debian/Ubuntu wget http://aliyun-oss.linuxeye.com/lnmp-full.tar.gz #阿里云经典网络内网下载 wget http://mirrors.linuxeye.com/lnmp-full.tar.gz # 包含源码,国内外均可下载 wget http://mirrors.linuxeye.com/lnmp.tar.gz # 不包含源码,建议仅国外主机下载 tar xzf lnmp-full.tar.gz #tar xzf lnmp.tar.gz cd lnmp # 如果需要修改目录(安装、数据存储、Nginx日志),请修改options.conf文件 screen -S lnmp # 如果网路出现中断,可以执行命令`screen -R lnmp`重新连接安装窗口 ./install.sh # 请勿sh install.sh或者bash install.sh这样执行 如何添加虚拟主机? ./vhost.sh 如何删除虚拟主机? ./vhost.sh del 如何管理ftp账号? ./pureftpd_vhost.sh 数据备份 cd ~/lnmp # 必须进入lnmp目录下执行 ./backup_setup.sh # 备份参数设置 ./backup.sh # 立即执行备份 crontab -e # 可添加到计划任务,如每天凌晨1点自动备份 0 1 * * * cd ~/lnmp;./backup.sh > /dev/null 2>&1 & 备份参数设置如下图: 如何管理服务? Nginx/Tengine/OpenResty: service nginx {start|stop|status|restart|reload|configtest} MySQL/MariaDB/Percona: service mysqld {start|stop|restart|reload|status} PHP: service php-fpm {start|stop|restart|reload|status} Apache: service httpd {start|restart|stop} HHVM: service supervisord {start|stop|status|restart|reload} 注:hhvm进程交给supervisord管理,了解更多请访问《Supervisor管理hhvm进程》 Pure-Ftpd: service pureftpd {start|stop|restart|status} Redis: service redis-server {start|stop|status|restart|reload} Memcached: service memcached {start|stop|status|restart|reload} 如何更新版本? ./upgrade.sh 跨大版本升级(如php):http://oneinstack.com/question/oneinstack-downgrade-if-php-version/ 如何卸载? ./uninstall.sh 如何重装? ./uninstall.sh # 请先备份数据好数据后再卸载,丢失数据概不负责 ./install.sh # 再次安装 更新日志 2018-03-18 新增阿里云COS、腾讯云COS备份;启用acme.sh支持通配符,禁用certbot;常规软件版本更新 2017-12-17 新增PostgreSQL、MongoDB、PHP7.2;Apache升级功能; 新增xdebug扩展;新增oneinstack更新;优化vhost.sh 2017-08-13 iptables可选; 新增pathinfo 2017-07-01 支持Debian9;PHP编译使用openssl1.0.2版本 2017-06-02 增加MariaDB 10.2 2017-05-15 增加腾讯云COS v4备份功能 2017-02-14 Nginx添加更多模块参数;新增Nginx magento2伪静态;Apache2.4 ssl默认开启http2 2016-11-02 增加AliSQL;默认启用jemalloc,去除tcmalloc 2016-10-15 数据库支持二进制或源码编译;PHP7支持ioncube、apcu;优化脚本格式 2016-08-21 增加./addons.sh...
为什么用 Nginx? 第一种方案: 使用 Docker 文档中的方法 使用另一个 Docker 镜像,差点成功 最终解决方案 在使用 Docker 容器来开发 PHP 微服务套件的过程中,作者遇到了容器数量过多的问题。 最近,我一直在使用 Docker 容器来开发 PHP 微服务套件。一个问题是 PHP 应用已经搭建,可以与 PHP-FPM 还有 Nginx(取代了简单的 Apche/PHP 环境)一起工作,因此每个 PHP 微服务需要两个容器(以及两个 Docker 镜像):一个 PHP-FPM 容器和一个 Nginx 容器。 这个应用运行了 6 个以上的服务,做个乘法就知道,在开发和生产之间会有约 30 个容器。于是我决定构建一个单独的 Nginx Docker 镜像,它可以使用 PHP-FPM 的主机名作为环境变量并运行单独的配置文件,而不用为每个容器构建单独的 Nginx 镜像。 在本文中,我介绍了自己从上图中的方法 1 到方法 2 的转换,最后采用的方案中采用了一种新的定制 Docker 镜像。该镜像的代码是开源的,如果读者碰到类似问题,可以提供给大家参考。 为什么用 Nginx? Nginx 和 PHP-FPM 配合使用能使 PHP 应用的性能更好,但不好的地方在于,和 PHP Apache 镜像不同,PHP-FPM Docker 镜像默认不是和和 Nginx 绑定在一起的。如果需要通过 Nginx 容器和 PHP-FPM 连接,需要在 Nginx 配置里为该后端增加 DNS 记录。比如,如果名为 php-fpm-api 的 PHP-FPM 容器正在运行,Nginx 配置文件应该包含下面部分: location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; # This line passes requests through to the PHP-FPM container fastcgi_pass php-fpm-api:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } 如果只服务于单独的 Nginx 容器,Nginx 配置中容器名字写死还可以接受,但如上所述,需要允许多个 Nginx 容器,每个对应于一个 PHP 服务。创建一个新的 Nginx...
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价,云服务器3年机/5年机限时抢购,低至 2.5折
前言 配置 1. 在nginx的主配置文件 2. 站点配置 3.验证 4. 遇到问题 前言 fastcgi_cache是一个nginx的插件,用于缓存fastcgi接口的执行结果,例如缓存php的执行结果。特别是php网站的首页与一些非交互页面,利用fastcgi_cache可以大幅度提升访问速度,并且降低php的执行压力。 配置 1. 在nginx的主配置文件 在主配置文件(nginx.conf)中添加缓存域 fastcgi_cache_path /dev/shm/nginx-cache levels=1:2 keys_zone=cgi_wpcache:200m inactive=1d; fastcgi_cache_path:缓存文件的路径,/dev/shm/为tmfs缓存文件系统, 实际储存在内存中,所以读写IO性能更高。 levels:缓存目录的结构层次,例如1:2,缓存文件会就生成在指定目录的再下两层目录中。 keys_zone:缓存域名称,在vhost内进行缓存时需要调用。 inactive:缓存不活动时间,若缓存内容在指定时间内未被访问将会被清理出缓存域。 2. 站点配置 location /archives/ { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /data/webroot/$fastcgi_script_name; include fastcgi_params; fastcgi_cache cgi_wpcache; fastcgi_cache_methods GET HEAD; fastcgi_cache_key $request_method$host$request_uri; fastcgi_cache_valid 200 2d; fastcgi_ignore_headers Cache-Control Expires Set-Cookie; add_header X-Cache “$upstream_cache_status”; } fastcgi_cache:指定缓存域 fastcgi_cache_methods:指定缓存的请求方式 fastcgi_cache_key:指定缓存文件的标识,这个标识会MD5转码存储在缓存域的目录下 fastcgi_cache_valid:指定缓存状态,例如上文中只缓存响应状态码为200的请求所产生的返回页面两天 fastcgi_ignore_headers:默认情况下fastcgi_cache会忽略有特殊header的请求,并不进行缓存,官网说明。但当我们添加这个参数后,这些限制将不在存在。 add_header 将会在返回请求的response的header中添加一个X-Cache字段表示是否进行了缓存。如果需要也可以在nginx日志中通过log_format添加$upstream_cache_status字段 ·MISS 未命中,请求被传送到后端 ·HIT 缓存命中 ·EXPIRED 缓存已经过期请求被传送到后端 ·UPDATING 正在更新缓存,将使用旧的应答 ·STALE 后端将得到过期的应答 3.验证 配置完成后重新加载nginx后通过curl -I 访问如下: [root@localhost local]# curl -I localhost/archives/1.php HTTP/1.1 200 OK Server: nginx/1.14.0 Date: Mon, 25 Jun 2018 06:48:05 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive Vary: Accept-Encoding X-Powered-By: PHP/7.0.30 Expires: Tue, 26 Jun 2018 06:48:05 GMT Cache-Control: max-age=86400 X-Cache: MISS 第一次访问 X-Cache: MISS 说明还未进行缓存。 [root@localhost local]# curl...
lamp架构wordpress和discuzx教程 背景 虚拟主机 fastcgi 部署流程 部署架构 环境 架构图 编译软件 安装开发环境和必要的包 编译httpd 编译php 安装mariadb 配置文件修改 修改httpd主机 修改fast-cgi主机 配置mysql 宿主机的hosts文件修改 安装wordpress和Discuzx 背景 虚拟主机 如今服务器的配置提升明显,单一主机上部署单一网站会对主机造成大量的性能损失,因此web服务虚拟主机的技术应运而生。所谓虚拟主机指的是在一台机器上运行多个网站(如company1.example.com和company2.example.com)的做法 。虚拟主机可以是“ 基于IP的 ”,这意味着每个网站都有不同的IP地址,或者“ 基于名称 ”,这意味着每个IP地址上都有多个名称,或者“基于端口”,这意味着在同一ip的不同端口上提供不同的网站,通过这些方法使得他们在同一台物理服务器上运行的事实对最终用户来说并不明显。 Apache是第一批支持基于IP的虚拟主机的服务器之一。Apache的版本1.1及更高版本支持基于IP和基于名称的虚拟主机(虚拟主机)。虚拟主机的后一种变型有时也被称为基于主机的或非IP虚拟主机。 fastcgi FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。 FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。 部署流程 部署架构 环境 3台主机用于分别部署httpd,php和mysql,实现分离 软件版本 架构图 编译软件 这里我们需要编译的软件为httpd和php,mysql可以考虑使用二进制包或者直接官方yum安装 安装开发环境和必要的包 1.安装centos开发工具包 yum groupinstall "development tools" -y 2.安装编译httpd和php需要的包 #部分包需要epel源 #yum install epel-release -y yum install pcre-devel openssl-devel expat-devel libxml2-devel bzip2-devel libmcrypt-devel -y 编译httpd 这里在192.168.99.130机器上编译httpd2.4 1.创建apache用户 useradd -r apache -s /sbin/nologin 2.解压httpd,apr,apr-util源码包,这里需要的包均可在httpd官网下到 tar xvf httpd-2.4.33.tar.bz2 tar xvf apr-1.6.2.tar.gz tar xvf apr-util-1.6.1.tar.gz 3.编译httpd #移动解压的apr和apr-util到指定的httpd源码目录可以省去分别编译3个程序 mv apr-1.6.2 httpd-2.4.33/srclib/apr mv apr-util-1.6.1 httpd-2.4.33/srclib/apr-util #编译参数,具体含义可以参考./configure的帮助文档或者官方文档 ./configure \ --prefix=/app/httpd24 \ --enable-so \ --enable-ssl \ --enable-cgi \ --enable-rewrite \ --with-zlib \ --with-pcre \ --with-included-apr \...
前言 现在NGINX越来越普及了、通过很多面板都可以简单搭建、小白都可以操作、但是出了问题、不知道如何下手、今天我们总结下教程 学派吧-小编初到一家公司做运维的工作,刚来的第一天就开始部署LNMP(Linux+Nginx+MySQL+PHP)环境,结果出现了问题。 他来向我请教,具体问题现象、原因和解决思路如下: 问题一 nginx进程CPU和内存不均衡,某个进程占用资源特别高,如何解决? 回答:我让学派吧-小编绑定下CPU的亲缘性(设置nginx配置worker_cpu_affinity项为auto,auto这个特殊值(1.9.10版本)允许自动绑定工作进程到可用的CPU上。),绑定后CPU和内存使用就均衡了。 问题二 学派吧-小编又问close系统调用消耗很高怎么解决? 回答:且听我娓娓道来,继续看下文。 strace−cpstrace−cp(pgrep -n nginx) $ top 系统32c的,top查看负载去到75.14, 查看过nginx和php-fpm的 错误日志也没有什么发现。 strace 跟踪close的系统调用, 都是以下的信息: strace−T−ttpstrace−T−ttp(pgrep -n nginx) 2&>1 |grep -B 10 close > ./close.log $ lsof | more 遂怀疑是连接创建关闭消耗了太多的资源,便让学派吧-小编加了台机器专门跑nginx, 前端挂了个nginx用长连接跟后端的nginx连接,接了个nginx之后负载果然就下来了。 前端未挂nginx压测ab压测结果: 前端挂了nginx压测ab压测结果: tps基本没变第一个Time per,requset快了87.52%。 接着继续排查tps上不去的原因,继续strace后端的nginx。 strace−cpstrace−cp(pgrep -n nginx) 发现现在是wrtiev占用高了,strace 跟踪close的系统调用, 发现很多以下的输出: connect(26, {sa_family=AF_INET, sin_port=htons(9000), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress) 问题应该不是在nginx上, 应该是在php-fpm上了。 继续 strace−cpstrace−cp(pgrep -n php-fpm) 显示下图所示: access cpu时间消耗最多那就先 排查access 系统调用: strace−T−ttpstrace−T−ttp(pgrep -n php-fpm) 2&>1 | grep -B 10 access > ./access.log php-fpm进程频繁的去读取文件,整个操 作下来花费4ms的时间。 然后排查recvfrom: strace−T−ttpstrace−T−ttp(pgrep -n php-fpm) 2&>1 | grep -B 10 recvfrom > ./recvfrom.log 频繁的去访问10.0.0.156的6379,端口,明显就是访问redis读取数据的过程, 整个过程花费12ms。 让学派吧-小编把上面两个strace信息发给开发,第一个得到回复是老版本的流程, 新版本改了,但还是有些判断没有处理。 第二个问题让开发使用redis连接池,无需频繁创建连接读取数据, 频繁创建连接开销很大的。 总 结 当遇上性能问题时,排查日志无法解决时,使用strace工具来查看一下系统调用,看时间到底消耗在哪里了,可以轻松的找到问题所在。欢迎关注我们学派吧
1. 准备 LNMP 环境 2. 安装wordpress 3. 配置 一开始搭建的hexo博客,hexo博客有个缺点,他是用nodejs的服务器,不太稳定,服务器经常挂。所以最后还是决定用nginx+php-fpm搭建一个wordpress站点,这样网站就比较稳定。废话不多说,直接进入主题。 我是用的centos的服务器,下面的一些个命令也是centos的命令,不过其他的也相差不大,主要的是步骤正确就好。 1. 准备 LNMP 环境 安装nginx 使用yum安装nginx yum install nginx -y 安装完之后修改配置文件 /etc/nginx/nginx.conf ps:要是配置文件不在这个位置的,可以利用find命令和whereis命令进行查询,参考我另外两篇博文 配置文件参考下面进行更改: 这一步,只需要两处,去除对 IPv6 地址的监听,修改要监听的域名,即: #listen [::]:80 default_server; server_name www.***.com; 修改完了之后,就可以启动nginx,查看自己网站首页了,应该看到的是一个nginx测试页面。 启动nginx nginx 将 Nginx 设置为开机自动启动: chkconfig nginx on 安装php+php-fpm+php-mysql 这一步有两个选择,安装php7.0版本或是老的版本 安装老的版本比较简单: yum install php-fpm php-mysql -y 要是想安装php7.0版本,要先添加源,再安装: 如果是centos6,那么执行以下命令 CentOS/RHEL 6.x: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm 如果是centos7.x,那么执行以下命令 CentOS/RHEL 7.x: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm 安装php和插件: 可以像上面一样,需要哪个装哪个,也可以全部安装 全部安装: yum install php70w php70w* 安装需要的: yum install php70w-common php70w-fpm php70w-opcache php70w-gd php70w-mysqlnd php70w-mbstring php70w-pecl-redis php70w-pecl-memcached php70w-devel 具体可以参考:帐号登录 完了之后启动php-fpm: service php-fpm start 安装mysql yum install mysql-server -y 行不通可参考:centos7 mysql数据库安装和配置 2. 安装wordpress yum install wordpress -y 安装完成后,就可以在 /usr/share/wordpress 看到 WordPress 的源代码了。 由于上面的安装方法默认安装的是英文版,所以我们还要下载中文语言包,如果不需要中文安装可跳过此步骤 wget https://cn.wordpress.org/wordpress-4.8.1-zh_CN.tar.gz tar -zxvf wordpress* mv -f wordpress/wp-content/languages /usr/share/wordpress/wp-content/...
1.别的先不管,先top看一下cpu、ram、swap哪个比较紧张。 由上图分析,可以看出共有602个进程,其中有601个进程休眠了。这好像有点不对劲,内核进程也就80个左右,加上memcached, nginx, mysqld,也不会超出90个。除了这些,剩下的只有php-fpm管理的php-cgi,难道是…? CPU显示,CPU压力并不大,可以说没有压力。我们再看内存使用概要,发现4G的内存,消耗得所剩余无几(free+buffers), 95%以上的内存都已分配。交互空间使用情况,我们暂时不去关心。指令top还列出了占用资源最多的进程,运行时间最久(Time+)的mysqld(约 2小时)占用资源并不是最多。另外,再看php-cgi,单个php-cgi占用的内存也不算多。所以,可以大胆地猜想:服务器内存资源比较紧张,并没有被某个进程占用大量内存,有可能被某些挂起的进程占着内存没有释放。通过free进一步监控内存使用情况,验证我们的想法。 2.指令free,了解RAM资源使用情况。当然,你也可以查看文件/proc/meminfo 我们先来看Mem统计信息,total表示物理内存总量,约4G。used,表示已分配内存,分配了并不表示使用了,包括 (buffer&cached)。free指未分配的内存,buffers与cached表示分配了但还没有被使用的内存。第二行 (buffers/cache)的,used表示真正被使用了内存,由第一行的(used-buffer-cached)得到,free则表示还没有被使用的内存,由第一行的(free+buffer+cached)得到。Swap行则表示内存交换使用情况,少量的(不频繁地)swpd,是不会影响服务器性能的,因为系统需要将V类型的内存页面交换出去或者调整了buffer与cached的大小。但是频繁地swpd,则有可能意味着服务器物理内存不足,小于指定的swap额定值,需要换出内存页。 查看free结果的时候,我们主要查看第二行。一眼就能看出4G的内存,其中有3898M内存被用了,还有49M内存没有,都快用完了。这也证实了我们第一步的猜想,内存被用完。这里,我们进一步猜想,内存空间严重不足的情况下,进程会被blocked,系统会不断地将不用的数据换出so,将要用的数据读入si。我们能通过vmstat进一步验证,我们的这个猜想。 3.指令vmstat监控内存使用情况 作为对内存监控,我们比较关心swpd、free、si、so。一般系统不繁忙的状态下,我们看到swpd,so的值不会持续很高,经常为0。这里,我们看到swpd值为1.5G,以及free值很小,再一次表明物理内存不足。其中si报告了每秒从swap区移入到物理内存的内存总量,so报告了每秒从物理内存移出到swap区的内存总量。当然,si有时较大,并不要过份的焦虑,经常碰到一个程序需要较大内存来读写媒体文件时,si值就会变大。反倒是 so,它通常是一个内存紧缺的一个信号,如果长时间这个值一直保持较大的话,则很有可能内存不够,小额波动,可以不用理会。接下来,可以通过ps找出消耗内存的元凶。 4.指令ps找出消耗内存的元凶 [root@localhost ~]# ps -A –sort -rss -o comm,pmem,pcpu |uniq -c |head -15 1 COMMAND %MEM %CPU 1 mysqld 0.6 0.0 503 php-cgi 0.3 0.0 5 php-cgi 0.2 0.0 1 php-cgi 0.1 0.0 1 php-cgi 0.0 0.0 1 memcached 0.0 0.0 1 sshd 0.0 0.0 1 nginx 0.0 0.0 1 sshd 0.0 0.0 1 nginx 0.0 0.0 2 bash 0.0 0.0 3 nginx 0.0 0.0 1 sshd 0.0 0.0 1 nginx 0.0 0.0 指令ps比较常用,也比较简单。上面报告结果,我们一眼就可以命中php-cgi这个进程。虽然单个php-cgi占用内存并不算太大,但是503 个php-cgi进程,就有点恐怖了。几乎占尽了全部内存(503*0.3%)。我们可以猜想,php-cgi由php-fpm管理,是不是可以php- fpm的某个参数配置不当,导致打开过多的php-cgi进程。 5. 设置php-fpm进程数量管理 通过重新将php-conf.conf的max_children值设置为150,系统内存又恢复到正常使用情况。free、si、so、b均表示内存系统资源正常,没有压力。 php-cgi进程释放的内存并不会被系统立即回收,一个php-cgi大概占用20kb内存(取决于你加载的php extensions)。所以,有必要限制你启动的php-cgi进程数量。那么,这个数量多少合适呢,你可以在服务器高峰期通过top统计出php- cgi数量。也可以像php-fpm建议的那样,通过netstat -np | grep 127.0.0.1:9000来收集数据,通过设置max_children使等待的数量尽量小 6.一个php-cgi占用多少内存 一个php-cgi进程,大概占用多少内存呢,大概是20MB。可以通过pmap指令查看哪些地方占用了内存。所以,尽量不要加载不必要的php扩展模块,可以减少不必要的内存浪费。 [root@localhost etc]# pmap $(pgrep php-cgi |head -1) 6746: /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm.conf 0000000000400000 6680K r-x– /usr/local/php/bin/php-cgi 0000000000c86000...