Nginx简介:跟Apache一样,是一款web服务器软件,也在普遍使用
Nginx的特点:并发量高,内存占用小、处理速度快、但是CPU占用大、安全性较低、模块较少
启动命令:nginx 停止命令:killall -s QUIT nginx 重启命令:killall -s QUIT nginx 》》nginx
重新加载:killall -s HUP nginx 查看服务开启状态:ps -ef | grep "nginx" 或者netstat -anpt | grep "nginx"
配置文件详解
nginx配置文件主要分为六个区域:
1.main:全局设置 2.events:nginx工作模式 3.http:http设置
4.sever:主机设置 5.location:URL匹配 6.upstream:负载均衡服务器设置
配置文件结构分布:
main
events{。。。。。。}
http{
。。。。。。
server{
。。。。。。
location 1{。。。。。。}
location 2{。。。。。。}
}
}
全局配置:
user nobody; //程序用户名
worker_processes 1; //设置nginx子进程数量,即提供服务的进程数量,该数值建议和服务cpu核数保持一致
error_log logs/error.log; //设置错误日志的路径
error_log logs/error.log notice; //设置错误日志的路径
error_log logs/error.log info; //设置错误日志的路径
pid logs/nginx.pid; //设置nginx进程pid文件所在路径
worker_rlimit_nofile 10000; //设置nginx最多打开文件数限制
events配置:
worker_connections 1024; //定义每个work_process同时开启的最大连接数
accept_mutex on; //防止多个进程争抢资源,默认就是on
multi_accept on; //nginx worker processer可以做到同时接收多个新到达的网络连接,默认为off
use epoll; //设置模式,模式有如下:
select:只能在Windows下使用,这个事件模型不建议在高负载的系统使用
poll:Nginx默认首选,但不是在所有系统下都可用
kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的
epoll:这种方式是在Linux 2.6+内核中最高效的方式
rtsig:实时信号,可用在Linux 2.2.19的内核中,但不适用在高流量的系统中
eventport:Solaris 10最高效的方式
http配置:
MIME-Type
include mime.types; //设置nginx能识别的网络资源媒体类型(如,文本、html、js、css、流媒体等)
default_type application/octet-stream; //设置默认的type,如果不定义改行,默认为text/plain.
log_format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
其中main为日志格式的名字,后面的为nginx的内部变量组成的一串字符串。
access_log logs/access.log main; //设置日志的路径以及采用的日志格式,该参数可以在server配置块中定义
sendfile on; //是否调用sendfile函数传输文件,默认为off
sendfile_max_chunk 128k; //限制Nginx worker process每次调用sendfile()函数传输数据的最大值,默认值为0无限制
tcp_nopush on; //当调用tcp_cork方法进行数据传输,默认值为on
keepalive_timeout 65 60; //第一个值设置nginx服务器与客户端会话结束后仍旧保持连接的最长时间,单位是秒,默认为75s
第二个值针对客户端的浏览器来设置的,可以通过curl -I看到header信息中有一项Keep-Alive: timeout=60,如果
补充:不设置就没有这一项,第二个数值设置后,浏览器就会根据这个数值决定何时主动关闭连接,Nginx服务器就不操心了。但
有的浏览器并不认可该参数
send_timeout //发送响应的超时时间
client_max_body_size 10m; //限制Content-Length所示值的大小的
gzip on; //是否开启gzip压缩
gzip_min_length 1k; //设置允许压缩的页面最小字节数,默认值20
gzip_buffers 4 16k; //设置系统获取几个单位的buffer用于存储gzip的压缩结果数据流
gzip_http_version 1.1; //用于识别 http 协议的版本
gzip_comp_level 6; //gzip压缩比
gzip_types mime-type ... ; //匹配mime类型进行压缩
gzip_proxied any; //Nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩
以下为可用的值:
off - 关闭所有的代理结果数据的压缩
expired - 启用压缩,如果header头中包含 "Expires" 头信息
no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息
no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息
private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息
no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息
no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息
auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息
any - 无条件启用压缩
gzip_vary on; //可以让前端的缓存服务器缓存经过gzip压缩的页面
为了方便我们自己写个脚本,然后可以用service命令来管理nginx
脚本如下:
#!/bin/bash
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
PROG_FPM="/usr/local/sbin/php-fpm"
PID_FPM="/usr/local/php5/var/run/php-fpm.pid"
isstatus=`ps -ef | awk '{print $1}' | grep "nginx" | wc -l`
start()
{
if [ $isstatus -ne 0 ]
then
echo "nginx already started"
else
$PROG
$PROG_FPM
echo "nginx starting......"
fi
}
stop()
{
if [ $isstatus -ne 0 ]
then
kill -s QUIT $(cat $PIDF)
kill -s QUIT $(cat $PID_FPM)
echo "nginx shutting down......"
else
echo "nginx has ceased"
fi
}
restart()
{
if [ $isstatus -ne 0 ]
then
kill -s QUIT $(cat $PIDF)
kill -s QUIT $(cat $PID_FPM)
$PROG
$PROG_FPM
echo "nginx restart......"
else
echo "nginx not started"
fi
}
reload()
{
kill -s HUP $(cat $PIDF)
kill -s HUP $(cat $PID_FPM)
echo "nginx is reloading......"
}
status()
{
if [ $isstatus -eq 0 ]
then
echo "nginx:nginx not running"
else
echo "nginx:mginx is running"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
status)
status
;;
*)
echo "Usage:$0 {start|stop|restart|reload|status}"
esac
注意:记得把脚本名字改成nginx,然后再放到/etc/init.d/目录下,之后就可以使用service命令管理了
启动服务:service nginx start 停止服务:service nginx stop 重启服务:service nginx restart
查看服务:service nginx status 重新加载服务:service nginx reload
nginx主配置文件位置:/usr/local/nginx/conf/nginx.conf(源码包安装)
1.安装支持软件,Nginx的配置需要pcre、zlib等软件
yum -y install pcre-devel zlib-devel
2.nginx默认以nobody运行,建议建立专用用户
useradd -M -s /sbin/nologin nginx
3.下载Nginx软件包解压安装
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && make install
编译安装nginx选项:
--prefix=目录:设置Nginx的安装路径 默认路径:/usr/local/nginx
--sbin-path=目录:设置Nginx的可执行文件路径 默认路径:prefix/sbin/nginx
--conf-path=目录:设置Nginx配置文件路径 默认路径:prefix/conf/nginx.conf
--pid-path=目录:设置Nginx pid文件路径 默认路径:prefix/logs/nginx.pid
--error-log-path=目录:设置错误日志存放路径 默认路径:prefix/logs/error.log
--http-log-path=目录:设置访问日志存放路径 默认路径:prefix/logs/access.log
--user=用户名:设置运行Nginx的用户 默认用户:nobody
--group=用户组名:设置运行Nginx的用户组 默认用户组:nobody
4.路径的优化
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
5.检查优化以及配置文件
启动Nginx:nginx
对网页访问测试服务是否搭建成功(下图为Nginx的默认网页,能访问为成功)
1.安装依赖包:yum -y install ncurses-devel
2.安装cmake工具
然后gmake && gmake install
3.解压编译安装mysql
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
然后make && make install
4.优化路径以及优化管理
运行/etc/profile文件(没有权限记得加权限)
5.初始化数据库,启动mysql服务
创建用户组和用户,设置为属主目录
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
路径优化
ln -s /usr/local/mysql/bin/* /usr/bin
下图为安装成功
1.下载各种依赖包
yum -y install zilb zlib-devel libxml2-devel pcre pcre-devel libpng libpng-devel libjpeg libjpeg-devel freetype freetype-devel curl-devel gd
2.解压源码包并且编译安装
解压再到解压目录下编译
./configure --prefix=/usr/local/php5 --with-gd --with-curl --with-zlib --with-mysqli --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib
然后安装:make && make install
复制配置文件模板使用
cp php.ini-development /usr/local/php5/php.ini
3.路径优化
ln -s /usr/local/php5/bin/* /usr/local/bin/
ln -s /usr/local/php5/sbin/* /usr/local/sbin/
4.实现nginx与PHP对接
useradd -M -s /sbin/nologin php
使用模板/usr/local/php5/etc/php-fpm.conf.default
cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf
配置模块配置文件:vim /usr/local/php5/etc/php-fpm.conf
pid = run/php-fpm.pid
user = php
group = php
PHP优化(可选)
pm.max_children = 50 // 根据内存大小设置,一个进程大约 3M
pm.start_servers = 20 //启动时开启的进程数
pm.min_spare_servers = 5 //最少空闲进程数
pm.max_spare_servers = 35 //最多空闲进程数
启动fpm进程:/usr/local/sbin/php-fpm
查询php-fpm是否启动(下图为启动):netstat -anpt | grep php-fpm
修改nginx.conf,在www.aaa.com网站中使用本地php环境:vim /usr/local/nginx/conf/nginx.conf
在server{}里添加如下:
location ~ \.php$ {
root /var/www/aaa;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
记得保存重启服务
测试
编写php文件
phpinfo();
?>
编写php文件测试数据库
出现以上错误说明mysql_connect这个模块将在未来弃用,请你使用mysqli或者PDO来替代
解决方法一(不建议,最好把报错显示出来):
display_errors=on改为off
解决方法二:
修改php文件代码:mysql_connect改成mysqli_connect
成功如下图:
补充:安装ZendGuardLoader优化模块
cp ZendGuardLoader.so /usr/local/php5/lib/php/
修改php.ini配置文件启用优化模块
zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so
zend_loader.enable=1
虚拟站点搭建
直接修改主配置文件添加一个server板块即可,配置如下图(基于域名):
vim /usr/local/nginx/conf/nginx.conf
作用原理:Nginx静态页面的处理拥有更好的性能,用Nginx访问html而用Apache访问php
1.编译安装Apache之后修改配置文件端口改为8080
Listen 8080和ServerName study2.renjie.com:8080
2.安装LAMP需要的php扩展包libmcrypt、mhash、mcrypt
3.重新编译php
./configure --prefix=/usr/local/php5 --with-mcrypt --with-apxs2=/usr/local/httpd/bin/apxs --with-gd --with-curl --with-zlib --with-mysqli --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib
Apache主配置文件添加识别php
AddType application/x-httpd-php .php和DirectoryIndex index.php index.html
编写网页测试访问该地址8080端口和下面的php文件
最后修改Nginx主配置文件
添加
location ~ \.php$ {
proxy_pass http://www.cba.com;
}
保存重启服务访问测试用Nginx下的www.bbb.com去访问Apache下的php网页
基于授权的访问控制
下载工具安装:yum install -y httpd-tools
1.生成用户密码认证文件
htpasswd -c /usr/local/nginx/passwd.db webadmin
然后会让你输入密码并确认密码
2.修改passwd.db的权限为400 ,修改文件属主为nginx用户
3.修改配置文件,添加认证项
在要设置的站点location下添加
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db;
基于地址限制的访问控制
直接在要设置的站点的location下设置
deny 192.168.0.100;
allow all;
隐藏版本号
查询版本号:curl -I http://192.168.0.122(也可以把IP地址换成解析后的网址)
修改配置文件:vim /usr/local/nginx/conf/nginx.conf
在http里添加server_tokens off;就可以隐藏版本(记得重启服务生效)
补充:在编译之前修改安装包里nginx-1.17.8/src/core目录下的nginx.h文件
修改下面两个参数再编译安装,可以设置版本信息显示内容
#define NGINX_VERSION "1.17.8"
#define NGINX_VER "nginx/" NGINX_VERSION
修改用户组
Nginx运行时主进程是root创建,子进程由指定 的用户和组创建,Nginx默认使用的nobody
1.编译安装时指定用户和组
./configure –prefix=/usr/local/nginx –user=nginx –group=nginx –with-http_stub_status_module
2.编译安装完之后修改配置文件:vim /usr/local/nginx/conf/nginx.conf
user nginx nginx;
配置网页缓存时间
修改主配置文件:vim /usr/local/nginx/conf/nginx.conf
在网页块下新加一个location
日志切割
Nginx没有类似apache的cronlog日志分割处理能力,但是可以通过nginx的信号控制功能脚本来实现日志的分割
#!/bin/bash
#定义各种变量
date=`date -d "-1 day" +%Y%m%d`
logpath="/usr/local/nginx/logs"
pidpath="/usr/local/nginx/logs/nginx.pid"
#移动日志到存放目录
[ -d $logpath ] || mkdir -p $logpath
mv /usr/local/nginx/logs/access.log ${logpath}/www..access.log.$date
#重新创建日志目录
kill -HUP `cat $pidpath`
#定期删除多余的日志文件(删除30天之前的)
find $logpath -mtime +30 | xargs rm -rf
nginx 1.16版本开始自带了日志切割功能,而1.12版本,目前有几种办法可以做到按天切割
设置连接超时
为了避免一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间
修改配置文件:vim /usr/local/nginx/conf/nginx.conf
Keepalive_timeout 65 180 ; \\默认时间65 超时时间180
进程优化
优化nginx进程数量,修改 Nginx 的配置文件的 worker_processes 参数,一般设为 CPU 的个数或者核数, 在高并发的情况下可设置为 CPU 个数或者核数的 2 倍,可以查看 CPU 的核数以确定参数
查看进程:cat /proc/cpuinfo | grep -c "physical"
默认情况,nginx的多个进程可能更多的跑在一个CPU上,可以分配不同的进程给 不同的 CPU 处理,充分利用硬件多核多 CPU,在一台 4 核 CPU 服务器上,可以设置每个 进程分别由不同的 CPU 核心处理,达到 CPU 的性能最大化
修改配置文件:vim /usr/local/nginx/conf/nginx.conf
worker_processes 4; \\开启进程数
worker_cpu_affinity 0001 0010 0100 1000 \\逻辑CPU
补充:1.16版本
work_processes auto;
网页压缩
Nginx 的 ngx_http_gzip_module 压缩模块提供了对文件内容压缩的功能,默认nginx已经安装此模块
修改配置文件:vim /usr/local/nginx/conf/nginx.conf
gzip on; \\开启gzip压缩输出
gzip_min_length 1k; \\用于设置允许压缩的页面最小字节数
gzip_buffers 4 16k; \\表示申请 4 个单位为 16k 的内存作为压缩结果流缓存,默认值 是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果
gZip_http_version 1.0; \\用于设置识别 http 协议版本,默认是 1.1,目前大部分浏览 器已经支持 gzip 解压,但处理最慢,也比较消耗服务器 CPU 资源
Gzip_comp_level2; \\用来指定 gzip 压缩比,1 压缩比最小,处理速度最快;9 压缩 比最大,传输速度快,但处理速度最慢,使用默认即可
Gzip_types text/plain; \\压缩类型,是对哪些网页文档启用压缩功能
Gzip_vary on; \\选项可以让前端的缓存服务器缓存经过 gzip 压缩的页面
防盗链
Nginx 的防盗链原理是加入 location 项,用正则表达式过滤图片类型文件,对于信任的 网址可以正常使用,不信任的网址返回相应的错误图片
修改配置文件:vim /usr/local/nginx/conf/nginx.conf
在需要设置的网页段下面添加location
location ~*\.(png|jpg|gif|swf)$ {
valid_referers none blocked *.bbb.com bbb.com;
if ($invalid_referer) {
rewrite ^/http://www.aaa.com/error.jpg;
}
}
FPM参数优化
Nginx的PHP解析功能实现其中一种是交给FPM处理,如果要提供nginx对PHP的处理速度,需要对FPM进行优化
修改配置文件:vim /usr/local/php5/etc/php-fpm.conf
pm = dynamic / static; \\static(静态)或者dynamic(动态)
pm.max_children = 5; \\如果静态方式开启的php-fpm进程数,在动态方式下他限定php-fpm的最大进程数
pm.start_servers = 2; \\动态情况下初始启动的进程数
pm.max_spare_servers = 3; \\动态情况下最大的空闲进程
pm.min_spare_servers = 5; \\动态情况下最小的空闲进程
pm.max_requests = 500; \\最大的请求数
补充:建议设置
pm=dynamic;
pm.max_children=20;
pm.start_servers=5;
pm.min_spare_servers=5;
pm.max_spare_servers=20;
这样可以最大的节省内存并提高执行效率