系统使用的是centos7

Nginx安装及配置

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务

安装

我是用的环境是centos 7,系统默认的yum源没有nginx,找到一个使用nginx官方源地址

首先建立nginx的yum仓库,执行下面的命令

sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

可以看到已经添加上了nginx的源,下面就是下载安装了

下载安装命令也很简单

sudo yum install -y nginx

安装成功^_^

查看官方安装文档(https://www.nginx.com/resources/wiki/start/topics/tutorials/install/)上的源不一样,不过都是一样的建立本地yum仓库

启动nginx服务

service nginx start

默认是80端口,但测试访问发现并不能进入欢迎页面,查了一下,centos默认是关闭80端口的,我们设置一下防火墙

开启80端口

sudo firewall-cmd --zone=public --permanent --add-service=http

开启443端口

sudo firewall-cmd --zone=public --permanent --add-service=https

必须要重新加载一下防火墙配置才行哦,下面我们再来访问一下

完美。

配置

默认的网站目录为: /usr/share/nginx/html

全局的配置文件为:/etc/nginx/nginx.conf

默认的配置文件为: /etc/nginx/conf.d/default.conf

日志文件目录为:/var/log/nginx/

我们查看具体的配置文件内容,发现其实nginx.conf是主要的配置文件,新增的都在/etc/nginx/conf.d/,nginx.conf将整个目录的配置文件都include了

配置结构

Nginx配置文件常见结构的从外到内依次是「http」「server」「location」等等,缺省的继承关系是从外到内,也就是说内层块会自动获取外层块的值作为缺省值。

Http

设定http服务器,利用它的反向代理功能提供负载均衡支持

http {
#文件扩展名与文件类型映射表
include /etc/nginx/mime.types;
#默认文件类型
default_type application/octet-stream;
#日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#
access_log /var/log/nginx/access.log main;
#sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
sendfile on;
#此选项允许或禁止使用socket的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
#tcp_nopush on;
#长连接超时时间,单位是秒
keepalive_timeout 65;
#开启gzip压缩输出
#gzip on;
#导入其他配置
include /etc/nginx/conf.d/*.conf;
}

还有很多参数,具体可以查看https://www.w3cschool.cn/nginx/nginx-d1aw28wa.html

整个配置文件结构其实大概是这样的

http {
#全局的配置
…………
server{
#虚拟主机的配置
…………
location {
#每个请求的处理,如请求转发、静态文件映射、负载均衡等
…………
}
}
}

下面再具体了解一下每一层的配置吧

Server

接收请求的服务器需要将不同的请求按规则转发到不同的后端服务器上,在 nginx 中我们可以通过构建虚拟主机(server)的概念来将这些不同的服务配置隔离。不同的url会对应不同的server配置,而转发到相应的后端服务器上做处理。

server {
listen ; #服务监听端口
server_name localhost; #服务的域名或IP
root html; #指定服务的页面根目录
index index.html index.htm; #指定访问的默认首页地址
}

通常我们可以配置多个server,像这样

server {
listen ;
server_name host1;
root html;
index index.html index.htm;
}
server {
listen ;
server_name host2;
root /data/www/html;
index index.html index.htm;
}

我们可以将不同的服务在/etc/nginx/conf.d/目录下创建相应的conf以区分,方便管理,而nginx.conf会将这个目录下的conf全部引入的。

Location

每个 url 请求都会对应的一个服务,nginx 进行处理转发或者是本地的一个文件路径,或者是其他服务器的一个服务路径。而这个路径的匹配是通过 location 来进行的。我们可以将 server 当做对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置。

location [匹配规则] {
#具体处理配置,如转发、反向代理、负载均衡等
}

location 匹配规则:

~      波浪线表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ ^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
= 进行普通字符精确匹配

匹配例子:

location  = / {
# 只匹配"/".
[ configuration A ]
}
location / {
# 匹配任何请求,因为所有请求都是以"/"开始
# 但是更长字符匹配或者正则表达式匹配会优先匹配
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg结尾的请求.
# 但是所有 /images/ 目录的请求将由 [Configuration C]处理.
[ configuration D ]
} 请求:
/ -> 符合configuration A
/documents/document.html -> 符合configuration B
/images/.gif -> 符合configuration C
/documents/.jpg ->符合 configuration D

功能配置

主要的功能配置都是在location里面的,下面我们来学习不同功能的配置方法

静态文件映射

访问文件的配置主要有 root 和 alias

alias后跟的指定目录是准确的,并且末尾必须加 /。

location /c/ {
alias /a/;
}

如果访问站点http://location/c访问的就是/a/目录下的站点信息。

root后跟的指定目录是上级目录,并且该上级目录下要含有和location后指定名称的同名目录才行。

location /c/ {
root /a/;
}

这时访问站点http://location/c访问的就是/a/c目录下的站点信息。

转发

配置起来很简单比如我要将所有的请求到转移到真正提供服务的一台机器的 8001 端口,只要这样:

location / {
proxy_pass 172.16.1.1:;
}

这样访问host时,就都被转发到 172.16.1.1的8001端口去了。

负载均衡

#负载均衡服务器列表配置在http下面
upstream myserver {
ip_hash;
server 172.16.1.1:;
server 172.16.1.2:;
server 172.16.1.3;
server 172.16.1.4;
}
location / {
proxy_pass http://myserver;
}

我们在 upstream 中指定了一组机器,并将这个组命名为 myserver,这样在 proxypass 中只要将请求转移到 myserver 这个 upstream 中我们就实现了在四台机器的反向代理加负载均衡。

负载均衡的模式

轮询:默认模式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream bakend {
server 192.168.0.14 weight=;
server 192.168.0.15 weight=;
}

ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream bakend {
ip_hash;
server 192.168.0.14:;
server 192.168.0.15:;
}

fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backend {
server server1;
server server2;
fair;
}

url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

#例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream backend {
server squid1:;
server squid2:;
hash $request_uri;
hash_method crc32;
}
负载均衡设备的IP及设备状态

每个设备的状态设置为: 1.down表示单前的server暂时不参与负载 2.weight为weight越大,负载的权重就越大。 3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误 4.fail_timeout:max_fails次失败后,暂停的时间。 5.backup: 其它所有的非back

up机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

upstream bakend{#定义负载均衡设备的Ip及设备状态}{
ip_hash;
server 127.0.0.1: down;
server 127.0.0.1: weight=;
server 127.0.0.1:;
server 127.0.0.1: backup;
}

加固

隐藏服务器版本号

默认我们访问不存在的页面时,报错页面上会有nginx的版本信息,这会向黑客提供信息,以方便查找当前版本的漏洞,加以利用

修改ngixn.conf,http层里面添加server_tokens off;

我们访问不存在的页面试一下

这样没有版本信息了

禁止目录浏览

默认是不允许列出整个目录的,如果不是做下载服务器的,就不要打开这个,避免敏感信息暴露给黑客并下载

如果开启了就会是下面这样的效果

配置关闭即可

autoindex off

限制访问敏感资源

有些资源我们可能不想对外开放,比如一些版本控制的备份文件,如.git/.svn等,这些暴露了可能会将整个项目的结构或是源代码都泄露了,

location /my/ {
deny all;
}

上面我设置了my这个目录下的所有资源都拒绝,效果如下

所以要识别好公开的资源,限制敏感资源的访问

限制HTTP请求方法

关闭没必要的请求方法,一般都是get|post了

下面配置在server里面,预期之外的会返回500状态

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return ;
}

这个要放到最前面

限制IP/域名访问

ngx_http_access_module 模块使有可能对特定IP客户端进行控制. 规则检查按照第一次匹配的顺序

location ~ .*my.html$ {
root /usr/share/nginx/html;
deny 192.168.0.105; #禁止ip
allow 192.168.189.134; #允许ip
deny all; #拒绝其他所有
}

限制访问的ip,即限制了服务的客户,防止不允许的人访问,减少风险

控制超时时间

可以缓解dos攻击,避免黑客伪造用户访问服务,造成服务器压力过大,带宽占满,

备份nginx.conf配置文件。

编辑配置文件,具体设置如下:

client_body_timeout ;  #设置客户端请求主体读取超时时间
client_header_timeout ; #设置客户端请求头读取超时时间
keepalive_timeout ; #第一个参数指定客户端连接保持活动的超时时间,第二个参数是可选的,它指定了消息头保持活动的有效时间
send_timeout10; #指定响应客户端的超时时间

验证一下设置

错误页面重定向

避免错误页面提供敏感信息,一般我们会定制一些通用的错误页面返回给客户端

我们在http段配置

error_page        /50x.html;

类似上面这种配置,将状态码500、502、503、504全部重定向到50x.html

nginx降权

如果发生入侵,获取了当前运行nginx的用户,则拥有该用户的全新了,我们应当使用最下权限运行ngixn,绝对禁止root用户运行!!!

备份nginx.conf配置文件。

  编辑配置文件,添加如下一行内容:

 user nobody;

保存,然后后重启nginx服务。

说明:nobody在linux中是一个不能登陆的帐号,一些服务进程如apache,aquid等都采用一些特殊的帐号来运行,比如nobody,news,games等等,这是就可以防止程序本身有安全问题的时候,不会被黑客获得root权限

加固参考资料

https://isecurity.neusoft.com/book/65.html

https://520mwx.com/view/68078

https://www.cnblogs.com/xiaozi/p/10119062.html

nginx搭建及加固的更多相关文章

  1. nginx搭建http和rtmp协议的流媒体服务器

    nginx搭建http和rtmp协议的流媒体服务器 时间:2013-09-23 23:52来源:佚名 作者:本站 举报 点击:232次 实验目的:让Nginx支持flv和mp4格式文件,同时支持Rtm ...

  2. Nginx搭建flv视频点播服务器

    Nginx搭建flv视频点播服务器 前一段时间使用Nginx搭建的多媒体服务器只能在缓冲过的时间区域内拖放, 而不能拖放到未缓冲的地方. 这就带来了一个问题: 如果视频限速的速率很小, 那么客户端观看 ...

  3. Nginx搭建反向代理服务器

    [大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器   一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受int ...

  4. 关于Symfony2+nginx搭建过程总结

    关于Symfony2+nginx搭建过程总结 最近在试着用nginx+symfony搭建公司的网站,由于nginx不支持pathinfo模式,所以必须修改nginx(我使用的是nginx1.5.1)的 ...

  5. 搭建rtmp直播流服务之1:使用nginx搭建rtmp直播流服务器(nginx-rtmp模块的安装以及rtmp直播流配置)

    欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) 一.方案简要 首先通过对开发方案的仔细研究(实时监控.流媒体.直播流方案的数据源-->协议转换-->服务器--&g ...

  6. Linux+.NetCore+Nginx搭建集群

    本篇和大家分享的是Linux+NetCore+Nginx搭建负载集群,对于netcore2.0发布后,我一直在看官网的文档并学习,关注有哪些新增的东西,我,一个从1.0到2.0的跟随者这里只总结一句话 ...

  7. 基于nginx搭建简易的基于wcf集群的复杂均衡

    很多情况下基于wcf的复杂均衡都首选zookeeper,这样可以拥有更好的控制粒度,但zk对C# 不大友好,实现起来相对来说比较麻烦,实际情况下,如果 你的负载机制粒度很粗糙的话,优先使用nginx就 ...

  8. Nginx 搭建图片服务器

    Nginx 搭建图片服务器 本章内容通过Nginx 和 FTP 搭建图片服务器.在学习本章内容前,请确保您的Linux 系统已经安装了Nginx和Vsftpd. Nginx 安装:http://www ...

  9. Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)

    Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具) 最近因为项目关系,收朋友之托,想制作秀场网站,但是因为之前一直没有涉及到这 ...

随机推荐

  1. ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] - Data truncation: Incorrect datetime value: '' for column 'pubdate' at row 1

    之前的Connector/J版本是:mysql-connector-java-5.0.4-bin.jar 后来换成mysql-connector-java-5.1.45-bin.jar,问题解决 20 ...

  2. strip使用

    strip作用:去掉空格.以及想要去掉的字符,实例如下: In [42]: import subprocess In [42]: output=subprocess.check_output([&qu ...

  3. k8s 删除ns 卡住的解决办法

    在某些情况下,在k8s中会无法删除某个namespace,它会一直卡在terminating状态下.解决这个问题的步骤为: kubectl api-resources --verbs=list --n ...

  4. Nginx实现负载均衡的方式有哪几种呢?

    什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们 ...

  5. python学习之那些你不在乎却操作非主流的练习题(一)

    1.写代码,有如下列表,按照要求实现每⼀个功能 lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt ...

  6. flask 之(六) --- API|RestfulApi

    接口概念 IOP:面向接口编程,不再关注具体的实现:只关注输入.输出. http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practice ...

  7. PJzhang:网络数据单位小比特

    猫宁!!! 参考链接:https://blog.csdn.net/qq_38880380/article/details/79887704 https://www.cnblogs.com/Flycho ...

  8. 【C/C++开发】循环中使用递减计数与递增计数的效率区别

    有两个循环语句: 复制代码代码如下: for(i = n; i > 0; i--)  {  -  }  for(i = 0; i < n; i++)  {  -  }  为什么前者比后者快 ...

  9. mysql --single-transaction 在从库导入完数据以后要在配置文件/etc/my.cnf 中加上read_only=1的参数

    1.在做数据库的主从时,防止在这个过程中,有数据访问进来,要: 要想连super权限用户的写操作也禁止,就使用"flush tables with read lock;",这样设置 ...

  10. PHP7 开启Zend Opcache

    PHP7 开启Zend Opcache 作为PHP这10年来最大的版本与性能升级,PHP7在多次的测试中都表现出很夸张的性能提升,然而,为了让它能发挥出最大的性能,需要手动开启PHP自带的opcach ...