Nginx从入门到实践(三)
动静分离
动静分离是将网站静态资源(JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。
动静分离的一种做法是将静态资源部署在nginx上,后台项目部署到应用服务器上,根据一定规则静态资源的请求全部请求nginx服务器,达到动静分离的目标。
rewrite规则
Rewrite 主要的功能就是实现URL的重写,Nginx的rewrite功能是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
flag:
- last:停止处理当前的 ngx_http_rewrite_module 指令集合,开始搜索能够匹配修改过的 URI 的新的 location
- break:跟 break 指令一样,停止处理当前的 ngx_http_rewrite_module 指令集合
- redirect:返回使用 302 代码的临时重定向,在替换字符串不以“http//”,“https//”或“$scheme”开头时使用
- permanent:返回使用 301 代码的永久重定向
浏览器访问/break
返回的时404, 访问/last
和/test
都是success
访问/break
时会从 root
中查找/test/
文件,访问/last
时会新建一个/test
的请求
高级模块
secure_link模块
http://nginx.org/en/docs/http/ngx_http_secure_link_module.html
ngx_http_secure_link_module
模块能够检查请求链接的权限以及是否过期,多用于下载服务器防盗链
原理
1)加密串与过期时间作为url中的参数
2)nginx服务器接收到了过期时间,也使用过期时间、配置里密钥、文件uri生成加密串
3)计算的加密串与url传递的加密串进行对比
通过将请求中传递的校验和值与为请求计算的值进行比较来验证所请求链接的真实性。如果链接的生命周期有限且时间已过,则该链接将被视为过时。这些检查的状态在$secure_link
变量中可用 。
location / {
secure_link $arg_md5,$arg_expires; #设置两个变量
secure_link_md5 "xxxxxx$remote_addr$arg_expires"; #设置md5,当作口令
if ($secure_link = "") {
# 资源不存在或哈希比对失败
return 403;
}
if ($secure_link = "0") {
# 时间戳过期
return 410;
}
}
$secret = 'xxxxxx'; # 密钥
$path = '/web/nginx-1.4.2.tar.gz'; # 下载文件
# 下载到期时间,time是当前时间,300表示300秒,也就是说从现在到300秒之内文件不过期
$expire = time()+300;
# 用文件路径、密钥、过期时间生成加密串
$md5 = base64_encode(md5($secret . $path . $expire, true));
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
# 加密后的下载地址
echo '<a href=http://s1.down.ttlsa.com/web/nginx-1.4.2.tar.gz?md5='.$md5.'&expires='.$expire.'>nginx-1.4.2</a>';
echo '<br>http://s1.down.ttlsa.com/web/nginx-1.4.2.tar.gz?md5='.$md5.'&expires='.$expire;
打开下载地址,等到5分钟后在下载一次,你会发现点击下载会跳转到410页面
Geoip读取地域信息
http://nginx.org/en/docs/http/ngx_http_geoip_module.html
安装
yum install nginx-module-geoip
安装的文件在/etc/nginx/modules
文件夹下
[root@GYJ modules]# pwd
/etc/nginx/modules
[root@GYJ modules]# ls
ngx_http_geoip_module-debug.so ngx_http_perl_module.so
ngx_http_geoip_module.so ngx_http_xslt_filter_module-debug.so
ngx_http_image_filter_module-debug.so ngx_http_xslt_filter_module.so
ngx_http_image_filter_module.so ngx_stream_geoip_module-debug.so
ngx_http_js_module-debug.so ngx_stream_geoip_module.so
ngx_http_js_module.so ngx_stream_js_module-debug.so
ngx_http_perl_module-debug.so ngx_stream_js_module.so
创建目录geoip
mkdir -p /etc/nginx/geoip/
cd /etc/nginx/geoip/
# 下载IP库信息文件
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
# 解压
gunzip GeoIP.dat.gz
gunzip GeoLiteCity.dat.gz
[root@GYJ geoip]# ls
GeoIP.dat GeoLiteCity.dat
在nginx全局配置中加载模块
[root@GYJ nginx]# cat nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
load_module "modules/ngx_http_geoip_module.so";
load_module "modules/ngx_stream_geoip_module.so";
events {
worker_connections 1024;
}
配置访问接口
[root@GYJ conf.d]# cat HtmlTest.conf
geoip_country /etc/nginx/geoip/GeoIP.dat;
geoip_city /etc/nginx/geoip/GeoLiteCity.dat;
server {
listen 80;
server_name ip; # substitute your machine's IP address or FQDN
sendfile on;
location /ip {
if ($geoip_country_code != CN) {
return 403;
}
}
location /myip {
default_type text/plain;
return 200 "$remote_addr $geoip_country_name $geoip_country_code $geoip_city";
}
}
关闭代理,访问/myip
即可看到自己的IP信息;使用国外代理,访问/ip
会显示403
HTTPS服务
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS就是使用SSL/TLS协议进行加密传输,让客户端拿到服务器的公钥,然后客户端随机生成一个对称加密的秘钥,使用公钥加密,传输给服务端,后续的所有信息都通过该对称秘钥进行加密解密,完成整个HTTPS的流程。
证书签名生成
http://nginx.org/en/docs/http/ngx_http_ssl_module.html
检测是否安装openssl
[root@GYJ conf.d]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
- 生成key密钥
- 生成证书签名请求文件(csr文件)
- 生成证书签名文件(CA文件)
https://www.cnblogs.com/jingxiaoniu/p/6745254.html
cd /etc/nginx
mkdir ssl_key
cd ssl_key
# 创建服务器证书密钥文件 server.key:
openssl genrsa -des3 -out server.key 1024
输入密码,确认密码,自己随便定义,但是要记住,后面会用到。
# 创建服务器证书的申请文件 server.csr
openssl req -new -key server.key -out server.csr
# 输出内容为:
Enter pass phrase for root.key: ← 输入前面创建的密码
Country Name (2 letter code) [AU]:CN ← 国家代号,中国输入CN
State or Province Name (full name) [Some-State]:BeiJing ← 省的全名,拼音
Locality Name (eg, city) []:BeiJing ← 市的全名,拼音
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany Corp. ← 公司英文名
Organizational Unit Name (eg, section) []: ← 可以不输入
Common Name (eg, YOUR name) []: ← 此时不输入
Email Address []:admin@mycompany.com ← 电子邮箱,可随意填
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: ← 可以不输入
An optional company name []: ← 可以不输入
# 备份一份服务器密钥文件
cp server.key server.key.org
# 生成证书文件server.crt
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
配置文件
server
{
listen 443;
server_name ip;
ssl on;
ssl_certificate /etc/nginx/ssl_key/server.crt;
ssl_certificate_key /etc/nginx/ssl_key/server.key;
index index.html index.htm;
location / {
root /opt/app/code;
}
}
重启nginx,浏览器访问,如果返回的是503,查看一下nginx的错误日志
tail -f /var/log/nginx/error.log
2018/12/14 21:03:55 [emerg] 30086#30086: SSL_CTX_use_PrivateKey_file("/etc/nginx/ssl_key/server.key") failed (SSL: error:0906406D:PEM routines:PEM_def_callback:problems getting password error:0906A068:PEM routines:PEM_do_header:bad password read error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)
cd /etc/nginx/ssl_key
# 去除文件口令(重启nginx无需输入密码)
openssl rsa -in server.key.org -out server.key
重新启动即可,这个证书是自己颁发的,浏览器会提示不安全
苹果要求的openssl后台
先检查一下openssl版本
[root@GYJ ssl_key]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
如果版本不满足,可以升级一下版本
#!/bin/sh
cd /opt/download
wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
tar -zxvf openssl-1.0.2k.tar.gz
cd openssl-1.0.2k
./config --prefix=/usr/local/openssl
make && make install
mv /usr/bin/openssl /usr/bin/openssl.OFF
mv /usr/include/openssl /usr/include/openssl.OFF
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
echo "/usr/local/openssl/lib" >>/etc/ld.so.conf
ldconfig -v
openssl version -a
查看签名文件
[root@GYJ ssl_key]# openssl x509 -noout -text -in server.crt
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
f2:da:9a:30:90:5f:4a:1b
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, ST=HeNan, L=NanYang, O=Ice Corp
Validity
Not Before: Dec 14 12:59:08 2018 GMT
Not After : Dec 14 12:59:08 2019 GMT
Subject: C=CN, ST=HeNan, L=NanYang, O=Ice Corp
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (1024 bit)
Modulus:
...
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
...
可以看到,算法是sha256
,公钥是1024 bit
生成满足苹果要求的crt文件
cd /etc/nginx/ssl_key
openssl req -x509 -days 365 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server_apple.crt
重新输入一些公司信息
修改一下配置文件
server
{
listen 443;
server_name ip;
ssl on;
# ssl_certificate /etc/nginx/ssl_key/server.crt;
ssl_certificate /etc/nginx/ssl_key/server_apple.crt;
ssl_certificate_key /etc/nginx/ssl_key/server.key;
index index.html index.htm;
location / {
root /usr/share/nginx/html;
}
}
重新启动服务器即可
HTTPS服务优化
- 激活长连接
keepalive
- 设置ssl session 缓存
Nginx与Lua的开发
实现灰度发布
LuaJIT
wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz
tar -zxvf LuaJIT-2.0.2.tar.gz
cd LuaJIT-2.0.2
make install PREFIX=/usr/local/LuaJIT
/etc/profile 文件中加入环境变量
注意路径
export LUAJIT_LIB=/usr/local/LuaJIT/lib
export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.0
ngx_devel_kit和lua-nginx-module
cd /root/download
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz
分别解压
重新编译Nginx
cd /root/download
wget http://nginx.org/download/nginx-1.15.5.tar.gz
tar -zxvf nginx-1.15.5.tar.gz
cd nginx-1.15.5
[root@GYJ nginx-1.15.5]# ./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-compat \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong \
--param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' \
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' \
--add-module=/root/download/ngx_devel_kit-0.3.0 \
--add-module=/root/download/lua-nginx-module-0.10.9rc7
最后加入lua的模块,注意路径别错了
# 如若出现:
# error: the HTTP gzip module requires the zlib library.
# yum install zlib zlib-devel 一下即可
make -j 4 && make install
加载lua库,加入到ld.so.conf文件
echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.conf
# 然后执行如下命令:
ldconfig
查看一下是否安装成功
简单配置
wget https://github.com/agentzh/lua-resty-memcached/archive/v0.11.tar.gz
tar -zxvf v0.11.tar.gz
cp -r lua-resty-memcached-0.11/lib/resty /usr/local/share/lua/5.1/
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/log/host.access.log main;
location /hello {
default_type 'text/plain';
content_by_lua 'ngx.say("hello, lua")';
}
location /myip {
default_type 'text/plain';
content_by_lua '
clientIP = ngx.req.get_headers()["x_forwarded_for"]
ngx.say("IP:",clientIP)
';
}
location / {
default_type "text/html";
content_by_lua_file /opt/app/lua/dep.lua;
#add_after_body "$http_x_forwarded_for";
}
location @server{
proxy_pass http://127.0.0.1:9090;
}
location @server_test{
proxy_pass http://127.0.0.1:8080;
}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
clientIP = ngx.req.get_headers()["X-Real-IP"]
if clientIP == nil then
clientIP = ngx.req.get_headers()["x_forwarded_for"]
end
if clientIP == nil then
clientIP = ngx.var.remote_addr
end
local memcached = require "resty.memcached"
local memc, err = memcached:new()
if not memc then
ngx.say("failed to instantiate memc: ", err)
return
end
local ok, err = memc:connect("127.0.0.1", 11211)
if not ok then
ngx.say("failed to connect: ", err)
return
end
local res, flags, err = memc:get(clientIP)
ngx.say("value key: ",res,clientIP)
if err then
ngx.say("failed to get clientIP ", err)
return
end
if res == "1" then
ngx.exec("@server_test")
return
end
ngx.exec("@server")
Nginx从入门到实践(三)的更多相关文章
- Nginx从入门到实践(四)
Nginx常见问题和排错经验,实践应用场景中的方法处理Nginx安全,常见的应用层安全隐患,复杂访问控制,Nignx的sql防注入安全策略,Nginx的整体配置,搭建合理Nginx中间件架构配置步骤. ...
- Nginx从入门到实践(一)
结合实践.收集各种场景.常见问题,讲解Nginx中最实用的Webserver场景,提供一套整体的搭建配置方式 Nginx中间件,不局限于业务逻辑,有效独立于后台开发框架(不论后端是Java开发.PHP ...
- Nginx从入门到实践(二)
静态资源web服务 静态资源类型 CDN CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工 ...
- 学习nginx从入门到实践(四) 基础知识之nginx基本配置语法
nginx基本配置语法 1.http相关 展示每次请求的请求头: curl -v http://www.baidu.com 2.nginx日志类型 error.log. access.log log_ ...
- 学习nginx从入门到实践(五) 场景实践之静态资源web服务
一.静态资源web服务 1.1 静态资源 静态资源定义:非服务器动态生成的文件. 1.2 静态资源服务场景-CDN 1.3 文件读取配置 1.3.1 sendfile 配置语法: syntax: se ...
- 《深入理解Nginx》阅读与实践(三):使用upstream和subrequest访问第三方服务
本文是对陶辉<深入理解Nginx>第5章内容的梳理以及实现,代码和注释基本出自此书. 一.upstream:以向nginx服务器的请求转化为向google服务器的搜索请求为例 (一)模块框 ...
- nginx配置入门
谢谢作者的分享精神,原文地址:http://www.nginx.cn/591.html nginx配置入门 之前的nginx配置是对nginx配置文件的具体含义进行讲解,不过对于nginx的新手可能一 ...
- Docker从入门到实践
一般说来 SPA 的项目我们只要启一个静态文件 Server 就可以了,但是针对传统项目就不一样了,一个项目会依赖很多服务端程序.之前我们的开发模式是在一台开发机上部署开发环境,所有人都在这台开发机上 ...
- Nginx快速入门菜鸟笔记
Nginx快速入门-菜鸟笔记 1.编译安装nginx 编译安装nginx 必须先安装pcre库. (1)uname -a 确定环境 Linux localhost.localdomain 2.6. ...
随机推荐
- 利用StackExchange.Redis和Log4Net构建日志队列
简介:本文是一个简单的demo用于展示利用StackExchange.Redis和Log4Net构建日志队列,为高并发日志处理提供一些思路. 0.先下载安装Redis服务,然后再服务列表里启动服务(R ...
- JavaScript小记二则:接上一节:用.net写Textbox控件关于数字的判断的另一则方法
方法二.通过写JS进行判断控制输入的只能为数字,源码如下: <!DOCTYPE html> <html> <body> <h1></h1> ...
- PC打开多个微信
打开记事本 在哪个盘就打开哪个盘 例如我的D盘 输入这一串 D:CD 微信路径start WeChat.exe&WeChat.exe 保存然后改后缀名为.bat 然后运行 运行前要关掉之前开的 ...
- Java开发相关的linux一些基础命令,必须要掌握的
1.查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件. find . -name "*.xml" 递归查找所有的 ...
- PHP信号管理
PHP信号管理 SIGHUP 终止进程 终端线路挂断 SIGINT 终止进程 中断进程 SIGQUIT 建立CORE文件终止进程,并且生成core文件 SIG ...
- 高通平台如何避免误入FFBM模式
前面两篇博客分别介绍了通过fastboot和QFIL工具退出FFBM模式的方法.虽然售后的同学可以这么指导用户做恢复,但步骤多操作也麻烦,且属于事后处理,如果大面积高概率地出现,会严重影响用户体验.这 ...
- @Resource 与 @Service注解的区别
pring中什么时候用@Resource,什么时候用@service当你需要定义某个类为一个bean,则在这个类的类名前一行使用@Service("XXX"),就相当于讲这个类定义 ...
- DVWA 黑客攻防实战(十五) 绕过内容安全策略 Content Security Policy (CSP) Bypass
看到标题,是否有点疑惑 CPS 是什么东东.简单介绍一下就是浏览器的安全策略,如果 标签,或者是服务器中返回 HTTP 头中有 Content-Security-Policy 标签 ,浏览器会根据标签 ...
- mysql 基础sql语句
1.mysqladmin语句: # 查看mysql版本 mysqladmin version # 更改root用户密码 mysqladmin -u root -p原密码 password '新密码 ...
- 标识符and数据类型
一,标识符 1.标识符用来给类,变量,包,方法等起名字的. 2.只能由字符,下滑线,美元符组成:这里的字符有大小写字母,中文字符,数字字符,但是符号只能有两个下划线和美元符. 3.不能由数字开头. 4 ...