nginx常用操作
1、nginx反向代理
修改/etc/nginx/conf.d/default.cont
server {
listen 80;
location / {
proxy_pass https://localhost:5001;
#静态页面代理
#root /var/www/yang;#静态页面目录
#ndex yang.html;#静态页面首页
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
2、配置域名映射
#进入nginx配置文件目录,找到nginx的配置文件nginx.conf
cd /usr/local/nginx/conf/
#直接修改
vi nginx.conf
#listen为监听的端口
listen 80;
#server_name为域名
server_name www.test.com;
#location是访问地址的设置,locahost也可以用服务器ip代替
location / {
proxy_pass http://localhost:8080;
}
只需要修改server_name和location里面的内容即可
#修改完成后,重新加载配置文件
cd /usr/local/nginx/sbin/
./nginx -s reload
进入域名控制台,添加或者修改解析地址,如果原来配置了解析,新解析需要一定时间才能生效
3、隐藏服务器版本和修改上传限制
#编辑nginx.conf,在http连增加一下内容
vim /etc/nginx/nginx.conf
#修改上传限制
client_max_body_size 500m;
#隐藏服务器版本
server_tokens off;
4、配置ssl访问
ssl证书生成
1、在线生成(本地使用,无权威,不被信任,可以局域网使用):https://www.lddgo.net/encrypt/ssl
2、在线生成(免费,具有权威,被信任):https://freessl.cn/
3、阿里云/腾讯云/华为云的厂商购买
4、本地生成(openssl,本地使用,要被信任,需要公网ip)
mkdir /root/cert
cd /root/cert
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey
server.key -out server.crt
ssl:该指令用来在指定的服务器开启HTTPS,可以使用 listen 443 ssl,后 面这种方式更通用些。
语法 | ssl on|off; |
---|---|
默认值 | ssl off; |
位置 | http、server |
ssl_certificate:为当前这个虚拟主机指定一个带有PEM格式证书的证书。
语法 | ssl_certificate filepath; |
---|---|
默认值 | |
位置 | http、server |
ssl_certificate_key:该指令用来指定PEM secret key文件的路径
语法 | ssl_certificate_key filepath; |
---|---|
默认值 | |
位置 | http、server |
ssl_session_cache::该指令用来配置用于SSL会话的缓存
语法 | ssl_sesion_cache off|none|[builtin[:size]]|[shared:name:size]; |
---|---|
默认值 | ssl_sesion_cache none; |
位置 | http、server |
off:禁用会话缓存,客户端不得重复使用会话
none:禁止使用会话缓存,客户端可以重复使用,但是并没有在缓存中存 储会话参数
builtin:内置OpenSSL缓存,仅在一个工作进程中使用。
shared:所有工作进程之间共享缓存,缓存的相关信息用name和size来指定
ssl_session_timeout:开启SSL会话功能后,设置客户端能够反复使 用储存在缓存中的会话参数时间。
语法 | ssl_session_timeout time |
---|---|
默认值 | ssl_session_timeout 5m; |
位置 | http、server |
ssl_ciphers:可以使用openssl ciphers查看openssl支持的格式。
语法 | ssl_ciphers ciphers; |
---|---|
默认值 | ssl_ciphers HIGH:!aNULL:!MD5; |
位置 | http、server |
可以使用openssl ciphers查看openssl支持的格式。
ssl_prefer_server_ciphers:该指令指定是否服务器密码优先客户端密码
语法 | ssl_perfer_server_ciphers on|off |
---|---|
默认值 | ssl_perfer_server_ciphers off |
位置 | http、server |
#使用https,端口自定义,默认为443
listen 443 default ssl;
#www.example.com你的域名
server_name www.example.com;
#ssl证书配置,根据需求选配
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
#配置ssl证书,ssl/www.example.com.pem是ssl证书存放位置,一般放在/etc/nginx/下,如果不识别这个路径,填写全称即可
ssl_certificate ssl/www.example.com.pem;
ssl_certificate_key ssl/www.example.com.key;
5、强制域名和https访问,修改http里面的server(非编译安装在conf.d的default.conf路径下)配置
#禁止ip访问,强制域名访问
if ($host != 'www.example.cn'){
return 403;
}
#禁止http访问,强制https访问
if ($scheme = 'http') {
return 301 https://$server_name$request_uri;
}
5-1、代理php网站,以可道云做例子
server {
listen 80;
server_name localhost;
root /var/www/kodbox/;
index index.html index.htm index.php;
location ~ \.php$ {
root kodbox;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/kodbox$fastcgi_script_name;
include fastcgi_params;
}
}
5-2、反向代理有内置服务器的网站
server {
#使用http
listen 80;
#使用https
listen 443 default ssl;
#www.example.com你的域名
server_name www.example.com;
#ssl证书配置,根据需求选配
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
#配置ssl证书,ssl/www.example.com.pem是ssl证书存放位置,一般放在/etc/nginx/下,如果不识别这个路径,填写全称即可
ssl_certificate ssl/www.example.com.pem;
ssl_certificate_key ssl/www.example.com.key;
location / {
#方向代理的地址
proxy_pass http://localhost:5212;
#后端配置支持HTTP1.1,必须配
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
6、文件服务器
nginx使用的是模块ngx_http_autoindex_module来实现的,该模块处 理以斜杠(“/”)结尾的请求,并生成目录列表。 nginx编译的时候会自动加载该模块,但是该模块默认是关闭的,我们需 要使用下来指令来完成对应的配置
(1)autoindex:启用或禁用目录列表输出
语法 | autoindex on|off; |
---|---|
默认值 | autoindex off; |
位置 | http、server、location; |
(2)autoindex_exact_size:对应HTLM格式,指定是否在目录列表展示 文件的详细大小 默认为on,显示出文件的确切大小,单位是bytes。 改为off后,显示出 文件的大概大小,单位是kB或者MB或者GB
语法 | autoindex_exact_size on |
---|---|
默认值 | autoindex_exact_size on; |
位置 | http、server、location; |
(3)autoindex_format:设置目录列表的格式
语法 | autoindex_format html|xml|json|jsonp; |
---|---|
默认值 | autoindex_format html; |
位置 | http、server、location; |
注意:该指令在1.7.9及以后版本中出现
XML/JSON格式[一般不用这两种方式
(4)autoindex_localtime:对应HTML格式,是否在目录列表上显示时 间。 默认为off,显示的文件时间为GMT时间。 改为on后,显示的文件时间 为文件的服务器时间
语法 | autoindex_localtime on |off |
---|---|
默认值 | autoindex_localtime off; |
位置 | http、server、location; |
# 显示目录
autoindex on;
# 显示文件大小
autoindex_exact_size on;
# 显示文件时间
autoindex_localtime on;
#文件目录,windows下改为类似E:/music即可
root /var/www/music;
server{
listen 80;
listen 443 default ssl;
server_name 172.17.165.100;
#强制使用https访问,按照自己的需求来
if ($scheme = 'http') {
return 301 https://$server_name$request_uri;
}
#https支持,按照自己的需求来
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
#ssl证书
ssl_certificate ssl/cert.pem;
ssl_certificate_key ssl/private.key;
}
或者
server{
listen 80;
listen 443 default ssl;
server_name 172.17.165.100;
#强制使用https访问,按照自己的需求来
if ($scheme = 'http') {
return 301 https://$server_name$request_uri;
}
#https支持,按照自己的需求来
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
#ssl证书
ssl_certificate ssl/cert.pem;
ssl_certificate_key ssl/private.key;
location /download{
# 显示目录
autoindex on;
# 显示文件大小
autoindex_exact_size on;
# 显示文件时间
autoindex_localtime on;
#文件目录,windows下改为类似E:/music即可
root /var/www/music;
}
}
7、防盗链
资源盗链指的是此内容不在自己服务器上,而是通过技术手段,绕过别 人的限制将别人的内容放到自己页面上最终展示给用户。以此来盗取大 网站的空间和流量。简而言之就是用别人的东西成就自己的网站。
效果演示
京东:https://img14.360buyimg.com/n7/jfs/t1/101062/37/2153/254169/5dcbd410E6d10ba22/4ddbd212be225fcd.jpg
百度:https://pics7.baidu.com/feed/cf1b9d16fdfaaf516f7e2011a7cda1e8f11f7a1a.jpeg?token=551979a23a0995e5e5279b8fa1a48b34&s=BD385394D2E963072FD48543030030BB
我们自己准备一个页面,在页面上引入这两个图片查看效果
从上面的效果,可以看出来,下面的图片地址添加了防止盗链的功能, 京东这边我们可以直接使用其图片。
Nginx防盗链的实现原理
了解防盗链的原理之前,我们得先学习一个HTTP的头信息Referer,当浏 览器向web服务器发送请求的时候,一般都会带上Referer,来告诉浏览器 该网页是从哪个页面链接过来的。
后台服务器可以根据获取到的这个Referer信息来判断是否为自己信任的 网站地址,如果是则放行继续访问,如果不是则可以返回403(服务端拒绝访问)的状态信息。
Nginx防盗链的具体实现: valid_referers:nginx会通就过查看referer自动和valid_referers后面的内 容进行匹配,如果匹配到了就将 i n v a l i d r e f e r e r 变量置 0 ,如果没有匹配到,则将 invalid_referer变量置0,如果没有匹 配到,则将 invalidreferer变量置0,如果没有匹配到,则将invalid_referer变量置为1,匹配的过程中不区分大小写。
语法 | valid_referers none|blocked|server_names|string… |
---|---|
默认值 | |
位置 | server、location |
none: 如果Header中的Referer为空,允许访问
**blocked:**在Header中的Referer不为空,但是该值被防火墙或代理进行 伪装过,如不带"http://" 、"https://"等协议头的资源允许访问。
**server_names:**指定具体的域名或者IP
string: 可以支持正则表达式和*的字符串。如果是正则表达式,需要以~ 开头表示,例
location ~*\.(gif|jpg|png|jpeg)$
{
#none blocked不要在一起使用,否则没有效果
#valid_referers none blocked www.baidu.com 192.168.200.222 *.example.com example.* www.example.org ~\.google\.;
valid_referers www.baidu.com 192.168.200.222 *.example.com example.* www.example.org ~\.google\.;
if ($invalid_referer) {
return 403;
}
root /usr/local/nginx/html/;
}
实际运用
记得如此配置以下命令或者修改静态文件目录的权限,否则会包文件权限不足无法打开错误(日志中),页面永远返回403错误
location ~*\.(png|jpg|gif|jpeg|ioc){
valid_referers server_names https://www.example.com;
if ($invalid_referer){
return 404;
}
#一定要指定静态路径,否则验证过关也是404
root /var/www/img/;
}
#有bug
location ~*\.(png|jpg|gif|jpeg|ioc){
valid_referers blocked www.baidu.com 192.168.200.222 *.example.com example.* www.example.org ~\.google\.;
if ($invalid_referer){
return 404;
}
#一定要指定静态路径,否则验证过关也是404
root /var/www/img/;
}
Referer的限制比较粗,比如随意加一个Referer,上面的 方式是无法进行限制的。这个问题需要用到Nginx的第三方模块ngx_http_accesskey_module。
8、多个端口指向一个端口
就是对外暴漏一个端口代理所有需要对外暴漏的端口,使用前缀进行反向代理。
server{
listen 80;
listen 443 default ssl;
server_name 172.17.165.100;
#强制使用https访问,按照自己的需求来
if ($scheme = 'http') {
return 301 https://$server_name$request_uri;
}
#https支持,按照自己的需求来
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
#ssl证书
ssl_certificate ssl/cert.pem;
ssl_certificate_key ssl/private.key;
location /download{
# 显示目录
autoindex on;
# 显示文件大小
autoindex_exact_size on;
# 显示文件时间
autoindex_localtime on;
#文件目录,windows下改为类似E:/music即可
root /var/www/music;
}
#匹配前缀后重写url进行反向代理
location /musicApi {
rewrite ^/musicApi(.*)$ $1 break;
#方向代理的地址
proxy_pass http://localhost:5000;
#后端配置支持HTTP1.1,必须配
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}