日志:348 评论:13
北京, 西城
【Nginx】Nginx学习笔记

准备工作

本地化

如果是新环境,我们需要设置时区以保证时间显示正确

timedatectl set-timezone Asia/Shanghai

安装wget

如果环境里没有wget,通过yum安装一下

yum -y install wget

安装gcc

如果环境里没有编译工具,通过yum安装一下

yum -y install gcc gcc-c++ make

安装依赖包

yum -y install pcre-devel openssl-devel

建立环境根目录

mkdir -p /tongfu.net/env/

建立安装包目录并进入

mkdir /packages
cd /packages

安装Nginx

准备

nginx-1.12.2.tar.gz

下载安装包

wget http://nginx.org/download/nginx-1.12.2.tar.gz

安装nginx

tar xzvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --prefix=/tongfu.net/env/nginx-1.12.2/ \
--with-http_ssl_module
make && make install
cd ..

启动

/tongfu.net/env/nginx-1.12.2/sbin/nginx

测试

[root@tongfunet]# curl 'http://localhost/'
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

映射Apache

通过下面的配置,我们将前面安装好的Apache服务的8080端口通过Nginx的80端口发布出来

在 http {} 内的默认 server {} 前面增加如下配置

[root@tongfunet]# vi /tongfu.net/env/nginx-1.12.2/conf/nginx.conf
    include upstreams.conf;
    include servers.conf;

建立upstreams.conf文件

[root@tongfunet]# cat > /tongfu.net/env/nginx-1.12.2/conf/upstreams.conf <<EOF
upstream apache {
    server 127.0.0.1:8080;
}
EOF

建立servers.conf文件

[root@tongfunet]# cat > /tongfu.net/env/nginx-1.12.2/conf/servers.conf <<EOF
server {
    listen       80;
    server_name  localhost;
    location / {
        proxy_pass              http://apache;
        proxy_set_header Host \$host;
        proxy_set_header X-Real-Ip \$remote_addr;
        proxy_set_header X-Forwarded-For \$remote_addr;
    }
}
EOF

并且需要把默认的 server {} 全部删除掉

重新启动

/tongfu.net/env/nginx-1.12.2/sbin/nginx -s reload

重新测试

可以看到通过Nginx的80端口可以访问到Apache的8080端口上面的网页内容了

我们这里因为没有Apache监听8080端口,所以看到的是502网关错误信息

[root@tongfunet]# curl 'http://localhost/'
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>

自动启动

添加系统服务脚本

[root@tongfunet]# cat > /lib/systemd/system/nginxd.service <<EOF
[Unit]
Description=nginxd
After=network.target

[Service]
Type=forking
ExecStart=/tongfu.net/env/nginx-1.12.2/sbin/nginx
ExecReload=/tongfu.net/env/nginx-1.12.2/sbin/nginx -s reload
ExecStop=/tongfu.net/env/nginx-1.12.2/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

手动停止当前运行着的 nginx 服务,否则自动启动脚本会报错

/tongfu.net/env/nginx-1.12.2/sbin/nginx -s quit

使用 systemctl 管理 nginxd 服务

systemctl enable nginxd # 设置自动启动

systemctl start nginxd # 启动服务

systemctl stop nginxd # 停止服务

systemctl restart nginxd # 重启服务

使用

默认站点设置

设置默认站点可以让计划外的域名的访问失效,具体设置方法如下

server {
    list         80;
    
    # return 404 always
    return       404;
}

这样设置后,当访问的域名没有匹配前面的其他 server 设置的情况下,就会返回404错误页面了

自定义错误页面

默认的nginx错误页面不好看?我们可以自定义设置一下

server {
    list         80;
    
    # set documents root, all files user defined here
    root         /tongfu.net/env/nginx-1.12.2/docs;
    
    # set location
    location / {
        index        index.htm;
    }
    
    # set 404 error page
    error_page   404 /404.htm;
}

简单解释一下:

  • 通过设置 root 指定我们存储自定义页面的网页文件的目录

  • 设置了 location 将所有请求转移进来,默认情况会转移到 index.htm 页面上

  • 设置了 error_page 的 404 情况的处理,我们将 404 情况转移到了 404.htm 页面上

隐藏版本号

我们要隐藏nginx的版本号,以提高安全性,可以这么设置

http {
    ...
    server_tokens off;
    ...
}

攻击防御

很多时候,我们的服务器会被恶意的访问到账系统缓慢,深圳瘫痪

为此,我们要设定一些规则避免这类事情的发生

DDOS攻击

DDOS 的特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量。对于七层的应用攻击,我们还是可以做一些配置来防御的,使用 nginx 的 http_limit_conn 和 http_limit_req 模块通过限制连接数和请求数能相对有效的防御。

ngx_http_limit_conn_module

可以限制单个 IP 的连接数

ngx_http_limit_req_module

可以限制单个 IP 每秒请求数

limit_req_module配置方法

示例配置

limit_conn_zone $binary_remote_addr zone=conn_one:10m;
server {
    location / {
        limit_conn conn_one 1;
    }
}

解释说明

  • limit_conn_zone - 是指我们对连接数量进行限制

  • $binary_remote_addr - 是指我们根据访问IP地址来设置规则

  • zone=conn_one:10m - 是指开辟一个名称为one大小为10m的内存空间来存储统计数据

  • limit_conn - 是指我们要对当前环境进行连接数量限制

  • conn_one - 是我们使用名称为conn_one的连接限制规则

  • 1 - 是指一个IP同时只能有一个连接

limit_conn_module配置方法

示例配置

limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
server {
    location / {
        limit_req zone=req_one burst=5 nodelay;
    }
}

解释说明

  • limit_req_zone - 是指我们对请求数量进行限制

  • $binary_remote_addr - 是指我们根据访问IP地址来设置规则

  • zone=req_one:10m - 是指开辟一个名称为one大小为10m的内存空间来存储统计数据

  • rate=1r/s - 是指规则为一个IP地址一秒内只能有一个请求

  • limit_req - 是指我们要对当前环境进行请求数量限制

  • zone=one - 是指我们使用名称为one的请求限制规则

  • burst=5 - 是指允许超过请求限制规则的连接的最大数量

  • nodelay - 是指要不要在进入burst允许的队列里的请求立即被处理,如果设置了这个,队列里的请求就会立即被处理,这种情况下有可能会瞬间爆掉rate设置闽值哦~~

常规设置规则

一般情况下,我们只要按照下面的规则去设置就可以满足一般情况下了

  • limit_conn - 约等于一个IP(包括局域网,小区宽带情况)最多允许的用户数量

  • limit_req.rate - 单个页面最多资源数量总和(包括JS,CSS,图片等等内容)

  • limit_req.brust - 单个页面最多资源数量总和(包括JS,CSS,图片等等内容),可以略少于这个数字

  • limit.req.nodelay - 还是不要设置的好~~