安装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
- Regular Expression Locations
- Named Locations
- 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/
都能被重写为/
代理与后端保持长连接
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
,那么这些请求就是线程池长连接服务的,没有额外开销.
注意:nginx
的proxy_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
sudo apt-get remove apache2
sudo apt-get remove apache2.2-common
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-fpm
和opcache
,添加其他常用扩展--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.conf
内global
段error_log
为/var/log/php-fpm/php-fpm.log
- 修改
php-fpm.conf
内global
段pid
为/var/run/php-fpm.pid
- 修改
www.conf
内slowlog
为/var/log/php-fpm/$pool.log.slow
- 修改
www.conf
内request_slowlog_timeout
为5
下面一段代码实现自动修改
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
可查看关于此文件的配置信息
注意: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-devel
或 sudo 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 运行时错误
- [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;