介绍
介绍
在linux操作系统下面,可能会有非常多的web服务器,运行PHP程序的apache,运行java程序的tomcat。除此之外还有很多成品B/S架构的软件,如:监控软件zabbix,图标软件grafana,持续集成工具jekins,代码管理工具gitlab等等。
这些web服务器和软件工具通常情况下都会使用自己的端口发布出来,很多还会直接使用80端口提供服务,但是一台服务器只有一个80端口,怎么办呢?
这时候就需要使用高性能的HTTP反向代理软件Nginx来整合这一堆服务端口了,使用Nginx可以将不同端口上面的服务转发到一个新端口下面,还可以将这些服务转发到一个新端口的子目录下面。我们的TFLinux刚好可以将那些端口上面的项目转发到统一的80端口下面的子目录里面。
基本信息
安装环境
CentOS:CentOS Linux release 7.6.1810 (Core)
Linux:Linux version 3.10.0-1062.el7.x86_64
GCC:gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
软件版本
nginx-1.16.1.tar.gz
验证时间
2020/01/07
准备工作
本地化
如果是新环境,我们需要设置时区以保证时间显示正确
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.16.1.tar.gz
下载安装包
wget http://nginx.org/download/nginx-1.16.1.tar.gz
安装nginx
tar xzvf nginx-1.16.1.tar.gz cd nginx-1.16.1 ./configure --prefix=/tongfu.net/env/nginx-1.16.1/ \ --with-http_ssl_module make && make install cd ..
启动
/tongfu.net/env/nginx-1.16.1/sbin/nginx
测试
curl测试
[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 {} 设置
在 http {} 内增加如下配置
[root@tongfunet]# vi /tongfu.net/env/nginx-1.16.1/conf/nginx.conf include upstreams.conf; include servers.conf;
建立upstreams.conf文件
[root@tongfunet]# cat > /tongfu.net/env/nginx-1.16.1/conf/upstreams.conf <<EOF upstream apache { server 127.0.0.1:8080; } EOF
建立servers.conf文件
[root@tongfunet]# cat > /tongfu.net/env/nginx-1.16.1/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.16.1/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> <center><h1>502 Bad Gateway</h1></center> <hr><center>nginx/1.16.1</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.16.1/sbin/nginx ExecReload=/tongfu.net/env/nginx-1.16.1/sbin/nginx -s reload ExecStop=/tongfu.net/env/nginx-1.16.1/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target EOF
手动停止当前运行着的 nginx 服务,否则自动启动脚本会报错
/tongfu.net/env/nginx-1.16.1/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.16.1/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 - 还是不要设置的好~~