苏苏的博客

简约至极

安装PHP7和NGINX

编译安装NGINX

首先安装一些依赖

yum -y install gcc make autoconf automake install zlib zlib-devel openssl openssl-devel pcre-devel
apt-get update
apt-get -y install gcc make  openssl libssl-dev libpcre3 libpcre3-dev

编译安装

Chrome51以后版本废弃了NPN的支持,要让Chrome51以后版本支持http2,需要更新OpenSSL到1.0.2及以上.

查看当前系统的OpenSSL版本:openssl version

更新OpenSSL

OPENSSL_VERSION=openssl-1.0.2h
cd /tmp
wget https://www.openssl.org/source/${OPENSSL_VERSION}.tar.gz
tar zxvf ${OPENSSL_VERSION}.tar.gz
cd ${OPENSSL_VERSION}
./config --prefix=/usr --shared
make -j4
sudo make install
openssl version

最后一句查看版本是否更新了

如果没有www-data用户和组,可以先创建

groupadd www-data
adduser -M -s /sbin/nologin www-data -g www-data

编译nginx

NGINX_VERSION=nginx-1.11.3
CPU_NUM=`cat /proc/cpuinfo | grep processor | wc -l`
cd /tmp
wget http://nginx.org/download/${NGINX_VERSION}.tar.gz
tar -zxvf ${NGINX_VERSION}.tar.gz
cd ${NGINX_VERSION}
export CFLAGS="-O3"
./configure --with-http_v2_module --with-http_ssl_module --sbin-path=/usr/local/sbin/nginx --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=www-data --group=www-data
sudo make -j$CPU_NUM  && sudo make install
sudo strip -s /usr/local/sbin/nginx
rm -rf /tmp/nginx* /etc/nginx/*.default ${OPENSSL_VERSION}*
nginx -V

如果找不到sudo nginx,使用以下命令:

sudo ln -sf /usr/local/sbin/nginx /usr/sbin/nginx

通过YUM安装nginx

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

还可以添加Google反代模块,按下面操作编译

cd /tmp
git clone https://github.com/cuber/ngx_http_google_filter_module
git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module
wget http://nginx.org/download/${NGINX_VERSION}.tar.gz
tar -zxvf ${NGINX_VERSION}.tar.gz
cd ${NGINX_VERSION}
export CFLAGS="-O3"
./configure  --with-http_ssl_module  --add-module=/tmp/ngx_http_google_filter_module  --add-module=/tmp/ngx_http_substitutions_filter_module
make -j$CPU_NUM && make install

注意:重复执行,需要清理上次编译数据make clean

nginx -V 查看编译的参数和已加载的模块

server {
	listen       80;
	server_name  xxx.domain.com google.com www.google.com;
	resolver 8.8.8.8;
	expires 7d;
	gzip on;
	gzip_min_length 1024;
    gzip_http_version 1.0;
	gzip_proxied any;
	gzip_comp_level 3;
	gzip_types text/plain text/javascript text/css text/json application/xml application/javascript application/json image/jpeg image/gif image/png image/bmp font/ttf font/otf image/svg+xml;
	proxy_hide_header Set-Cookie;
	proxy_hide_header Alt-Svc;
	proxy_hide_header Alternate-Protocol;
	location / {
			google on;
			google_scholar on;
	}

}

gzip压缩级别,1-10,数字越大压缩的越好,时间也越长,建议3-4 gzip_min_length 大于这个长度才会压缩,也可以写1k,文本过小压缩反而没有效果 gzip_http_version 默认是1.1,也就是对于http1.1才会压缩,在proxy_pass时注意,proxy_pass默认就是http1.0的

除此之外, 这个模块还会读取 Accept-Encoding的值,客户端接受gzip,才会使用压缩,例如直接curl访问是不使用gzip的.

更多见 http://www.jb51.net/article/48995.htm

反向代理

location / {
	proxy_pass http://127.0.0.1:1080;
	proxy_set_header Host $host;
	proxy_set_header X-Forwarded-Ssl off;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Port 80;
}

一个纯静态文件服务器,开启目录浏览

server{
        server_name share.xx.cn;
        listen 80;
        gzip on;
        etag on;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
        index index.html;
        root /data/share;
}

使用nginx正向代理

server {
    listen 127.0.0.1:3128;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    location / {
        allow 192.168.0.0/24;
        deny all;

		proxy_pass $scheme://$host$request_uri;
        proxy_set_header Host $http_host;

        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0;
        proxy_buffering off;

        proxy_connect_timeout 30;

        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 301 1h;
        proxy_cache_valid any 1m;
   }
}

正向代理必须配置dns解析resolver

配置DNS服务器IP地址。可以指定多个,以轮询方式请求

resolver_timeout 5s; DNS解析超时时间(5秒)

nginx会缓存解析的结果。默认情况下,缓存时间是名字解析响应中的TTL字段的值,可以通过valid参数更改。

resolver 8.8.8.8 8.8.4.4 valid=300s;

proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;

配置缓存大小,关闭磁盘缓存读写减少I/O,以及代理连接超时时间。

proxy_buffers 256 4k; # 设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k。
proxy_max_temp_file_size 0; # 当代理缓冲区过大时使用一个临时文件的最大值,如果文件大于这个值,将同步传递请求而不写入磁盘进行缓存。如果这个值设置为零,则禁止使用临时文件。
proxy_connect_timeout 30;
proxy_busy_buffers_size 256k; #高负荷下缓冲大小(proxy_buffers*2)

配置代理服务器 Http 状态缓存时间。

proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;

host vs http_host

host http_host 变量可参考

host变量的值按照如下优先级获得: 1. 请求行中的host. 2. 请求头中的Host头部. 3. 与一条请求匹配的server name.

uri request_uri http://blog.sina.com.cn/s/blog_4ff12f66010158lk.html

因为Nginx不支持CONNECT,所以无法正向代理Https网站

使用我编译的google代理的docker版本更易部署 https://hub.docker.com/r/suconghou/nginx-google/

使用Map,根据请求得出不同变量值

map $http_user_agent $fileServe {
    default /data/www/dir;
    ~*"Baiduspider|Sosospider|Googlebot|YoudaoBot|MSNBot|ia_archiver|twiceler|Scrubby|Gigabot|spider|bot|slurp|crawler"  /data/www/dir1;
}
server {
	listen 80;
	server_name  xxx.net;
	root $fileServe;
	index index.html;
	try_files $uri $uri/ @backend;
	location @backend{
		proxy_pass http://127.0.0.1:4000;
		proxy_set_header Host $host;
		proxy_set_header X-Forwarded-Ssl off;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Port 80;
	}
}

nginx 对于 php 的 pathinfo 配置

location ~ [^/]\.php(/|$) {
    fastcgi_pass 127.0.0.1:9000;
    # fastcgi_pass unix:/var/run/php-fpm.sock;
    fastcgi_split_path_info ^(.+?\.php)(.*)$;
    set $real_path_info $fastcgi_path_info;
    try_files $fastcgi_script_name =404;
    fastcgi_param PATH_INFO $real_path_info;
    include fastcgi.conf;
}
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }

注意 fastcgi_split_path_info 要在 include 之前

更好玩的,代理任意IP和端口号.

server{
    listen 80;
    server_name *.proxy.xx.cn;
    if ($host ~* ^((\d+)\.(\d+)\.(\d+)\.(\d+)\.(\d+)\.proxy\.ourwill\.cn)$) {
        set $proxy $2.$3.$4.$5;
        set $port $6;
    }
    if ($host ~* ^(?:(?<proxydomain>([\w\-]+\.){2,4})(?:(?<proxyport>\d+)\.)?proxy\.ourwill\.cn)$) {
	    set $proxy $2.$3.
	}
    add_header 'Access-Control-Allow-Origin' "$http_origin";
    add_header 'Access-Control-Allow-Credentials' "true";
    add_header 'Access-Control-Max-Age' 86400;
    add_header 'Access-Control-Allow-Methods' 'GET,PUT,POST,OPTIONS,DELETE,PATCH';
    add_header 'Access-Control-Allow-Headers' 'X-OAUTH-TOKEN,Cache-Control,Pragma, reqid, nid, host, x-real-ip, x-forwarded-ip, accept, content-type';
    add_header 'X-proxy' $proxy:$port;
    client_max_body_size 20m;
    if ($request_method = 'OPTIONS') {
        return 200;
    }
    location / {
        proxy_pass http://$proxy:$port;
        proxy_set_header Host $proxy;
        proxy_set_header X-Forwarded-Ssl off;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Port 443;
    }

}

代理websocket

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    upstream websocket {
        server 192.168.100.10:8010;
    }

    server {
        listen 8020;
        location / {
            proxy_pass http://websocket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }
}

nginx转发的权限问题

setsebool httpd_can_network_connect on或许能解决问题.

http://stackoverflow.com/questions/23948527/13-permission-denied-while-connecting-to-upstreamnginx

PROPFIND 协议转发

NGINX 不支持 PROPFIND 协议,此协议的请求默认是405,但是可以转发此协议的请求。但是不能使用 proxy_set_header 指令

location / {
    index      index.html;
    if ($request_method ~ ^(PROPFIND)$) {
        proxy_pass http://172.17.37.126:8088;
    }
}

各模块说明

http_gzip_module提供了对gzip的基本的支持,默认是编译到nginx的发行版本里面的。

http_gzip_static_module则是针对nginx serve的静态文件,需要编译进去才能有。比如a.html,如果启用了gzip_static on,如果同一目录下还有a.html.gz作为a.html压缩版本存在,那么nginx会以a.html.gz作为a.html的gzip version来serve。

配置Gzip

gzip on 开启Gzip

gzip_proxied any

可能需要移动配置目录

nginx.conf中配置include /usr/local/nginx/conf/conf.d/*.conf;

建立目录mkdir /etc/nginx/conf.d

使用ln -s /etc/nginx/conf.d /usr/local/nginx/conf/conf.d建立软连接

修改Nginx配置

设置最大上传文件大小,配置nginx.conf

client_max_body_size 50m Default value for client_max_body_size is 1 MiB,超过大小报错413 Request Entity Too Large

静态由Nginx,动态转到后端

root /home/demo/goproj/src/Test/public;
try_files $uri/index.html $uri.html $uri @goapp;

location @goapp {
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header Host $http_host;
	proxy_redirect off;
	proxy_pass http://localhost:8080;
}

nginx 301 重定向

server{
    listen 80;
    server_name xxx.com;
    rewrite ^(.*) https://xxx.com$1 permanent;
}

要使用 302 跳转,直接将permanent,改为redirect;

使用匹配跳转后也加上之前访问的路径和query_string,可以转为https协议,也可以让多个域名301到一个域名

proxy_set_header Host $http_host;

有时候是很有必要的,nginx转发时默认不会携带当前域名,只会从proxy_pass 后面的地址中提取域名.

proxy_pass 后面再三种模式下不能添加URI

  1. Regular Expression Locations
  2. Named Locations
  3. if Blocks

使用重写达到类似的效果

try_files $uri $uri/  @goapp;
location @goapp{
        rewrite ^(.*)$ /www$1 break;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://127.0.0.1:18080;
}

在我们请求的URI上拼接上/www 于是请求 /home/index 后端转发到/www/home/index

参考 https://lufficc.com/blog/configure-nginx-as-a-web-server

去除一个子目录也可以使用rewrite

example.com/component/tag/whatever

example.com/tag/whatever

rewrite ^/component(.*)$ $1 break;

对于上面这个配置, 直接访问 /component 会导致500错误the rewritten URI has a zero length, 因为正则匹配的是空,不能作为rewrite后的uri

可以写成 rewrite ^/live(/.*)$ $1 break; 保证rewrite后的uri是有数据的.

或者 rewrite ^/live(.+)$ $1 break; 更为通用

在之前添加其他rewrite指令 rewrite ^(/live)$ $1/;可以确保 /live的请求改写为/live/ , 从而保证 /live/live/ 都能被重写为/

https://serverfault.com/questions/302509/how-to-quick-and-easy-remove-part-of-an-url-in-nginx-with-httprewritemodule

代理与后端保持长连接


keepalive_timeout 75 75;
keepalive_requests 1024;
location / {
	proxy_pass http://backend;
	proxy_http_version 1.1;
	proxy_set_header Connection "";
	proxy_set_header Host $host;
	proxy_set_header X-Forwarded-Ssl off;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Port 80;
	proxy_redirect off;
}

upstream backend {
    server 127.0.0.1:8084;
    keepalive 64;
}

keepalive_timeout 75 75; keepalive_requests 1024; 用于与浏览器端保持长连接,时间为timeout参数.

keepalive_requests是与客户端在同一个长连接中服务的请求次数,一个长连接服务次数超过限定,nginx将会强行关闭,在客户端请求密集时提高此参数有助于性能提升.

nginx代理模式使用http1.0,proxy_http_version 1.1;指明需要使用http1.1协议

proxy_set_header Connection ""; 清除向后端传送的Connection字段,http1.1 默认就是keepalive, 重置此字段是忽略客户端此字段的值,不将其发送到后端.

upstream中keepalive 64参数十分关键,他表明nginx连接池内最多保留的空闲长连接数.此值设置过小会导致nginx频繁关闭空闲连接,需要时又创建长连接,创建多了超过指定又会关闭.

若服务器每秒仅收到20个请求,每个请求后端要300ms处理,则这20个请求始终会使用到长连接,此场景下最多64个空闲长连接已经足够.

请求处理时间小于1秒,每秒请求数小于设定的keepalive,那么这些请求就是线程池长连接服务的,没有额外开销.

注意:nginxproxy_pass后面带不带/是有区别的.

不带/,nginx将不会对请求做任何形式的修改,仅仅是分发到不同主机上.

带有/,nginx会将你location中匹配的东西略过.例如location /service/ 对于请求http://nginx/service/add.php将变为http://proxy/add.php

如果还在/后面添加uri,uri也会在之前拼入,如proxy_pass http://proxy/request/ 变为 http://proxy/request/add.php

对于这个uri后面加不加/, nginx是不关心的, nginx 仅仅是将原先请求的URL根据location的值,截取后面的uri拼接到这个uri后面, 所以 location /api proxy_pass http://proxy/myapi/ , 对于请求 http://xx.com/api/userinfo 会拼接出 http://proxy/myapi//userinfo 这种多余的/

在使用正则匹配时,proxy_pass后面是禁止添加/或者uri的,否则报错.

proxy_pass 的时候, 被代理的主机发出301/302跳转,跳转的域名是被代理的主机域名. 那么经过nginx proxy_pass 时,nginx 将会将location中匹配 proxy_pass 里的域名改为当前的域名,使得向浏览器发出的是外层nginx配置的域名,而不是一个内部域名.

有些时候我们可以使用

proxy_redirect off 禁用掉这个替换.

proxy_redirect 还有其他用法,还能自定义我们需要的替换.

注意: proxy_pass 对于代理较大的文件,会使用文件缓存,注意proxy_pass缓存文件夹是否有写入权限.

否则出现的情况是 资源下载一小部分,链接就被断掉,下载到的和content-length不服. 只能下载到即将使用文件缓存时的临界值大小.

curl 出现transfer closed with xxx bytes remaining to read 等问题.

这个缓存文件夹地址可由 proxy_temp_path 配置.

一般nginx默认的零时文件夹是/var/lib/nginx

chown -R www-data:www-data /var/lib/nginx 该文件夹所有者须与nginx worker进程的用户保持相同.

client_body

large_client_header_buffers 1024 32k;
client_max_body_size 10240m;
client_body_buffer_size 128k;
client_body_timeout 5m;
client_header_timeout 2m;
client_body_temp_path /dev/shm/nginx/body_temp/ 1 2 ;
proxy_ignore_client_abort on;

proxy module

proxy_connect_timeout 2m;
proxy_read_timeout 5m;
proxy_send_timeout 2m;
proxy_buffer_size 64k;
proxy_buffers   128 64K;
proxy_busy_buffers_size 4m;
proxy_temp_file_write_size 8m;
proxy_max_temp_file_size 10240m;
proxy_http_version 1.1 ;
proxy_buffering off ;
proxy_temp_path /dev/shm/nginx/proxy_temp 1 2;

如果没有大文件上传,可以设置较大的client_body_buffer_size,避免文件IO.

http {
    # ...

    client_body_temp_path /dev/shm/nginx/body_temp/ 1 2;
    client_body_buffer_size 256k;
    client_body_in_file_only off;

    # ...
}

注意

使用if判断时,if和括号之间是必须要加空格的,判断文件,目录是否存在!-f,!-d也是连起来的不能有空格

Nginx SNI 反带

nginx1.11.5以上版本支持SNI反带,此模块默认不是启用的,需要在编译的启用--with-stream_ssl_preread_module

https://www.v2ex.com/t/341913

最外部添加

events {
    worker_connections 1024;
}
stream {
    server {
        listen 443;
        ssl_preread on;
        resolver 8.8.8.8 8.8.4.4 valid=3600s;
        resolver_timeout 5s;
        proxy_connect_timeout 10s;
        proxy_pass $ssl_preread_server_name:$server_port;
    }
}

server{ listen 80; resolver 8.8.8.8 8.8.4.4 valid=3600s; resolver_timeout 5s; proxy_connect_timeout 10s; proxy_pass $hostname; }

还可以结合map使用https://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html

nginx 官方yum源.

https://www.nginx.com/resources/wiki/start/topics/tutorials/install/

nginx -t -c /etc/stream/stream.conf 使用校验指定配置文件

nginx -c /etc/stream/stream.conf 使用指定配置文件启动.

error_log  /tmp/error.log;
events {
    worker_connections  1024;
}
stream {
    server {
        listen 443;
        ssl_preread on;
        resolver 8.8.8.8 8.8.4.4 valid=3600s;
        resolver_timeout 5s;
        proxy_pass $ssl_preread_server_name:$server_port;
    }
}

nginx 启动时必须确保编译时配置的error_log所在的路径存在.因为nginx在解析配置文件之前就要写日志.

** TCP 端口转发**

stream {
    server {
        listen 443;
        proxy_connect_timeout 5s;
        proxy_timeout 5s;
        proxy_pass 192.168.1.5:9090;
    }
}

其他用法 https://www.v2ex.com/t/488039#reply9

附上卸载Apache方法

  • 完全卸载使用apt-get安装的apache
  1. sudo apt-get remove apache2
  2. sudo apt-get remove apache2.2-common
  3. sudo apt-get autoremove (此命令会自动卸载PHP)
  • 卸载由rpm方式安装的apache
rpm -qa|grep httpd

得出结果

httpd-2.2.15-39.el6.centos.i686

httpd-tools-2.2.15-39.el6.centos.i686

从上往下一个一个卸载

rpm -e httpd-2.2.15
rpm -e httpd-tools

ab压力测试在httpd-tools,可以不卸载;

在CentOS上安装ab压力测试

yum install httpd-tools

编译安装PHP7

最好先yum update一下,再安装以下依赖

yum install -y git wget curl  curl-devel libzip libzip-devel libmcrypt libmcrypt-devel gcc gcc-c++ cmake  autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libpng libpng-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses  openssl-devel gdbm-devel db4-devel libXpm-devel libX11-devel gd-devel gmp-devel readline-devel libxslt-devel expat-devel xmlrpc-c xmlrpc-c-devel

下载PHP7最新版本,解压,有多种压缩格式可选,其中xz最小

如果你在国内下载,将php.net改为cn.php.net下载会更快

php 7.2 编译时 unrecognized options: –with-mcrypt, –enable-gd-native-ttf

php7.2 已废除mcrypt扩展,推荐使用openssl加密方法

–enable-gd-native-ttf 在php7.2中已无需使用.

cd /tmp
PHP_VERSION=php-7.0.18
CPU_NUM=`cat /proc/cpuinfo | grep processor | wc -l`
wget http://php.net/distributions/${PHP_VERSION}.tar.xz
tar -xJf ${PHP_VERSION}.tar.xz
cd ${PHP_VERSION}
export CFLAGS="-O3"

编译之前,可以开启O3编译优化,生成的可执行文件更小,性能更好

包含部分常用扩展的编译

./configure --enable-inline-optimization --enable-static=yes --prefix=/tmp --with-config-file-path=/etc --without-pear --disable-cgi --disable-opcache --disable-fpm --enable-posix --enable-pcntl --enable-sockets --enable-ftp --enable-bcmath --enable-zip --enable-mbstring --enable-gd-native-ttf --with-iconv --with-mysqli --with-pdo-mysql --with-curl --with-gd --with-freetype-dir=/usr/include/freetype2 --with-png-dir=/usr/include --with-jpeg-dir=/usr/include --with-openssl --with-mcrypt
make -j$CPU_NUM && make install

功能更全的编译

包含php-fpmopcache,添加其他常用扩展--enable-exif --enable-calendar --with-xsl --with-bz2

注意编译GD库的时候需要--with-freetype-dir=/usr/include/freetype2否则会出现Call to undefined function imagettftext()

字库 配置开关
FreeType 1.x 要激活 FreeType 1.x 的支持,加上 --with-ttf[=DIR]。
FreeType 2 要激活 FreeType 2 的支持,加上 --with-freetype-dir=DIR。
T1lib 要激活 T1lib(Type 1 字体),加上 --with-t1lib[=DIR]。
本地 TrueType 字符串函数 要激活本地 TrueType 字符串函数的支持,加上 --enable-gd-native-ttf。
./configure --enable-inline-optimization --enable-static=yes --prefix=/usr/local --with-config-file-path=/etc --disable-cgi --enable-opcache --enable-fpm  --enable-posix --enable-pcntl --enable-sockets --enable-ftp --enable-bcmath --enable-zip --enable-mbstring --enable-gd-native-ttf --with-iconv --with-mysqli --with-pdo-mysql --with-curl --with-gd --with-freetype-dir=/usr/include/freetype2 --with-png-dir=/usr/include --with-jpeg-dir=/usr/include --with-openssl --with-mcrypt --enable-exif --enable-calendar  --with-xsl --with-bz2
make -j$CPU_NUM && make install

静态编译php7

alpine

apk update && apk upgrade
apk --update add xz gcc g++ make wget file pcre-dev zlib-dev  jpeg-dev libpng-dev freetype-dev bzip2-dev
cd /tmp
PHP_VERSION=php-7.1.4
wget http://php.net/distributions/${PHP_VERSION}.tar.xz
tar xJf ${PHP_VERSION}.tar.xz
cd ${PHP_VERSION}

./configure --enable-inline-optimization --enable-static=yes --enable-shared=no --prefix=/usr/local --with-config-file-path=/etc --without-pear --disable-cgi --disable-opcache --enable-fpm  --disable-phpdbg --enable-pcntl --enable-sockets --enable-ftp --enable-bcmath  --enable-zip --enable-mbstring --enable-gd-native-ttf --with-mysqli --with-pdo-mysql --with-openssl  --enable-exif --enable-calendar --with-bz2 --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-shmop --with-xsl --with-curl=/usr/local/  LDFLAGS="-static" LIBS="/usr/local/lib/libcurl.a -L/lib -lssl -lcrypto -lssl -lcrypto -lz" CFLAGS="-Os"

configure 过程中 需要确保

curl-config xml2-config xslt-config 这几个库都有

其中 apk add curl-dev libxslt-dev 都提供了静态库,但是apk add libxml2-dev 不包含静态库,需要自己编译

如果报libxml2错误需要自己下载编译官方xml2

cd /tmp
wget ftp://xmlsoft.org/libxml2/libxml2-2.9.7.tar.gz
tar zxf libxml2-2.9.7.tar.gz
cd libxml2-2.9.7
./configure && make -j4 && make install && cd /tmp

libexslt.a(crypto.o)相关问题

cd /tmp
wget ftp://xmlsoft.org/libxslt/libxslt-1.1.29.tar.gz
tar zxf libxslt-1.1.29.tar.gz
cd libxslt-1.1.29
./configure && make -j4 && make install && cd /tmp

添加--with-curl= 注意,需要有静态库libcurl.a 参见 http://php.net/manual/zh/curl.installation.php

cd /tmp
wget https://curl.haxx.se/download/curl-7.56.1.tar.xz
tar Jxf curl-7.56.1.tar.gz
cd curl-7.56.1
./configure && make -j4 && make install && cd /tmp

并且需要设置变量LIBS,可以使用curl-config --static-libs 得出其值,若没有可能需要自己先下载curl编译.

/usr/local/lib/libcurl.a -L/lib -lssl -lcrypto -lssl -lcrypto -lz

/usr/local/lib/libcurl.a -L/lib -lssh2 -lssl -lcrypto -lssl -lcrypto -lz

生成Makefile后,打开 Makefile,搜索-export-dynamic ,如果你还开启了编译php-fpm phpdbg 等会有多个,如果只编译php-cli就只会有一个.

BUILD_CLI = $(LIBTOOL) --mode=link $(CC) -export-dynamic $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(EXTRA_LDFLAGS_PROGRAM) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(PHP_CLI_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $(SAPI_CLI_PATH)

这里决定了只会静态链接 php 自己的库,系统库还是动态的.

删掉 -export-dynamic,在最后面加上-all-static,可以使用脚本替换掉

sed -i "s{-export-dynamic{-all-static{" Makefile

之后开开心心 make -j4, make install 后便可得到静态编译的PHP

php安装过后就可以使用php命令了,但是php-fpm还需要配置一下

php -v
php -m
mv /usr/local/etc/php-fpm.conf.default  /usr/local/etc/php-fpm.conf
mv /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
php-fpm -t

修改文件名,使配置文件正确,还可以修改配置,记录log和slow log

提前建立文件夹mkdir -p /var/log/php-fpm

  • 修改php-fpm.confglobalerror_log/var/log/php-fpm/php-fpm.log
  • 修改php-fpm.confglobalpid/var/run/php-fpm.pid
  • 修改www.confslowlog/var/log/php-fpm/$pool.log.slow
  • 修改www.confrequest_slowlog_timeout5

下面一段代码实现自动修改

mkdir -p /var/log/php-fpm
sed -i '/^;error_log.*/cerror_log = \/var\/log\/php-fpm\/php-fpm.log' /usr/local/etc/php-fpm.conf
sed -i '/^;pid.*/cpid = \/var\/run\/php-fpm.pid' /usr/local/etc/php-fpm.conf
sed -i '/^;slowlog.*/cslowlog = \/var\/log\/php-fpm\/$pool.log.slow' /usr/local/etc/php-fpm.d/www.conf
sed -i '/^;request_slowlog_timeout.*/crequest_slowlog_timeout = 5' /usr/local/etc/php-fpm.d/www.conf
php-fpm -t

启动php-fpm 以下一些常用操作相信十分有用,vim ~/.shell.sh加入吧

alias phpfpmreload=' sudo kill -USR2 `cat /var/run/php-fpm.pid` ';
alias phpfpmstop=' sudo kill -INT `cat /var/run/php-fpm.pid` ';
alias errorlog='tail -f /var/log/nginx/error.log  /var/log/php-fpm/*.log ';

在你的.baserc,vim ~/.baserc

if [ -f ~/.shell.sh ]; then
        . ~/.shell.sh
fi

source一下就可以使用了.

其中部分步骤可能需要root权限

可能出现的错误

1.curl未安装 执行 yum install curl-devel 或者 sudo apt-get install curl libcurl3 libcurl3-dev 然后再次尝试编译

2. error: mcrypt.h not found. Please reinstall libmcrypt. 需要安装libcrytpt

cd /tmp
wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/attic/libmcrypt/libmcrypt-2.5.7.tar.gz
tar -zxvf libmcrypt-2.5.7.tar.gz
cd libmcrypt-2.5.7
mkdir -p /usr/local/libmcrytpt
./configure prefix=/usr/local/libmcrytpt/
make -j$CPU_NUM  && make install

然后重新编译,设定编译参数mcrypt指定路径: --with-mcrypt=/usr/local/libmcrytpt/

3.OpenSSL相关错误

Cannot find OpenSSL's <evp.h> 或者

Undefined symbols for architecture x86_64:
	"_PKCS5_PBKDF2_HMAC", referenced from:
			_zif_openssl_pbkdf2 in openssl.o
	"_SSL_CTX_set_alpn_protos", referenced from:
			_php_openssl_setup_crypto in xp_ssl.o
	"_SSL_CTX_set_alpn_select_cb", referenced from:
			_php_openssl_setup_crypto in xp_ssl.o
	"_SSL_get0_alpn_selected", referenced from:
			_php_openssl_sockop_set_option in xp_ssl.o
	"_SSL_select_next_proto", referenced from:
			_server_alpn_callback in xp_ssl.o
	"_TLSv1_1_client_method", referenced from:
			_php_openssl_setup_crypto in xp_ssl.o
	"_TLSv1_1_server_method", referenced from:
			_php_openssl_setup_crypto in xp_ssl.o
	"_TLSv1_2_client_method", referenced from:
			_php_openssl_setup_crypto in xp_ssl.o
	"_TLSv1_2_server_method", referenced from:
			_php_openssl_setup_crypto in xp_ssl.o

解决: Linux上 yum install openssl openssl-devel

Mac上编译须做如下配置

brew install openssl 然后执行 brew link openssl --force 并添加环境变量

export LDFLAGS="/usr/local/opt/openssl/lib/libssl.dylib /usr/local/opt/openssl/lib/libcrypto.dylib"

4.configure: error: xml2-config not found. Please check your libxml2 installation.

apt-get install libxml2 libxml2-dev libmcrypt-dev openssl libssl-dev libcurl4-openssl-dev

mac 用户brew install libxml2 然后配置时指定 --with-libxml-dir=/usr/local/opt/libxml2/

可以使用brew info libxml2查看brew把它安装在哪里

5.Cannot find OpenSSL’s libraries

apt-get install libmcrypt-dev openssl libssl-dev libcurl4-openssl-dev

6.configure: error: png.h not found.

apt-get install libjpeg-dev libpng-dev

7.make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1

这是由于内存小于1G所导致.可以--disable-fileinfo,或者添加添加零时的swap

#创建一个大小为512M的文件(要创建2G的话把2048改为8192)
dd if=/dev/zero of=/swapfile bs=2048 count=262144
#把这个文件变成swap文件
mkswap /swapfile
#启用这个swap文件
swapon /swapfile
#查看已经生效了
free -m

如果要每次开机就加载

#编辑/etc/fstab文件,使在每次开机时自动加载swap文件
/swapfile    swap    swap    default   0 0

unmount

fuser -v /data

使用 blkid 可查看关于此文件的配置信息

http://man.linuxde.net/blkid

http://man.linuxde.net/lsblk

注意:XEN KVM 可以创建SWAP,OVZ本身就是Virtual Environmen,不支持创建SWAP

通过df -lhT 看到磁盘类型为simfs,而不是ext3,ext4,一般就不支持

8.system libzip must be upgraded to version >= 0.11 libzip 地址 http://www.nih.at/libzip/

cd /tmp
wget http://www.nih.at/libzip/libzip-1.1.2.tar.xz
tar Jxvf libzip-1.1.2.tar.xz
cd libzip-1.1.2
mkdir -p /usr/local/libzip
./configure prefix=/usr/local/libzip/
make -j$CPU_NUM  && make install

编译PHP时加上--with-libzip=/usr/local/libzip/

使用多核提升编译性能

用make -j带一个参数,可以把项目进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源。

优化等级

-O这个选项控制所有的优化等级。使用优化选项会使编译过程耗费更多的时间,并且占用更多的内存,尤其是在提高优化等级的时候。 -O2是推荐的优化等级,O3是最高等级。如果编译软件出现错误,请先检查是否启用了-O3

无缝升级

php编译完成以后,无缝升级php 只需kill -USR2 php-fpm master 进程的PID,向php-fpm master进程发送重启指令,php-fpm的master和worker都会重新加载配置,重新运行起来. curl -I 127.0.0.1查看,新版本的fpm已经在工作了.

ps -ylC php-fpm --sort:rss可以查看所有php-fpm进程的内存消耗.

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }' 得出平均每进程消耗的内存.

8G以上内存生产服务器可以加大子进程数量.

pm.max_children = 70
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500

如果pm设置为static,那么其实只有pm.max_children这个参数生效,start_servers的值要介于min和max之前

PHP的数据库长连接有没有效, 实际测试,采用香港服务器远程连接mysql,非长连接模式下耗时约600ms,使用PDO长连接,耗时下降到260ms左右,是有一定作用的. 但是长连接不适用于CLI模式,CLI模式下,php进程退出,连接即断开.

通过Yum安装PHP5.6或PHP7

安装PHP7 https://webtatic.com/packages/php70/

安装PHP5.6 https://webtatic.com/packages/php56/

其他 https://webtatic.com/news/2016/09/latest-updates-php-7-0-11-5-6-26-mysql-5-5-52/

安装一些其他扩展

php redis 扩展

wget -c -O php-redis.zip https://github.com/phpredis/phpredis/archive/php7.zip
unzip php-redis.zip
cd phpredis-php7
phpize
./configure --enable-redis-igbinary
make -j$CPU_NUM  && make install

安装libmemcached,memcached依赖此项

wget -c https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar -xzf libmemcached-1.0.18.tar.gz -C /tmp
cd /tmp/libmemcached-1.0.18
./configure
make -j$CPU_NUM  && make install

php memcached 扩展

wget -c -O php-memcached.zip https://github.com/php-memcached-dev/php-memcached/archive/php7.zip
unzip php-memcached.zip
cd php-memcached-php7
phpize
make -j$CPU_NUM  && make install

安装swoole扩展

wget -c -O php-swoole.zip https://github.com/swoole/swoole-src/archive/master.zip
unzip php-swoole.zip
cd swoole-src-master
phpize
./configure
make -j$CPU_NUM  && make install

编译redis,memcached,opcache到php7

wget -c http://php.net/distributions/${PHP_VERSION}.tar.xz
wget -c -O php-redis.zip https://github.com/phpredis/phpredis/archive/php7.zip
wget -c -O php-memcached.zip https://github.com/php-memcached-dev/php-memcached/archive/php7.zip
tar -xJf ${PHP_VERSION}.tar.xz
unzip php-redis.zip -d ${PHP_VERSION}/ext
unzip php-memcached.zip -d ${PHP_VERSION}/ext
export CFLAGS="-O3"
cd ${PHP_VERSION}
rm -rf configure
./buildconf --force
./configure --help
./configure --enable-inline-optimization --enable-static=yes --prefix=/tmp --with-config-file-path=/etc --enable-opcache --enable-redis --enable-memcached --disable-memcached-sasl --enable-pcntl --enable-sockets --enable-ftp --enable-bcmath --enable-zip --enable-mbstring --with-iconv --with-mysqli --with-pdo-mysql --with-curl --with-gd --with-openssl
make -j$CPU_NUM
make install

可能出现的错误

1.configure: error: no, sasl.h is not available. Run configure with --disable-memcached-sasl to disable this check

解决:

yum install cyrus-sasl-develsudo apt-get install libsasl2-dev

或者禁用掉

搭配PHP的配置

server{
	listen 8080;
	server_name 127.0.0.1;
	index index.html index.php;
	root /data/sites/default;
	location / {
		try_files $uri $uri/ /index.php$is_args$args;
	}
	location ~ \.php$ {
		try_files $uri /index.php$is_args$args;
		fastcgi_pass  unix:/var/run/php-fpm.sock;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		include        fastcgi_params;
	}
}

一个Server实现多个域名,多个主机

server{
	listen 8080;
	server_name *.git.suconghou.cn;
	index index.php index.html adminer.php;
	if ($host ~* ^((\w+)\.git\.suconghou\.cn)$) {
		set $subdomain $2;
	}
	root /data/git/$subdomain;
	add_header X-Root "$subdomain";
	fastcgi_connect_timeout 2s;
	fastcgi_send_timeout 3s;
	fastcgi_read_timeout 8s;
	location / {
		try_files $uri $uri/ /index.php$is_args$args;
	}
	location ~ \.php$ {
		try_files $uri /index.php$is_args$args;
		fastcgi_pass  unix:/var/run/php-fpm.sock;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		include        fastcgi_params;
	}
}

Nginx里同fastcgi_params文件一样,还存在一份配置fastcgi.conf;

只不过后者多了一行fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

我们可以直接使用它来替换fastcgi_params文件配置,同时我们也都添加了try_files检测,也可以略去fastcgi_index,故可以简写为:

location ~ \.php$ {
	try_files $uri /index.php$is_args$args;
	fastcgi_pass  unix:/var/run/php-fpm.sock;
	include fastcgi.conf;
}

注意fastcgi_param指令是数组型的,内层替换外层,但是同级多次使用的时候,是新增而不是替换。注意不要重复使用.

try_files 的最后一个参数是作为fallback的,具有特殊的意义,命中这个规则会发起一个内部重定向,而前几个参数是不会发生内部重定向的。 下面的例子可以描述这个过程

server{
    listen 7090;
    server_name 127.0.0.1;
    index index.html index.php;
    root /tmp/;
    location / {
        try_files $uri $uri/ /index.php;
    }
    location ~ \.php$ {
        return 200 "break";
    }
}
server{
    listen 7090;
    server_name 127.0.0.1;
    index index.html index.php;
    root /tmp/;
    location / {
        try_files $uri $uri/ /index.php =404;
    }
    location ~ \.php$ {
        return 200 "break";
    }
}

需要注意的是index指令也会触发一个内部重定向。

访问http://127.0.0.1:7090/ 这两种配置都会返回403,因为此时$uri的值为/

proxy_pass 与 regexp location 结合

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend;

注意backend后没有/

location / {

 if ($arg_test ~ "true") {
        set $gotoserver 1;
    }
    if ($uri ~* "(queries|results)") {
        set $gotoserver  "${gotoserver}1" ;
    }
    if ($gotoserver = 11) {
        proxy_pass http://backend;
    }
}

注意 backend后面没有/ 注意必须在 location /内部

http://linuxplayer.org/2013/06/nginx-try-files-on-multiple-named-location-or-server

fastcgi_busy_buffers_size 必须小于 fastcgi_buffers

排除favicon.ico错误

location = /favicon.ico {
log_not_found off;
access_log off;
}

不允许以.开头的文件

location ~ /. {
deny all;
access_log off;
log_not_found off;
}

排除找不到robots错误

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

php-fpm 运行时错误

  1. [pool www] cannot get gid for group ‘nobody’ groupadd nobody或者 修改php-fpm.conf
user = www-data
group = www-data

使用 goaccess nginx 日志分析

nginx日志分析工具 https://goaccess.io/ https://github.com/allinurl/goaccess/ 采用c语言编写,还能生成网页

静态编辑goaccess

查看实时日志

goaccess access.log -o /var/www/html/report.html --log-format=COMBINED --real-time-html

use docker

docker run –rm -it -m 60m -v /var/log/nginx:/data suconghou/tools:goaccess goaccess /data/access.log -o /data/report.html –log-format=COMBINED –real-time-html

提供静态编译好的无依赖可执行文件 http://share.suconghou.cn/files/bin/goaccess.xz

安装MariaDB

apt-get install mariadb-server

MySql

apt-get install mysql-server

安装过程中要求设定一个root密码,安装完service mysql status查看运行状态,sudo service mysql restart可以重启

升级mariadb

https://www.zerostopbits.com/how-to-upgrade-mariadb-5-5-to-mariadb-10-3-on-centos-7-5-1804/

https://www.mysterydata.com/update-upgrade-to-mariadb-10-4-on-vestacp-cwp-centos-7/

编译安装

源码下载页 http://dev.mysql.com/downloads/mysql/ 选择source code下载

Alpine下编译

先为mysql添加一个用户运行 addgroup mysql; adduser -H -D -s /sbin/nologin mysql -G mysql

删除此用户的命令是 deluser mysql

apk update && apk upgrade
apk --update add cmake gcc g++
MYSQL_VERSION=mysql-5.7.14
wget http://cdn.mysql.com/Downloads/MySQL-5.7/${MYSQL_VERSION}.tar.gz
tar zxf ${MYSQL_VERSION}.tar.gz
cd ${MYSQL_VERSION}
cmake  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DCMAKE_C_FLAGS_RELWITHDEBINFO="-O3 -g" -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="-O3 -g" -DCMAKE_C_FLAGS="-O3 -g" -DCMAKE_CXX_FLAGS="-O3 -g" -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=0 -DWITH_BLACKHOLE_STORAGE_ENGINE=0 -DWITH_EXAMPLE_STORAGE_ENGINE=0 -DWITH_FEDERATED_STORAGE_ENGINE=0 -DWITH_NDB_STORAGE_ENGINE=0 -DWITH_NDBCLUSTER_STORAGE_ENGINE=0  -DWITH_PARTITION_STORAGE_ENGINE=0 -DWITH_PERFSCHEMA_STORAGE_ENGINE=0

mysql5.7 编译时的参数 http://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html

Alpine中mysql无法编译,报错No mysys timer support detected!

下面尝试编译mariadb

mariadb官网 https://downloads.mariadb.org/mariadb/

apk update && apk upgrade
apk --update add curl cmake gcc g++ ncurses-dev pcre-dev xz-dev linux-headers
MARIADB_VERSION=mariadb-10.1.17
curl https://mirrors.tuna.tsinghua.edu.cn/mariadb/${MARIADB_VERSION}/source/${MARIADB_VERSION}.tar.gz | tar xz
cd ${MARIADB_VERSION}
cmake  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITHOUT_TOKUDB=1 -DWITHOUT_MROONGA=1 -DWITHOUT_SPIDER=1 -DWITHOUT_PERFSCHEMA=1  -DWITHOUT_CONNECT=1 -DWITHOUT_XTRADB=1 -DWITHOUT_INNOBASE=1 -DWITHOUT_MYISAMMRG=1 -DWITHOUT_HEAP=1 -DWITHOUT_MYISAM=1 -DWITHOUT_SPHINX=1  -DWITHOUT_FEDERATEDX=1 -DWITHOUT_SEQUENCE=1 -DWITHOUT_CSV=1 -DWITHOUT_MARIA=1
make -j `grep processor /proc/cpuinfo | wc -l`
make install

修改了cmake参数后需要清除编译缓存 make clean;rm CMakeCache.txt

这些引擎是必须编译的

xtradb myisam perfschema

失败..

添加MySql用户

create user 'work'@'localhost' identified by '123456'

或者

create user 'work'@'%' identified by '123456'

修改密码

update mysql.user set password=PASSWORD('123456') where user='root';

注意 mysql5.7 user表 密码列不再是Password ,而是authentication_string

如果不生效的话,可以将这两个字段都修改

update mysql.user set authentication_string=PASSWORD('abcd1234') where user='root';

也可以这样添加用户并授权.

GRANT ALL ON *.* to 'work'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

show status; // 显示一些系统特定资源的信息,例如,正在运行的线程数量

show variables; // 显示系统变量的名称和值

show table status; // 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间

如:show table status like 'user_%' \G

show warnings; 查看最后一条警告

show errors; 查看最后一条错误

show full processlist;查看mysql服务器当前的所有连接

show status like 'uptime'; 查看在线时间

show status like 'com_%';查看使用这些指令的计数,如查看MySQL启动后执行的SELECT语句的次数show status like 'com_select';

show status like 'Thread_%';查看当前的线程状态

--查看MySQL本次启动后的运行时间(单位:秒)
show status like 'uptime';

--查看select语句的执行数
show [global] status like 'com_select';

--查看insert语句的执行数
show [global] status like 'com_insert';

--查看update语句的执行数
show [global] status like 'com_update';

--查看delete语句的执行数
show [global] status like 'com_delete';

--查看试图连接到MySQL(不管是否连接成功)的连接数
show status like 'connections';

--查看线程缓存内的线程的数量。
show status like 'threads_cached';

--查看当前打开的连接的数量。
show status like 'threads_connected';

--查看当前打开的连接的数量。
show status like 'threads_connected';

--查看创建用来处理连接的线程数。如果Threads_created较大,你可能要增加thread_cache_size值。
show status like 'threads_created';

--查看激活的(非睡眠状态)线程数。
show status like 'threads_running';


--查看立即获得的表的锁的次数。
show status like 'table_locks_immediate';

--查看不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询,然后拆分表或使用复制。
show status like 'table_locks_waited';

--查看创建时间超过slow_launch_time秒的线程数。
show status like 'slow_launch_threads';

--查看查询时间超过long_query_time秒的查询的个数。返回的是当前session的,要查看全局的加上`global`
show status like 'slow_queries';

开机启动脚本

Debian and Ubuntu function at /lib/lsb/init-functions ln -s /lib/lsb/init-functions /etc/init.d/functions

nginx

#!/bin/sh
#chkconfig: 2345 90 91

binpath=`which nginx`
prog=$(basename $binpath)
. /etc/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0
[ -x $binpath ] || exit 0
[ -f /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

start(){
	echo -n $"Starting $prog: "
	$prog || echo -n "$prog already running"
}
stop(){
	echo -n $"Stopping $prog: "
	$prog -s quit
}
restart(){
	stop
	sleep 1
	start
}
reload() {
	echo -n $"Reloading $prog: "
	$prog -s reload
}
case "$1" in
start)
		$1
		;;
stop)
		$1
		;;
restart)
		$1
		;;
reload)
		$1
		;;
*)
echo $"Usage: $0 {start|stop|restart|reload}"
exit 2
esac

php-fpm

sudo vim /etc/init.d/php-fpm

#!/bin/sh
#chkconfig: 2345 90 91

binpath=`which php-fpm`
prog=$(basename $binpath)
. /etc/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0
[ -x $binpath ] || exit 0
[ -f /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
pidfile=/var/run/php-fpm.pid


start(){
	echo -n $"Starting $prog: "
	$prog || echo -n "$prog already running"
}
stop(){
	echo -n $"Stopping $prog: "
	kill -INT `cat $pidfile`
}
restart(){
	stop
	sleep 1
	start
}
reload() {
	echo -n $"Reloading $prog: "
	kill -USR2 `cat $pidfile`
}
case "$1" in
start)
		$1
		;;
stop)
		$1
		;;
restart)
		$1
		;;
reload)
		$1
		;;
*)
echo $"Usage: $0 {start|stop|restart|reload}"
exit 2
esac
##  添加执行权限
sudo chmod a+x /etc/init.d/nginx
sudo chmod a+x /etc/init.d/php-fpm

##  加入服务
sudo chkconfig --add nginx
sudo chkconfig --add php-fpm

##   开机自启
sudo chkconfig nginx on
sudo chkconfig php-fpm on

## 查看是否开机启动

sudo chkconfig --list nginx

Ubuntu里没有chkconfig 可以使用sysv-rc-conf sudo apt-get install sysv-rc-conf, 然后直接使用 sysv-rc-conf 来管理;

或者sudo sysv-rc-conf nginx on直接把/etc/init.d/nginx 加入到系统自动 启动列表中

centos7 快速安装php7并使用 memcached,redis

Centos 5.X

rpm -Uvh http://mirror.webtatic.com/yum/el5/latest.rpm

CentOs 6.x

rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm

CentOs 7.X

rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

安装之前还需要 epel-release

yum -y install epel-release

安装php7 yum install php70w php70w-cli php70w-fpm php70w-gd php70w-process php70w-mbstring php70w-mcrypt php70w-pdo php70w-xml php70w-mysqlnd php70w-pear php70w-opcache

对于php7.2

yum install php72w php72w-cli php72w-fpm php72w-opcache php72w-gd php72w-mbstring php72w-pdo php72w-mysqlnd

安装 memcached和redis yum install memcached redis

安装php7.3

https://tecadmin.net/install-php7-on-centos7/

设置开机启动

systemctl enable memcached
systemctl enable redis
systemctl start memcached
systemctl start redis

安装redis扩展 yum install php70w-pecl-redis

使用pecl安装memcached或其他扩展

搜索一下看看 pecl search memcached

pecl install memcached 目前memcached在pecl上发布的包还不支持php7

需要自己编译

要编译扩展,还需要安装 yum install php70w-devel

wget -O php-memcached.zip https://codeload.github.com/php-memcached-dev/php-memcached/zip/php7
unzip php-memcached.zip
cd php-memcached-php7
/usr/bin/phpize
./configure --with-php-config=/usr/bin/php-config
make && make install
echo "extension=memcached.so" > `php --ini | grep "Scan for additional" | sed -e "s|.*:\s*||"`/memcached.ini

加入php.ini也可以

echo "extension=memcached.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`

设置开启nginx和php-fpm自启动

systemctl enable nginx
systemctl start nginx
systemctl enable php-fpm
systemctl start php-fpm

数据库通过yum安装

yum info mariadb可查看版本,然后yum install mariadb mariadb-server安装,mysql -V可查看版本

systemctl enable mariadb
systemctl start mariadb

docker 通过docker运行mysql

docker pull mysql

docker run -d --name mysqlserver --restart always -m 500m --log-opt max-size=2m -v mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456  mysql

mongodb

yum install mongodb mongodb-server
systemctl enable mongod
systemctl start mongod

sqlite

执行 VACUUM 整理sqlite文件,缩小体积

从SQL中获取数据库大小

SELECT table_schema AS "Database Name",  ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size in (MB)"  FROM information_schema.TABLES  GROUP BY table_schema;

获取指定数据库中,各表的大小

SELECT table_name AS "Table Name", ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size in (MB)" FROM information_schema.TABLES WHERE table_schema = "xsucongh_test" ORDER BY (data_length + index_length) DESC;