14-09-2016 0 条评论

1. ./configure –prefix=/usr/local/nginx –add-module=/app/ngx_http_consistent_hash-master
安装第三方模块一致性哈希

2. make && make install

netstat -antp
可以看到是哪个进程及服务占用端口。

pkill – p http 强制杀死所有http服务

nginx 信号量

1.通过命令显示nginx服务

ps aux|grep nginx

2.杀死相应的进程(INT)

kill -INT 26733

3.优雅的关闭进程,即等请求结束后再关闭(QUIT)

kill -QUIT 26733

4.平滑的重启nginx(HUP)(无需重启nginx,就可以加载修改过的配置文件,此时也是优雅的关闭进程)

kill -HUP 26733

(备注:通过nginx提供的命令也可以执行操作,./sbin/nginx -s reload)

5.重读日志(USR1)

linux系统下一个文件对应着一个inode节点,因为nginx监听着当前的access.log节点,所以不管是重命名或者什么操作,日志都是写这个文件上。
可以通过如下命令,更改inode节点,重读日志,通过这个信号,我们可以把nginx下面的日志,按照每天的时间来存储。

kill -USR1 26733
(备注:通过nginx提供的命令也可以执行操作,./sbin/nginx -s reopen)

6. 当升级nginx软件时(USR2)配合(WINCH),可以平滑的升级,优雅关闭旧的进程,启用新版本的nginx进程。

tips:有些人觉得每次命令都要输个进程号很麻烦,有一种方法可以获取相应的PID。
cat logs/nginx.pid 可以显示相应的进程ID,所以可以使用命令:kill -INT ‘cat logs/nginx.pid’。

7. 通过命令可以查看配置文件正确

./sbin/nginx -t

8. nginx配置段
全局区
worker_processes 1 说明有1个子进程,这个值太大无益处,因为要争夺CPU,一般设置为CPU数*核数(如一个CPU,其中为4核),只需设置为4。

Event
一般是配置nginx进程与连接的特性。(如一个worker同时允许多少个连接)。
worker_connections 1024 一个子进程最大允许连1024个连接。
http
可以在server里面配置虚拟主机,可配IP、域名、端口。

9. 日志管理
nginx的server段有一条信息
#access_log logs/host.access.log main;
说明格式的日志是main格式,当然你也可以自定义格式。
main格式:
log_format main ‘$remote_addr – $remote_user[$time_local]”$request””
‘$status $body_bytes_sent “$http_referer”‘
‘$http_user_agent'”$http_x_forwarded_for”;
其中主要说下$http_x_forwarded_for这个选项,主要是用户在使用代理时,会把最后一层代理的IP加在头部信息中。

按照年月目录存诸当月每天的日志记录,需要使用到shell脚本以及crontab -e设置定时(定时计划)
sh:
#!/bin/bash
LOGPATH=/usr/local/nginx/logs/abc.com.access.log
BASEPATH=/data/$(date -d yesterday +%Y%m)
mkdir -p $BASEPATH
BAK = $BASEPATH/$(date -d yesterday +%d%H%M).abc.access.log
mv $LOGPATH $BAK
touch $LOGPATH
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

10.Location
精准匹配
如果不写root html 这行,则会继承nginx的目录,如:/usr/local/nginx/html
location = /index.htm{
root /var/www/html/;
index index.htm index.html;
}
location = /{
root /var/www/html/;
index index.htm index.html;
}
location /index.htm{
root html;
index index.htm index.html;
}
通过上面的这三个location,我可以分析出,当浏览器输入一个地址的时候,如:localhost,那么默认就会走第二个location,因为第二个是走index.htm,又因为是走根目录,所以会再次转发,所以再一次走到第一个精准匹配,反之如果把第二个的换成index index.html index.htm;,则会走第三个,因为第一个精准匹配不到,只有第三个不是精准匹配,所以匹配成功。

Location总结流程:当一个URI发出来的时候,首先会去找精准匹配,如果有匹配到,则会返回;如果没有,那么就会走普通匹配,看是否命中多个,记忆最长的匹配结果,暂时不返回出去,继续去寻找正则匹配,如果有匹配正则,则会直接返回,如果没有的话,就会返回刚才记忆最长的普通匹配。

11.Rewrite
如可以禁用某个IP不允许访问
location = /{
if($remote_addr=192.16/8.1.100){
return 403;
}
//正则匹配
if($http_user_agent ~ msie){
rewrite ^.*$ /msie.html;
break; //这里如果不break,会循环重定向。
}
//通过变量自定义404
if(!-e $document_root$fastcgi_script_name){
rewrite ^.*$ /404.html;
break;
}
//set设置变量用法
可以用来达到多条件判断时作标记用,达到apache下的rewrite_condition的效果。
如下:判断IE并重写,且不用break;这里纯是学习set的用法。
if($http_user_agent ~* msie){
set $isie 1;
}
if($fastcgi_script_name == ie.html){
set $isie 0;
}
if($isie 1){
rewrite ^.*$ ie.html
}
root /var/www/html/;
index index.htm index.html;
}
注意:用url重写时,正则里如果有{},正则就要用双引号包起来。

12.Nginx与PHP整合
因为PHP与nginx是独立运行的,它不同于apache是把php当成一个模块在运行,所以nginx是通过fastcgi通讯,将所有的php请求转发到php-fpm进程。
配置如下:
location ~ \.php{
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/html/$fastcgi_script_name;
include fastcgi_param;
}
在linux下,如果使用mysql连接服务器的时候,如果是有localhost会采用socket连接,所以php.ini必须要配置,如:
修改php.ini的下面选项。
mysql.default_socket = /var/lib/mysql/mysql.sock
当然除此之外面不想修改的话,那么就使用127.0.0.1连接,采用的就是tcp协议连接。
13.gzip压缩
原理:
浏览器–请求–>声明可以接受gzip压缩或deflate压缩或sdch压缩等。
从http协议角度看,声明acceopt-encoding:gzip deflat sdch头部压缩的算法。
sdch是google推出的一种压缩方式。
gzip配置的常用参数
gzip on|off; #是否开启gzip
gzip_buffers 32 4k| 16 8k #缓冲(压缩在内存中缓冲几块?每块多大?)
gzip_comp_level[1-9] #推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
gzip_disable #正则匹配 UA 什么样的uri不进行gzip
gzip_min_length 200 #开始压缩的最小长度(再小就不要压缩了,意义不大)
gzip_http_version 1.0|1.1 #开始压缩的http协议(可以不设置,目前都是1.1协议)
gzip_proxied #设置请求者代理服务器,该如何缓存内容。
gzip_types text/plain application/xml #对哪些类型的文件用压缩,如:text,html,css,xml,js
gzip_vary on|off #是否传输gzip压缩标志
注意:图片/mp3,这样的二进制文件,不必压缩。
因为压缩率比较小,比如100->80字节,而且压缩也是耗费CPU资源的。
特别小的文件,也没有必要压缩,因为压缩本身也是有字节的。
14.缓存设置(expires)
格式:
location ~ \.(jpg|jpeg|gif|png|css|js)${
root html
expires 1d;
}
其中日期格式为:expires 1s(秒),30m(分),2h(小时),1d(天)。
注意:服务器的日期格式一定要准确,否则可能造成缓存失效。
其实304状态也是一种好的缓存手段。
原理:服务器响应文件内容时,同时响应etag标签(内容的签名,内容一样,他也变),和last_modified_since标签。
下次浏览器去请求时,先发送头信息,如果检查出文件没有发生改变(修改时间及etag),如果没有,直接返回头信息,所以size是0,浏览 器知道没有文件没有改变,直接调用本地缓存。
15.nginx反向代理服务器+负载均衡
反向代理:
location ~ \.php${
proxy_pass http://192.168.1.2:8080;
}
这里把所有的php请求,转到192.168.1.2服务器,也就是反向代理。

负载均衡
location ~ \.(jpg|jpeg|gif|png)${
proxy_pass http://imgserver;
}
upstream imgserver{
server 192.168.1.200:81 weight=1 max_fails=2 fail_timeout=3;
server 192.168.1.200:82 weight=1 max_fails=2 fail_timeout=3;
}
server{
listen 81;
server_name localhost;
root html;
}
server{
listen 82;
server_name localhost;
root html;
}

16.nginx连接memcached
nginx首先连接memcache,如果有则输出数据,如果没有则连接到php,再去mysql找数据,再用memcache SET数据。
location / {
set $memcached_key “$uri”;
memcached_pass 127.0.0.1:11211;
error_page 404 /callback.php
}
首先连接memcache,添加一个key,这时key就是uri参数。
如果要给memcached,做集群就使用一致性哈希。
upstream mcserver{
consistent_hash $request_uri;//使用一致性哈希
server 192.168.1.250:11211;
server 192.168.1.250:11212;
server 192.168.1.250:11213;
}
location / {
set $memcached_key $request_uri;
memcached_pass mcserver;
error_page 404 /callback.php
}

memcache 也需要设置一致性哈希。
1.首先php需要添加多台memcache服务器。
2.修改php.ini,支持一致性哈希
memcache.hash_strategy=consistent
Upstream做负载均衡时,要用IP或者远程主机名,不要使用localhost。

17.安装统计模块,便于观察nginx状态
编译nginx的时候带上 –with-http_stub_status_module

location /status {
stub_status on;
access_log off;
allow 192.168.1.100;//允许这个IP访问
deny all;//其它禁止访问
}

18.nginx高并发优化

主要思路通过优化socket和文件
1.socket
系统层面:
最大连接数somaxconn
查看连接数 more /proc/sys/net/core/somaxconn
设置echo 50000 > /proc/sys/net/core/somaxconn
加快tcp连接的回收 recycle
cat /proc/sys/net/ipv4/tcp_tw_recycle 默认是0,不快速回收。需要改为1
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
空的tcp是否允许回收利用reuse
cat /proc/sys/net/ipv4/tcp_tw_reuse 默认是0,不回收利用。需要改为1
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
洪水攻击 不做洪水抵御
more /proc/sys/net/ipv4/tcp_syncookies 为1就是抵御,需要改为0
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
nginx:
子进程允许打开的连接(worker_connections)
http连接快速关闭(keep_alivetime=0)
2.文件
系统层面:
ulimit -n 设置一个比较大的值
ulimit -n 50000
nginx:
子进程允许打开的文件 worker_limit_nofile
worker_limit_nofile 10000
19.服务器集群搭建
php-fpm启动,监听多个端口。
start.sh
#!/bin/sh
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm.conf
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9001.conf
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9002.conf
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9003.conf
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm9004.conf

02-08-2016 0 条评论

因为发现很多人不会源码安装lnmp环境,刚好准备搭建环境,所以把基本步骤写出来,以后大家照着敲就可以。
本次搭建使用的都是最新的nginx1.11.3和php7(号称比5.6有2倍的性能提升),以及mysql5.7.13(号称有着一倍的性能提升)。
首先我们来安装mysql5.7.13
因为使用的是ubuntu12.04所以使用deb安装,见地址,先下载下来。

wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-server_5.7.14-1ubuntu12.04_amd64.deb-bundle.tar

然后解压:

tar xvf mysql-server_5.7.14-1ubuntu12.04_amd64.deb-bundle.tar

会得到如下文件:

 1.mysql-common_5.7.14-1ubuntu14.04_amd64.deb
2.libmysqlclient20_5.7.14-1ubuntu14.04_amd64.deb
3.libmysqlclient-dev_5.7.14-1ubuntu14.04_amd64.deb
4.libmysqld-dev_5.7.14-1ubuntu14.04_amd64.deb
5.mysql-community-client_5.7.14-1ubuntu14.04_amd64.deb
6.mysql-client_5.7.14-1ubuntu14.04_amd64.deb
7.mysql-community-server_5.7.14-1ubuntu14.04_amd64.deb

依次安装执行:

sudo dpkg -i mysql-common_5.7.14-1ubuntu12.04_amd64.deb libmysqlclient20_5.7.14-1ubuntu12.04_amd64.deb libmysqlclient-dev_5.7.14-1ubuntu12.04_amd64.deb libmysqld-dev_5.7.14-1ubuntu12.04_amd64.deb mysql-client_5.7.14-1ubuntu12.04_amd64.deb mysql-community-server_5.7.14-1ubuntu12.04_amd64.deb

其间会提输入root密码。
添加mysql用户组和用户。
groupadd mysql
useradd -r -g mysql mysql
默认安装的文件在:
配置文件:/etc/mysql/my.cnf
datadir:/var/lib/mysql 需要赋予mysql权限 chown -R mysql:mysql ./
mysqld /usr/sbin/mysqld
如果安装完成之后没有看到data文件夹,可以操作下面的步骤。
/usr/sbin/mysqld –user=mysql –datadir=/var/lib/mysql/data/mysql –initial –initialize-insecure
现在可以启动mysql服务了。
/etc/init.d/mysql start
nginx安装
wget https://nginx.org/download/nginx-1.11.3.tar.gz
tar zxvf nginx-1.11.3.tar.gz
cd nginx-1.11.3
groupadd nginx
useradd -r -g nginx nginx

./configure --prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_gzip_static_module \
--with-pcre \

通常安装nginx需要使用zip和pcre一个是用来数据传输压缩及使用正则表达式(rwrite)
make && make install
PHP安装
wget http://cn2.php.net/distributions/php-7.0.9.tar.gz
tar zxvf php-7.0.9.tar.gz
cd php-7.0.9

./configure --prefix=/usr/local/php7 \
--with-config-file-path=/usr/local/php7/etc \
--with-mcrypt=/usr/include \
--with-gd \
--with-iconv \
--with-zlib \
--enable-xml \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--enable-ftp \
--enable-gd-native-ttf \
--with-openssl \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--enable-sockets \
--enable-opcache \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd

因为php7版本不支持mysql,所以这里不需要安装。
当然对于一个新的ubuntu系统,不能顺利的完成检测。
所以这时候就要根据系统的提示安装相应的软件,如:libxml2、jpg、png、curl等。
可以使用ubuntu系统自带的apt-get install。
make && make install
nginx与php-fpm通讯
一般安装完成php就有php-fpm,不过相应的配置文件可能要重新命名。
即php7/etc/php-fpm.conf.default
cp php-fpm.conf.default php-fpm.conf
因为fpm.conf默认使用的是nobody用户名及用户组,系统中是不存在的,所以需要新建。
groupadd nobody
useradd -r -g nobody nobody
现在切换到nginx,使它能与php-fpm通讯。
打开下面的注释。

 location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

至此,lnmp环境就已经装好了,现在你的程序开始启航了。