通过隧道连接内网的PostgreSQL以及跨域与部署方案
2016-07-27 21:13
465 查看
连接与跳转
隧道
原理
postgresql指令
postgresql修改数据库存放目录
项目跨域
Ajax跨域
部署
拓展
一般公司都会在集群(eg.Hadoop/Spark集群)上分配许多节点IP,在外网的基础上做的局域网由许多内网(局域网)IP构成。内网相对于互联网世界而言,是虚设的,在公共网络中找不到。鉴于此,为了保护重要数据,会在外网设置一个集群登录入口节点,只具备登录权限,用来跳转到其他节点IP以实现多路复用。
②可在XShell中,进行
③紧接着,在本机localhost中找一个没有被占用的端口(eg.3280),源:localhost:3280 –映射–> 局域网IP:5432;
但往往这种做法是不被采用的,因为它可能会泄露客户的私密数据。
(注:没有在登录节点映射的话是不能外网登录的,建议数据库不要开外网端口)
想要连接这台在客户那里的局域网服务器,可以用我们前面建立的隧道,而不必在客户外网开辟端口映射。
项目的配置文件:
Navicat的连接
①下载
②新建连接;
③在常规里面填写如下信息:
主机名或IP:localhost
端口:3280
初始数据库:postgres(默认创建)or具体的数据库名称
用户名:客户提供的账户名
密码:客户提供的密码
没有设置环境变量,也可通过这条指令进入数据库:
②进入/opt/PostgreSQL/9.4/data中,可以看到,有许多文件和文件夹。
base pg_clog pg_hba.conf pg_log pg_multixact pg_replslot pg_snapshots pg_stat_tmp pg_tblspc PG_VERSION postgresql.auto.conf postmaster.opts
global pg_dynshmem pg_ident.conf pg_logical pg_notify pg_serial pg_stat pg_subtrans pg_twophase pg_xlog postgresql.conf
③把所有文件拷贝到新指向的路径
④重启生效。
所以我们可以在tomcat中配置跨域的信息,以让局域网中的小伙伴们访问后台项目。
在….apache-tomcat-8.0.35\wtpwebapps\ROOT目录底下,放入clientaccesspolicy.xml和crossdomain.xml;
Jersey框架提供Web Service的API,作为控制层,吐出JSON供前台(网页、APP等)使用。
方法二:
在web.xml中配置过滤器,该过滤器使用现成的过滤方案(cors-filter-1.7.jar、java-property-utils-1.9.jar)
②在B2上装Tomcat,端口号为8080,要把端口映射到外网A,才能供外网的访客访问。即A:任意一个没被占用端口->B2:8080
③因为B1和B2是属于同一个网段(内网),所以B2的项目可以直接访问内网的B1数据。
④在部署项目之前,只需要改数据库配置文件的ip和端口为:
⑤用ftp传文件,发现tomcat目录并没有权限访问,这时候可以先传到外网的目录。然后通过外网登录节点,进入到指定文件夹。
然后再进入B2查看,即可看到新上传的项目。
可参看:
http://www.zhihu.com/question/20010554
http://blog.csdn.net/james_wade63/article/details/50772041
作者: @nanphonfy
Email:
隧道
原理
postgresql指令
postgresql修改数据库存放目录
项目跨域
Ajax跨域
部署
拓展
一般公司都会在集群(eg.Hadoop/Spark集群)上分配许多节点IP,在外网的基础上做的局域网由许多内网(局域网)IP构成。内网相对于互联网世界而言,是虚设的,在公共网络中找不到。鉴于此,为了保护重要数据,会在外网设置一个集群登录入口节点,只具备登录权限,用来跳转到其他节点IP以实现多路复用。
连接与跳转
ssh 账户@外网ip->通过外网进入登录节点
password...
ssh 内网ipor
ssh 账户@内网ip->通过ssh,选择跳转到哪个虚拟机
su root->进入虚拟机后,切换root用户以便切换到仅对数据库有权限的账户dbuser
su dbuser->切换成dbuser,进行数据库操作
隧道
①为了给后台项目和Navicat等数据库工具提供通道连接到客户提供的数据库服务器(在局域网中,只能通过外网找到),需要用隧道做一个映射;②可在XShell中,进行
查看-
隧道窗格-
添加转移规则;
③紧接着,在本机localhost中找一个没有被占用的端口(eg.3280),源:localhost:3280 –映射–> 局域网IP:5432;
原理
比如客户提供给我们一台postgresql数据库服务器,这款软件的默认端口是5432,但是在局域网中它仅是被分配出来的虚拟机,如果需要通过其他网络连接进来,需要在客户的外网开辟一个端口(不一定为5432)来映射局域网中的这台postgresql数据库。但往往这种做法是不被采用的,因为它可能会泄露客户的私密数据。
(注:没有在登录节点映射的话是不能外网登录的,建议数据库不要开外网端口)
想要连接这台在客户那里的局域网服务器,可以用我们前面建立的隧道,而不必在客户外网开辟端口映射。
项目的配置文件:
<property name="connection.url">jdbc:postgresql://localhost:3280/数据库名(客户提供的内网数据库名称)</property> <property name="connection.driver_class">org.postgresql.Driver</property> <property name="connection.username">客户提供的账户名</property> <property name="connection.password">客户提供的密码</property> <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
Navicat的连接
①下载
Navicat for PostgreSQL;
②新建连接;
③在常规里面填写如下信息:
主机名或IP:localhost
端口:3280
初始数据库:postgres(默认创建)or具体的数据库名称
用户名:客户提供的账户名
密码:客户提供的密码
postgresql指令
service postgresql-9.4 restart-> 重启postgresql指令,但service命令都是要root权限,所以一般很少会这么重启;
export PGHOME=/opt/PostgreSQL/9.4 export PATH=$PGHOME/bin:$PATH export PGDATA=$PGHOME/data export LD_LIBRARY_PATH=$PGHOME/lib #export完环境变量之后,才能使用下面的命令 pg_ctl stop pg_ctl start psql #进入postgresql的命令
没有设置环境变量,也可通过这条指令进入数据库:
bin/psql -U postgres
postgresql修改数据库存放目录
①进入/opt/PostgreSQL/9.4/data/postgresql.conf,修改postgresql.conf配置文件中数据库存放的目录:data_directory = '/data/pg_data';
②进入/opt/PostgreSQL/9.4/data中,可以看到,有许多文件和文件夹。
base pg_clog pg_hba.conf pg_log pg_multixact pg_replslot pg_snapshots pg_stat_tmp pg_tblspc PG_VERSION postgresql.auto.conf postmaster.opts
global pg_dynshmem pg_ident.conf pg_logical pg_notify pg_serial pg_stat pg_subtrans pg_twophase pg_xlog postgresql.conf
③把所有文件拷贝到新指向的路径
cp -r 文件1,文件2,文件3... /data/pg_data;
④重启生效。
项目跨域
公司的局域网中,前后端开发隔离,在开发测试阶段可以选择本机开启项目跨域,供局域网的其他主机,即前端开发人员进行API接口的调用。所以我们可以在tomcat中配置跨域的信息,以让局域网中的小伙伴们访问后台项目。
在….apache-tomcat-8.0.35\wtpwebapps\ROOT目录底下,放入clientaccesspolicy.xml和crossdomain.xml;
【clientaccesspolicy.xml】 <?xml version="1.0" encoding="utf-8" ?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="*"> <domain uri="*"/> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy> 【crossdomain.xml】 <?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*" /> </cross-domain-policy>
Ajax跨域
方法一:Jersey框架提供Web Service的API,作为控制层,吐出JSON供前台(网页、APP等)使用。
@GET @Path("year_month") @Produces(MediaType.TEXT_PLAIN)//输出"text/plain"的介质类型 public Response getInfo() { ... return Response.ok(JSONArray.toString()) .header("Access-Control-Allow-Origin", "*").build();//把JSON格式的对象或数组转换为字符串,然后建立响应给前台的一个报文头,表示允许任意IP访问服务端内容。 }
方法二:
在web.xml中配置过滤器,该过滤器使用现成的过滤方案(cors-filter-1.7.jar、java-property-utils-1.9.jar)
<!-- 服务器端解决跨域问题(ajax跨域),该方法与具体的框架实现无关 (需要两个jar包:cors-filter-1.7.jar、java-property-utils-1.9.jar) --> <filter> <filter-name>CORS</filter-name> <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class> <init-param> <!--配置授信的白名单域名 --> <param-name>cors.allowOrigin</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>cors.supportedMethods</param-name> <param-value>GET,POST,HEAD,PUT,DELETE</param-value> </init-param> <init-param> <param-name>cors.supportedHeaders</param-name> <param-value>Accept,Origin,X-Requested-With,Content-Type,Last-Modified</param-value> </init-param> <init-param> <param-name>cors.exposedHeaders</param-name> <param-value>Set-Cookie</param-value> </init-param> <init-param> <param-name>cors.supportsCredentials</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CORS</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
部署
①假如外网机器IP为A,数据库服务器为B1,Web服务器为B2;②在B2上装Tomcat,端口号为8080,要把端口映射到外网A,才能供外网的访客访问。即A:任意一个没被占用端口->B2:8080
③因为B1和B2是属于同一个网段(内网),所以B2的项目可以直接访问内网的B1数据。
④在部署项目之前,只需要改数据库配置文件的ip和端口为:
A:端口即可.
⑤用ftp传文件,发现tomcat目录并没有权限访问,这时候可以先传到外网的目录。然后通过外网登录节点,进入到指定文件夹。
scp 项目war包 用户名@IP:Tomcat路径/webapps
然后再进入B2查看,即可看到新上传的项目。
拓展
“腾讯内部数据存储主要是MYSQL,但是数据分析主要是HADOOP+PGSQL”,由此可见postgresql对数据分析的项目至关重要,它处理百万级千万级的数据量是游刃有余的,本身的功能也很强大。可参看:
http://www.zhihu.com/question/20010554
http://blog.csdn.net/james_wade63/article/details/50772041
作者: @nanphonfy
Email:
nanphonfy (Nfzone) gmail.com 请将(Nfzone)换成@
相关文章推荐
- oracle的rownum原理和使用
- redis持久化那些事(kēng)儿
- Mysql 体系结构
- MySQL数据库(9)----从命令行获取元数据
- 各种数据库的数据类型
- PostgreSql 获取所有的表、视图、字段、 主键
- 82.You are managing an Oracle Database 11g database with the following backup strategy: 1) On Sunday
- jdbc数据库操作
- 【Mongodb】morphia与spring结合使用详解
- Oracle 基本知识 内含 SQLplus命令,Oracle常用用户
- 数据库事务隔离级别
- 完整java开发中JDBC连接数据库代码和步骤
- mysql数据库基础知识
- mysql 主从配置详解
- 理解Mysql的索引与优化
- oracle for循环查找结果
- oracle的SQL语言
- redis开启远程访问
- Mysql date的大于某一个时间点
- SQLiteOpenHelper类的onCreate方法什么时候被执行--只有database.db不存在的时候