什么是nginx?
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的一款应用。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
如果你不明白上边在说什么的话也没关系,你可以把它当成一个工具软件,接下来我会告诉你它可以做什么以及怎么使用。
安装
既然是个工具,那么使用时就需要下载。你可以通过下面的链接进行下载。下载到本地后可以通过修改conf目录下的nginx.conf文件对nginx进行配置。
如果你想详细了解nginx的使用命令可以点击这里,如果你想快速开始使用可以跳过。
nginx快速使用
启动: win+r 输入cmd 回车,cd到nginx的根目录,输入命令nginx
停止: 按启动步骤打开新窗口,输入命令nginx -s stop 或者打开任务管理器在任务中直接结束nginx的进程。
注意每次修改nginx.conf配置后都需要重启nginx。
前端代理
在前端开发中做接口调试的时候常常会遇到跨域问题。解决这个问题,在一些比较老或前端依赖比较少的项目中你可能会使用像tomcat这样的web容器,这种情况前后端不会分离,本地要调试前端代码一般需要在本地起后台服务,比较麻烦。随着node.js的出现和前后端分离开发模式的流行,我们现在出现了webpack,gulp等一系列前端的工程化工具,可以帮助我们解决跨域问题。但是如果你想快速做一个只有几个页面的简单项目,你完全没必要花时间去学习那些复杂工程化工具的配置,因为nginx可以很好的帮你解决跨域问题。
实现这个功能其实是利用了nginx的虚拟主机和正向代理,不过你没必要知道这些概念,看下配置代码:
http {
upstream localhost-nodes {
server 10.124.96.53:8084; #对应后端服务地址
}
server {
listen 8088; #访问端口
server_name localhost #nginx服务访问入口 ,本地开发可设为 localhost
error_log logs/error.log; #错误日志文件,存放安装目录下,可查看请求错误信息
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 logs/access.log main; #日志文件的路径及使用的何种日志格式记录日志
location / {
proxy_pass http://localhost-nodes; #localhost-nodes为自定义代理项目名称,nginx支持设置多组负载均衡和转发服务,unstream通过这个名字区分
client_max_body_size 100m; #设置附件上传大小限制,nginx默认限制是1m
}
location /frontEndPro { # hash匹配名,默认设项目的目录名
root E:\workspace\myserver\static; #本地静态资源存放目录
}
}
}
负载均衡
负载均衡是nginx现在被使用最多的功能,主要是通过对请求的分发处理,减轻对后端服务器的压力,同时也可以提高响应速度。
http {
upstream myproject {
server 127.0.0.1:8000 weight=3; #配置多台服务器地址,通过weight设置访问权重
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80; # 访问端口
server_name www.domain.com; #nginx服务访问入口, 线上时为域名,如果本地开发调试可以设为 localhost
location / {
proxy_pass http://myproject; #自定义代理项目名称,nginx支持设置多组负载均衡和转发服务,unstream通过这个名字区分
}
}
}
防盗链
如果自己网站内的一些资源只想被内部或者合作方的网站使用也可以通过nignx配置防盗链来实现。防盗链可以通过http referer判断访问来源,对图片、视频、文档等敏感资源的访问权限进行限制。使用防盗链可以减少宽带浪费和服务器压力,对于按流量收费的网站也可以节约成本。值得注意的是referer可以被伪造,如果要提高安全性可以结合http_accesskey_module模块。
location ~* \.(gif|jpg|png|swf|flv)$ { #如果访问资源为gif/jpg/png/swf/flv进行限制
valid_referers none blocked http://192.168.223.156/*; #定义白名单
if ($invalid_referer) { #invalid_referer是内置变量,通过判断上一行中的valid_referers值会返回0或者1
rewrite ^/www.nginx.cn #如果访问来源不在白名单内,则进行重定向
#return 404; #也可以直接返回404,通知资源不存在
}
}
反向代理
如果你想在自己项目中嵌入其他项目或者将访问资源定向到其他服务器,nginx也可以帮你实现,没错,nginx反向代理就是这么黑科技。
server {
listen 8080;
#访问 8080/wy163/xx 时将请求代理到163网站
location /wy163 { #定义反向代理路由规则
proxy_pass https://163.com; #目标网址
proxy_redirect off;
# 为请求重新设置请求头
# 设置被代理端接收到的远程客户端IP,如果不设置,则header信息中并不会透传远程真实客户端的IP地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 访问 8080:/readme.md 从github上获取相应的文件,减少本地服务器压力,为本地服务器节省存储空间
location /readme.md {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://github.com/yidao620c/scrapy-cookbook/blob/master/README.md;
}
}
正向代理和反向代理的区别?
一句话:正向代理代理客户端,反向代理代理服务器。