Nginx服务管理与配置
Nginx服务管理与配置
前言: 我这里讲解nginx服务的安装以及配置和管理
nginx和httpd的区别是什么?
nginx不但跟httpd一样可以作为web服务,还有负载均衡的作用,处理请求上它是异步非堵塞型的,而httpd是堵塞型的。相对httpd来说nginx是轻量级的,在高并发下 nginx 能保持低资源低消耗高性能,处理静态文件,性能比httpd高得多,它支持7层负载均衡,它还是个优秀的反向代理服务
文章目录
一、nginx安装
nginx下载地址:http://nginx.org/download/
源码安装
1.安装依赖工具和包
#更新epel源和安装编译工具
yum install -y epel-release
yum clean all && yum makecache
yum -y install gcc gcc-g++ make
#安装依赖包
yum -y install openssl openssl-devel pcre-devel curl-devel freetype-devel
2.编译安装nginx
#添加apache用户和用户组
groupadd nginx && useradd -M -s /sbin/nologin nginx -g nginx
tar zxf nginx-1.21.6.tar.gz && cd nginx-1.21.6
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && make install
启动服务:
/usr/local/nginx/sbin/nginx
yum/apt安装
centos系统使用的是yum,ubuntu和debian使用的是apt
1.yum安装
yum -y install nginx
2.apt安装
apt -y install nginx
二、nginx服务配置
配置文件
注意:个人喜好我安装在/usr/local/nginx这个目录下,根据个人安装而定
大家可以通过配置来配置httpd服务的运行设置
配置文件路径:/usr/local/nginx/conf/nginx.conf
yum和apt安装的话一般配置文件在:/etc/nginx/nginx.conf
注意:如果是yum或者apt安装的话一定要看是否加载启用了其他子配置文件,以免修改出错不容易找到问题
nginx的配置文件主要分为5个块(全局块、evebts块、http块、server块、location块)
1、全局块:一般配置nginx用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx与用户的网络连接。有每个进程的最大连接数,事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:可以嵌套多个location,配置虚拟站点的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况,一个server中可以有多个location。
nginx配置文件的结构分布:
#全局配置
events {
#events块配置
}
http {
#http块配置
server {
#server块配置
location / {
#location块配置
}
location /web/ {
#location块配置
}
}
server {
#server块配置
location / {
#location块配置
}
}
}
全局配置项目
user nginx; #程序用户
group nginx; #程序用户组
worker_processes 1; #进程数量,建议和cpu核心数一致
#指定错误日志的存放位置和级别[ debug | info | notice | warn | error | crit ]
error_log logs/error.log; #错误日志位置
#error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid; #nginx进程pid存放文件位置
include conf/conf.d/*.conf #支持像下面配置一样的全局包含的方法
events块
events
{
use epoll;
#使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定
#补充说明:与apache相类,nginx针对不同的操作系统,有不同的事件模型
#A)标准事件模型
#Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
#B)高效事件模型
#Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃
#Epoll:使用于Linux内核2.6版本及以后的系统。
#/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+
#Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁
worker_connections 1024; #每个工作进程的最大连接数量
keepalive_timeout 60; #keepalive超时时间
client_header_buffer_size 4k; #客户端请求头部的缓冲区大小
open_file_cache max=65535 inactive=60s; #这个是指多长时间检查一次缓存的有效信息,使用字段:http, server, location
open_file_cache_valid 80s; #open_file_cache指令中的inactive参数时间内文件的最少使用次数
#这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,
#如果使用更大的值,文件描述符在cache中总是打开状态
open_file_cache_min_uses 1;
open_file_cache_errors on; #是否在搜索一个文件是记录cache错误.
}
http块
http
{
include mime.types; #设定mime类型,类型由mime.type文件定义
access_log logs/host.access.log main; #指令指定日志文件的存放路径
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';
#日志格式设置
$remote_addr与$http_x_forwarded_for #记录客户端的ip地址
$remote_user #记录客户端用户名称
$time_local #记录访问时间与时区
$request #记录请求的url与http协议
$status #记录请求状态;成功是200
$body_bytes_sent #记录发送给客户端文件主体内容大小
$http_referer #记录从那个页面链接访问过来的
$http_user_agent #记录客户浏览器的相关信息;
#通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了
#通过$remote_add拿到的IP地址是反向代理服务器的iP地址
#反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息
#用以记录原有客户端的IP地址和原来客户端的请求的服务器地址
server_names_hash_bucket_size 128;
#保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的
client_header_buffer_size 4k;
#客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,
#一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k
large_client_header_buffers 8 128k;
#客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值
#如果header过大,它会使用large_client_header_buffers来读取
open_file_cache max=102400 inactive=20s;
这个指令指定缓存是否启用。
例: open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
#使用字段:http, server, location 指定何时需要检查open_file_cache中缓存项目的有效信息
open_file_cache_min_uses 2;
#使用字段:http, server, location
#指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数
#如果使用更大的值,文件描述符在cache中总是打开状态
open_file_cache_errors on;
#使用字段:http, server, location 指定是否在搜索一个文件是记录cache错误
client_max_body_size 300m; #设定通过nginx上传文件的大小
sendfile on;
#指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on
#如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime
tcp_nodelay on;
tcp_nopush on;
#此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
keys_zone=cache_one:200m inactive=1d max_size=30g;
#设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB
keepalive_timeout 120; #keepalive超时时间
client_body_buffer_size 512k;
如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常
#如果注释该指令,使用默认的client_body_buffer_size设置,
#也就是操作系统页面大小的两倍,<br>8k或者16k,问题就出现了
#无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
#gzip 模块
gzip on; #gzip模块是否开启
gzip_static on; #静态页面压缩
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作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩
#upstream 模块
#加权轮询
upstream back_openaccess {
server 192.168.0.101:80 weight=2 max_fails=3 fail_timeout=10s;
server 192.168.0.102:80 weight=2 max_fails=3 fail_timeout=10s;
}
#ip_hash
upstream back_openadmin {
ip_hash;
server 192.168.0.101:80;
server 192.168.0.102:80;
}
加权轮询配置参数:
down #表示单前的server暂时不参与负载.
weight #默认为1.weight越大,负载的权重就越大。
max_fails #允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
fail_timeout #max_fails次失败后,暂停的时间。
backup #其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
max_conns #限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。
#注意:1.5.9之后的版本才有这个配置
}
server块
server
{
listen 80 #监听端口
server_name #服务器域名
root #设定响应的根目录
include #引入其他的配置文件。
underscores_in_headers #支持读取非nginx标准的用户自定义header的,但是需要在http或者server下开启header
proxy_redirect default [ default|off|redirect replacement ] #修改被代理服务器返回的响应头
}
location块
location /
{
server_name #服务器域名
root #设定响应的根目录,server块下配置了的话建议先注释
proxy_pass 127.0.0.1:80; #转发的代理路径
}
多站点配置
你需要配置几个站点就添加几个server块就行了,可以通过修改每个站点的域名或者端口来进行划分不同站点的区别
比如:下面不同域名指向不同的响应的根目录
server {
listen 80;
server_name www.aaa.com;
location / {
root /var/www/html/aaa;
index index.html index.php;
}
}
server {
listen 80;
server_name www.bbb.com;
location / {
root /var/www/html/bbb;
index index.html index.php;
}
}
三、nginx服务管理
日志管理
Nginx没有类似apache的cronlog日志分割处理能力,所以我这里自己写的脚本来进行切割
#!/bin/bash
#定义各种变量
date=`date +%Y-%m-%d`
logname="/usr/local/nginx/logs/access.log"
logpath="/usr/local/nginx/logs"
#移动日志到存放目录并清空原来日志
cat $logname > ${logpath}/access-$date.log
echo > $logname
#定期删除多余的日志文件(删除30天之前的)
find $logpath -mtime +30 | xargs rm -rf
访问控制
nginx跟apache一样可以通过地址和用户验证实现访问控制
地址限制访问
修改配置文件location块
加入deny和allow项实现
server {
listen 80;
server_name www.aaa.com;
location / {
root /var/www/html/aaa;
index index.html index.php;
deny 192.168.0.100;
allow all;
}
}
以上就是不允许192.168.0.100访问,deny和allow也可以更改顺序实现先后条件交换
用户密码限制访问
跟apache一样的使用工具:htpasswd
#下载工具
yum install -y httpd-tools
#生成用户密码认证文件
htpasswd -c /usr/local/nginx/conf/.nginxpasswd webadmin
#修改.nginxpasswd的权限为400
chmod 400 /usr/local/nginx/conf/.nginxpasswd
修改配置文件,在需要限制的location加入
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/conf/.nginxpasswd;
就可以了
nginx优化管理
隐藏版本号
nginx默认是没有隐藏版本号的,可以通过curl -I 地址的方式查看版本
我们这里可以有两种方式
1.编译安装前
在http里添加server_tokens off;配置项就可以隐藏版本
2.安装后
编译之前修改安装包里src/core目录下的nginx.h文件
注释下面两个参数
#define NGINX_VERSION "1.21.6"
#define NGINX_VER "nginx/" NGINX_VERSION
连接超时和进程优化
1.设置连接超时
为了避免一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间
修改nginx.conf配置文件:
Keepalive_timeout 65 180 ; #默认时间65 超时时间180
2.进程优化
优化nginx进程数量,修改 Nginx 的配置文件的 worker_processes 参数,一般设为 CPU 的个数或者核数,
在高并发的情况下可设置为 CPU 个数或者核数的 2 倍,可以查看 CPU 的核数以确定参数
查看进程:
cat /proc/cpuinfo | grep -c "physical"
默认情况,nginx的多个进程可能更多的跑在一个CPU上
可以分配不同的进程给不同的CPU处理充分利用硬件多核多CPU
在一台 4 核 CPU 服务器上,可以设置每个进程分别由不同的CPU核心处理,达到 CPU 的性能最大化
修改nginx.conf配置文件:
worker_processes 4; #开启进程数
worker_cpu_affinity 0001 0010 0100 1000 #逻辑CPU
注意:1.16版本可以设置自动
work_processes auto;
防盗链
Nginx 的防盗链原理是加入 location 项,用正则表达式过滤图片类型文件,对于信任的 网址可以正常使用,不信任的网址返回相应的错误图片
修改nginx.conf配置文件:
location ~*\.(png|jpg|gif|swf)$ {
valid_referers none blocked *.bbb.com bbb.com;
if ($invalid_referer) {
rewrite ^/http://192.168.0.100/error.jpg;
}
}