Nginx基本应用(一)

简介: Nginx基本应用(一)

nginx配置https访问


什么是https


HTTPS代表超文本传输协议安全。它是用于保护两个系统(例如浏览器和Web服务器)之间的通信的协议。


下图说明了通过http和https进行通信的区别:


640.jpg


如上图所示,http以超文本格式在浏览器和Web服务器之间传输数据,而https以加密格式传输数据。因此,https可防止hacker在浏览器和Web服务器之间传输期间读取和修改数据。即使hacker设法拦截通信,他们也无法使用它,因为消息是加密的。


HTTPS使用安全套接字层(SSL)或传输层安全性(TLS)协议在浏览器和Web服务器之间建立加密链接。TLS是SSL的新版本。


什么是SSL


SSL是用于在两个系统之间建立加密链接的标准安全技术。这些可以是浏览器到服务器,服务器到服务器或客户端到服务器。基本上,SSL确保两个系统之间的数据传输保持加密和私密。


https本质上是http over SSL。SSL使用SSL证书建立加密链接,SSL证书也称为数字证书。


HTTP协议以明文方式发送内容,不提供任何方式的数据加密。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。


HTTP与HTTPS比较


HTTP HTTPS
以超文本(结构化文本)格式传输数据 以加密格式传输数据
默认使用端口80 默认使用端口443
不安全 使用SSL技术保护安全
以 http://开始 以 https://开始


https的优势


  • 安全通信:
    https通过在浏览器和服务器或任何两个系统之间建立加密链接来建立安全连接。
  • 数据完整性:
    https通过加密数据提供数据完整性,因此,即使hacker设法捕获数据,他们也无法读取或修改数据。
  • 隐私和安全:
    https通过防止hacker被动地监听浏览器和服务器之间的通信来保护网站用户的隐私和安全。
  • 更快的性能:
    https通过加密和减小数据的大小来提高数据传输的速度。
  • SEO:
    使用https增加SEO排名。
    在谷歌浏览器中,如果用户的数据是通过http收集的,Google会在浏览器中显示“ 不安全”标签。


使用OpenSSL生成证书


OpenSSL是一种功能强大的商用级全功能工具包,适用于传输层安全性(TLS)和安全套接字层(SSL)协议。它也是一个通用的加密库。


检查nginx ssl模块


nginx配置SSL需要依赖http_ssl_module模块


使用nginx -V查看是否安装


使用OpenSSL生成私钥文件和CA自签证书


/etc/pki/tls/openssl.cnf文件中包含着CA的证书文件


>> cd /etc/pki/CA
>> (umask 077; openssl genrsa 2048 > private/cakey.pem)
>> openssl req -new -x509 -key private/cakey.pem -out cacert.pem
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:bj
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:wanger
Organizational Unit Name (eg, section) []:wanger
Common Name (eg, your name or your server's hostname) []:CA.wanger.com
Email Address []:wanger@admin.com
>> touch serial
>> echo 01 >serial
>> touch index.txt


创建nginx证书申请


>> mkdir /etc/nginx/ssl
>> cd mkdir /etc/nginx/ssl
>> (umask 077; openssl genrsa 1024 > nginx.key)
>> openssl req -new -key nginx.key -out nginx.csr
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:bj
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:wanger
Organizational Unit Name (eg, section) []:wanger
Common Name (eg, your name or your server's hostname) []:www.wanger.com
Email Address []:wanger@admin.com
>> openssl ca -in nginx.csr -out nginx.crt -days 3650


修改nginx配置文件


server {
        listen  443 ssl;
        server_name     localhost;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key     /etc/nginx/ssl/nginx.key;
        ssl_session_cache       shared:SSL:1m;
        ssl_session_timeout     5m;
        ssl_ciphers     HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers       on;
        location / {
                root    html;
                index   index.html;
        }
    }


配置80端口重定向到https


server {
        listen       80;
        server_name  wanger.com;
        rewrite ^(.*) https://$server_name$1 permanent;
}


测试并重载nginx


nginx -t
nginx -s reload


rewrite地址重写模块


该ngx_http_rewrite_module模块用于使用PCRE正则表达式更改请求URI,返回重定向,以及有条件地选择配置。rewrite指令的功能就是,使用nginx提供的全局变量或自己设置的变量,然后结合正则表达式和标志位实现url重写以及重定向。


因此需要检查pcre是否安装


[root@]# rpm -q pcre
pcre-8.32-17.el7.x86_64


break


break语法


语法 break;
默认 -
应用位置 server,location,if


停止处理任何rewrite的相关指令。如果出现在location里面,那么所有后面的rewrite模块指令都不会再执行,也不发起内部重定向,而是直接用新的URI进一步处理请求。


例子


location = /testbreak {
        break;
        return 200 $request_uri;
        }


当uri中包含testbreak时,那么会停止执行后面的rewrite模块的命令,return属于rewrite模块。


if


if语法


语法 if (condition) { … }
默认 -
应用位置 server,location


if中的几种判断条件


  • 当变量的值为空字符串或“ 0”时,变量为false ;在1.0.1版之前,任何以“ 0” 开头的字符串都被视为false值。
  • 使用“ =”和“ !=”运算符比较变量和字符串;
  • 变量使用“ ~”(对于区分大小写的匹配)和“ ~*”(对于不区分大小写的匹配)运算符与正则表达式进行匹配。
    正则表达式可以包含可供以后在$1.. $9变量中重用的捕获。
    也可以使用!取反。
  • 使用“ -f”和“ !-f”运算符检查文件是否存在;
  • 使用“ -d”和“ !-d”运算符检查目录是否存在;
  • 使用“ -e”和“ !-e”运算符检查文件,目录或符号链接是否存在;
  • 使用“ -x”和“ !-x”运算符检查可执行文件。


例子:


if ($request_method = POST ) {
  return 405;
}
if ( !-f $filename ) {
    break;
}


return


停止处理并为客户端返回状态码,没有状态码的URL将被视为一个302状态码。


return语法


语法 return code [text];return code URL;return URL;
默认 -
应用位置 server,location


例子:


# return code [text];
location = /1 {
    return 200 "this is 1";
}
# return code URL;
location = / {
    return 302 http://www.wanger.com;
}
# return URL;
location = / {
    return http://www.wanger.com;
}


rewrite


应用场景


  1. URL访问跳转,支持开发设计。
    页面跳转、兼容性支持(新旧版本更迭)、展示效果(网址精简)等。
  2. SEO优化(Nginx伪静态的支持)
  3. 后台维护、流量转发等。
  4. 安全(动态界面进行伪装)。


rewrite语法


语法 rewrite regex replacement [flag];
默认 -
应用位置 server,location,if


例子:


rewrite ^(.*) http://wanger.com/$1 permanent;


如果()里的正则表达式与请求的URI匹配,那么URI将根据replacement字符串中的指定进行更改,匹配成功将跳转到http://wanger.com/$1 ,$1的值是前面()里的正则匹配到的值,而后面的permanent是永久重定向301的标志,当rewrite 后面没有任何 flag 时就顺序执行


可选flag参数可以是以下之一:


flag标记 说明
last 本条规则匹配完成后继续匹配新的URI规则
break 本条规则匹配完成后不在进行新的URI匹配
redirect 302临时重定向,浏览器会显示跳转后的URL地址,当nginx 服务关闭的时候,将无法定向到特定的网站
permanent 301永久重定向,浏览器会显示跳转后的URL地址,除非客户端清理浏览器缓存


last与break的区别


last 和 break一样 它们都会终止此 location 中其他它rewrite模块指令的执行,last会重新将rewrite后的地址作为一个新的URI在server块中请求,而break会直接请求重写后的地址,并不会再进行新的请求


举个例子:


location ~ ^/break {
                rewrite ^/break /test/ break;
        }
location ~ ^/last {
                rewrite ^/last /test/ last;
        }
location /test/ {
                default_type application/json;
                return 200 '{"status":"success"}';
        }


当我请求127.0.0.1/break时,浏览器返回的是404,因为break不会去请求/test/块,而网站根目录下test目录根本不存在,当我请求127.0.0.1/last时,浏览器返回的是

{“status”:”success”},因为last将地址重写后生成了新的请求,新的请求地址为/test/,然后与/test/块进行匹配,返回200状态码以及{“status”:”success”}


set


用于定义一个变量,变量的值可以包含文本,变量或者是它们的组合形式。


set语法


语法 set $variable value;
默认 -
应用位置 server,location,if


例子


location /wanger {
        #       return 302 http://192.168.0.168/huazai;
                root    html;
                index   index.html;
                set $var1 "client address is ";
                set $var2 $remote_addr;
                return 200 "$var1$var2";
}


效果如下:



curl 127.0.0.1/wanger
client address is 127.0.0.1


rewrite的一些示例


if ($host = "wanger.com"){
    rewrite ^/(.*)$ http://www.wanger.com/$1 permanent;
}
if (!-f $request_filename) {
    rewrite ^/(.*)  http://www.wanger.com/index.html;
}
if (!-e $request_filename) {
             rewrite ^/(.*)$ /index.php?$1 last;
    }


读写分离


环境


这里的服务器地址为虚拟ip,因为我是在我的三台云主机上操作的


    192.168.0.10   nginx前端192.168.0.20   httpd(用于读)192.168.0.30   httpd(用于写)


    什么是WebDAV?


    Web分布式创作和版本控制(WebDAV)是超文本传输协议(HTTP)的扩展,允许客户端执行远程Web内容创作操作。实质上,它使Web服务器可以充当文件服务器,允许作者在Web内容上进行协作。使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。各种服务器都支持

    WebDAV,包括Apache,Microsoft的Internet信息系统,SabreDAV,Nginx,ownCloud和Nextcloud。


    在写服务器上开启WebDAV功能


    vim /etc/httpd/conf/httpd.conf
    <Directory "/var/www/html">
        Dav on
    </Directory>


    重启httpd服务


      systemctl restart httpd


      授予读写服务器网站的访问权限


      为防止网站访问权限不足,需要分别为读写服务器的网站目录授予访问权限


      setfacl -m u:apache:rwx /var/www/html/


      添加读写服务器的首页文件


      [root@192.168.0.20]# echo 192.168.0.20 > /var/www/html/index.html
      [root@192.168.0.30]# echo 192.168.0.30 > /var/www/html/index.html


      进行上传文件测试


      分别往读写服务器上上传文件,写服务器成功上传,由于读服务器没有开启WebDAV功能,所以读服务器报405错误。


      curl -T zz.txt http://192.168.0.20 (读服务器)
      curl -T zz.txt http://192.168.0.30 (写服务器)


      640.png


      在写服务器的网站根目录也可以看到上传的文件


      640.png


      在nginx前端配置读写分离


      编辑nginx配置文件


      location /wanger {
                  root   html;
                  index  index.html index.htm;
                  proxy_pass  http://192.168.0.20/;
                  if ($request_method = "PUT"){
                            proxy_pass  http://192.168.0.30;
                  }
              }


      重载nginx


      nginx -s reload


      进行访问测试


      [root@192.168.0.10 ~]# curl 127.0.0.1/
      192.168.0.20
      [root@192.168.0.10 ~]# curl -T sh.txt 127.0.0.1/


      640.png


      可以看到写服务器已经存在我们刚上传的文件了,读写分离测试完成


      防盗链


      什么是盗链


      盗链指的是通过一些技术手段来获取他人服务器上的资源来展示在自己的网站上,而在自己的服务器并没有存储这个资源,通过盗链,使他人的的网站服务器压力负担变大。通过借助nginx的ngx_http_referer_module模块的valid_referers指令可以防止盗链,但是referer是可以伪造的,因此也只能防住一部分的盗链。


      valid_referers语法


      语法 valid_referers none丨 blocked丨 server_names 丨 string …;
      默认 -
      应用位置 server,location


      参数说明


      • none:
        referer字段为空
      • blocked:
        Referer的值被防火墙或者代理服务器删除或伪装
      • server_names:
        一个或多个服务器列表,检测Referer的值是否是列表中的某个
      • $invalid_referer:内置变量,如果来源域名不在这个列表中,那么$invalid_referer变量的值为0,否则为1


      盗链演示


      首先准备两台服务器,地址分别为172.17.51.80,172.17.51.90,其中172.17.51.80为被盗链服务器,我们首先配置一下172.17.51.80的图片地址,将图片放入网站根目录


      640.png


      然后配置172.17.51.90服务器进行盗链HTML的配置,在网站根目录下编辑index.html,并添加172.17.51.80的图片链接


      html代码如下:


      <a href="www.baidu.com"><img src="http://172.17.51.80/a.jpg" /></a>


      然后访问172.17.51.90查看盗链效果,盗链成功,这里我使用的是我的两台云主机


      640.jpg


      防盗链演示


      修改172.17.51.80配置,对referer头进行过滤


      location ~ .*\.(jpg|gif|png)$ {
          valid_referers none blocked .*wanger.com;
          if ($invalid_referer) {
              #rewrite ^/ http://$host/403.png;
              return 403;
          }
      }


      修改完成后重载nginx,并清除浏览器缓存,再次访问可以看到图片挂了


      640.png


      相关文章
      |
      1月前
      |
      Kubernetes 应用服务中间件 nginx
      百度搜索:蓝易云【使用Kubernetes部署Nginx应用教程】
      现在,你已经成功在Kubernetes集群上部署了Nginx应用。通过访问Service的外部IP地址,你可以访问Nginx服务。
      52 4
      |
      1月前
      |
      安全 应用服务中间件 nginx
      百度搜索:蓝易云【使用Debian、Docker和Nginx部署Web应用教程】
      这些是在Debian上使用Docker和Nginx部署Web应用的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
      51 0
      |
      6天前
      |
      Java Serverless 应用服务中间件
      Serverless 应用引擎产品使用合集之Web函数启动的Spring Boot项目可以通过什么方式配置Nginx
      阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
      |
      19天前
      |
      应用服务中间件 nginx
      蓝易云 - 编写Dockerfile制作Web应用系统nginx镜像
      这是一个基本的例子,你可能需要根据自己的应用进行调整。例如,你可能需要添加更多的配置,或者使用不同的Nginx版本。
      36 2
      |
      24天前
      |
      Java 关系型数据库 Docker
      docker打包部署spring boot应用(mysql+jar+Nginx)
      docker打包部署spring boot应用(mysql+jar+Nginx)
      |
      1月前
      |
      运维 Serverless 应用服务中间件
      Serverless 应用引擎产品使用之在阿里云Serverless中函数计算FC nginx 部署上去之后放置静态页面如何解决
      阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
      290 0
      |
      1月前
      |
      Java 应用服务中间件 网络安全
      Nginx配置静态页面+springboot应用+swagger+SSL的实现
      Nginx配置静态页面+springboot应用+swagger+SSL的实现
      |
      1月前
      |
      负载均衡 应用服务中间件 nginx
      Nginx四层负载均衡在秒杀系统中的应用
      Nginx四层负载均衡在秒杀系统中的应用
      34 0
      |
      1月前
      |
      负载均衡 应用服务中间件 nginx
      Nginx负载均衡选择在秒杀系统中的应用
      Nginx负载均衡选择在秒杀系统中的应用
      52 0
      |
      1月前
      |
      NoSQL 关系型数据库 应用服务中间件
      redis,memcached,nginx网络组件,网络编程——reactor的应用
      目标 明白网络模块要处理那些事情 reactor 是怎么处理这些事情的 reactor 如何封装的 网络模块与业务逻辑的关系 如何优化 reactor 网络编程关注的问题
      57 1