elasticsearch+Nginx+django+cas+mysql平台搭建

elasticsearch+Nginx+django+cas+mysql平台搭建

 

系统结构功能图:

elasticsearch+Nginx+django+cas+mysql平台搭建

系统简介:

1.django项目放到了nginx容器中,采用的是nginx+uwsgi的方案。django访问端口5050。

nginx listen 8000端口,访问8000端口会转到5050 端口

2.nginx反向代理elasticsearch,elasticsearch的访问端口为9200,采用nginx反向代理之后,当django中需要从elasticsearch中查询数据的时候只需要访问nginx的8081端口,为了保护elasticsearch的安全性在nginx中设置了访问规则。

3.cas服务器部署到tomcat中,cas的用户名密码存储在mysql数据库中。

对于用户而言只可以通过8000端口访问整个系统(投入使用之后只需要将8000改为80即可,其他地方都不用做更改)

详细内容请看下面在搭建系统过程中的介绍。

cas服务器搭建:

一、创建秘钥

1.新建存放key的目录mkdir -p/usr/local/keys

2.利用jdk自带的keytool生成秘钥库:

keytool -genkey -alias tomcat -keypasschangeit -keyalg RSA -keystore /usr/local/keys/server.keystore

注:tomcat为别名 server .keystore 为生成的秘钥文件 changeit 为密码,为了方便所有的密码都设置为changeit,在生成秘钥库的时候第一项写访问的域名例如www.jiuge.lol其余的随便写

3.导出证书:

keytool -export  -alias tomcat -keypass changeit -file/usr/local/keys/server.crt  -keystore/usr/local/keys/tomcat.keystore

导出的时候输入之前的密码:changeit

elasticsearch+Nginx+django+cas+mysql平台搭建

4.将数字证书导入jre中

  在导入之前可以把已有的证书删除:

keytool -delete -alias tomcat(随便起的别名) -keystore

/usr/local/jdk1.8/jre/lib/security/cacerts -storepass changeit

然后在进行导入操作:

keytool -import -alias tomcat -file/usr/local/keys/server.crt -keypass changeit -keystore /usr/local/jdk1.8/jre/lib/security/cacerts

注:这里的jre地址一定要和tomcat使用的jre地址一致。

输入密码(注:这里的输入的密码不是上面设置的密码是固定的密码changeit,为了不弄混,在之前设置的密码和这个设置相同就可以了)

5.查看证书是否导入成功:

keytool -list -keystore /usr/local/jdk1.8/jre/lib/security/cacerts

elasticsearch+Nginx+django+cas+mysql平台搭建

输入changeit密码可以看到证书成功导入了

elasticsearch+Nginx+django+cas+mysql平台搭建

二、配置https

 修改tomcat中的server.xml,添加如下内容

elasticsearch+Nginx+django+cas+mysql平台搭建

此时开启tomcat访问:

elasticsearch+Nginx+django+cas+mysql平台搭建

说明https配置生效:

三、搭建cas服务器以及客户端测试

1.部署cas

下载cas(网址:http://www.jasig.org/cas

elasticsearch+Nginx+django+cas+mysql平台搭建

解压之后在models文件夹下面有一个cas-server-webapp-3.5.0.war,将其改名为cas.war 放到webapps目录下作为单点登录服务器:

此时访问

elasticsearch+Nginx+django+cas+mysql平台搭建

输入用户名密码(相同字符串就行)注:4.0版本以上cas的默认帐号密码为casuser/Mellon

elasticsearch+Nginx+django+cas+mysql平台搭建

出现此界面则说明cas服务器搭建成功

2、对cas客户端进行部署测试

下载cas-client-core-3.2.1.jar,commons-logging-1.1.jar并将其拷贝到测试目录examples中的lib下面

elasticsearch+Nginx+django+cas+mysql平台搭建

此时若在同一台机器上做测试可以安装两个tomcat,其中tomcat-app作为客户端

elasticsearch+Nginx+django+cas+mysql平台搭建

对于一台机器安装两个tomcat的方法是:

修改环境变量/etc/profile

elasticsearch+Nginx+django+cas+mysql平台搭建

然后source立即生效

然后在修改tomcat启动文件catalina.sh

elasticsearch+Nginx+django+cas+mysql平台搭建

将所有的CATALINA_HOME更改为CATALINA_HOME2

(%s/CATALINA_HOME/CATALINA_HOME2/g)

 最后只修改server.xml将那些端口改为没有占用的即可(这里修改成7070)

elasticsearch+Nginx+django+cas+mysql平台搭建

接下来就要进行客户端的配置:

这里用的是tomcat自带的examples目录做测试

修改其web.xml:

elasticsearch+Nginx+django+cas+mysql平台搭建

 添加:

 

<!--======================== 单点登录开始 ======================== -->

<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->

 

 

<filter>

         <filter-name>CASFilter</filter-name>

         <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>

         <init-param>

                   <param-name>casServerLoginUrl</param-name>

                   <param-value>https://www.jiuge.lol:9443/cas/login</param-value>

         </init-param>

         <init-param>

                   <param-name>serverName</param-name>

                   <param-value>http://www.jiuge.lol:7070</param-value>

         </init-param>

</filter>

<filter-mapping>

         <filter-name>CASFilter</filter-name>

         <url-pattern>/*</url-pattern>

</filter-mapping>

<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->

<filter>

         <filter-name>CAS ValidationFilter</filter-name>

         <filter-class>

                   org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>

         <init-param>

                   <param-name>casServerUrlPrefix</param-name>

                   <param-value>https://www.jiuge.lol:9443/cas</param-value>

         </init-param>

         <init-param>

                   <param-name>serverName</param-name>

                   <param-value>http://www.jiuge.lol:7070</param-value>

         </init-param>

</filter>

<filter-mapping>

         <filter-name>CAS ValidationFilter</filter-name>

         <url-pattern>/*</url-pattern>

</filter-mapping>

 

<!--

         该过滤器负责实现HttpServletRequest请求的包裹,

         比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。

-->

<filter>

         <filter-name>CASHttpServletRequest Wrapper Filter</filter-name>

         <filter-class>

                   org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>

</filter>

<filter-mapping>

         <filter-name>CASHttpServletRequest Wrapper Filter</filter-name>

         <url-pattern>/*</url-pattern>

</filter-mapping>

 

 <!--

该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。

比如AssertionHolder.getAssertion().getPrincipal().getName()。

-->

<filter>

         <filter-name>CAS Assertion ThreadLocal Filter</filter-name>

         <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>

</filter>

<filter-mapping>

         <filter-name>CAS Assertion ThreadLocal Filter</filter-name>

         <url-pattern>/*</url-pattern>

</filter-mapping>

<!--======================== 单点登录结束 ======================== -->

此时客户端配置完成可以访问测试:

输入http:/jiuge.lol:7070/examples/servlets/servlet/HelloWorldExample

会跳转到如下认证界面

elasticsearch+Nginx+django+cas+mysql平台搭建

 输入用户名密码(jiuge)

elasticsearch+Nginx+django+cas+mysql平台搭建

注意:此处的结果虽然和不做认证显示相同,但是仔细观察就会发现在地址栏会有票据信息显示的

 

若要把客户端tomcat放在其他机器只需要导入cas服务器的证书到jre中即可(server.crt);其他的配置和上面的完全一样。

elasticsearch+Nginx+django+cas+mysql平台搭建

elasticsearch+Nginx+django+cas+mysql平台搭建

 

tomcat的CLOSEWAIT

解决方法:

1.(暂时生效,重新启动 linux 後,会还原成预设值)

sysctl -w net.ipv4.tcp_fin_timeout=30

sysctl -w net.ipv4.tcp_keepalive_time=1800

sysctl -w net.ipv4.tcp_keepalive_probes=2

sysctl -w net.ipv4.tcp_keepalive_intvl=2

2.(永久生效)

vi /etc/sysctl.conf

# Decrease the time default value fortcp_fin_timeout connection

net.ipv4.tcp_fin_timeout = 30

# Decrease the time default value fortcp_keepalive_time connection

net.ipv4.tcp_keepalive_time = 1800

# 探测次数

net.ipv4.tcp_keepalive_probes=2

# 探测间隔秒数

net.ipv4.tcp_keepalive_intvl=2

编辑完 /etc/sysctl.conf,要重启network 才会生效

[[email protected] /]# /etc/rc.d/init.d/networkrestart

**********************************************************************************

PS: 发生CLOSE_WAIT 的原因,可能在於程式内 一端的Socket使用close後,另一端的Socket没有使用close.检查一下代码内是否有Server端在某些异常情况时,没有关闭Socket,将之修改,应可改正此一问题

Django Nginx+uwsgi 安装配置

安装django

pip install django

然后新建一个项目lcsite (django-admin.py startproject lcsite)

再新建一个app lc(python manage.py startapp lc)

安装nginx:详细见linux7学习笔记.doc

安装uwsgi

pip install uwsgi

对于启动方式常见的有xml 和ini方式这里选择 ini的方式

利用ini的方式配置uwsgi 在/etc/目录下新建 uwsgi5050.ini 文件添加如下配置

 elasticsearch+Nginx+django+cas+mysql平台搭建

配置nginx的conf文件在server中添加如下配置:

server {

       listen       8000;

       server_name  localhost;

        

       location / {           

           include  uwsgi_params;

           uwsgi_pass  127.0.0.1:5050;             //必须和uwsgi中的设置一致

           uwsgi_param UWSGI_SCRIPT lcsite.wsgi;  //入口文件,即wsgi.py相对于项目根目录的位置,“.”相当于一层目录

           uwsgi_param UWSGI_CHDIR /website/lcsite;   //项目根目录

           index  index.html index.htm;

           client_max_body_size 35m;

       }

}

启动nginx:   nginx

启动uwsgi:   uwsgi  --ini /etc/uwsgi5050.ini(注意:要用普通账号启动,否则日志里面会有警告信息)

 

若出现 如下错误:

则应该在uwsgi.py(存放在lcsite文件下)中添加如下配置:

 elasticsearch+Nginx+django+cas+mysql平台搭建

访问nginx服务器(用的是8000端口):

elasticsearch+Nginx+django+cas+mysql平台搭建

正常运行,配置结束

django_cas_ng的搭建

安装 django-cas-ng

elasticsearch+Nginx+django+cas+mysql平台搭建
接下来修改django的配置文件:

首先修改setting文件:

elasticsearch+Nginx+django+cas+mysql平台搭建

elasticsearch+Nginx+django+cas+mysql平台搭建

elasticsearch+Nginx+django+cas+mysql平台搭建

说明:

CAS_SERVER_URL为cas服务器的地址(注意对应好端口,前面搭建cas服务器用的9433端口,这里为了方便记忆修改了cas服务器的端口为8433)

CAS_REDIRECT_URL= '/lc' 指定cas认证完成之后重定向地址 默认”/”

修改url.py文件:

elasticsearch+Nginx+django+cas+mysql平台搭建

这里的url匹配规则是测试用的,如果是在实际项目中,可以研究一个完善的url,以及自定义错误页面,避免url被暴露。

这里在views中简单做了一下过滤,认证通过转到index.html 没有认证转到认证界面login这里采用的是login_required模块

elasticsearch+Nginx+django+cas+mysql平台搭建

这里可以运行一下以下两条命令查看一下

 elasticsearch+Nginx+django+cas+mysql平台搭建

 

 

 

 

接下来就用到前面配置cas服务器生成的server.crt证书了

因为django是python的框架。所以查看Python的证书

elasticsearch+Nginx+django+cas+mysql平台搭建

需要把server.crt证书的内容复制到这个目录下的cacert.pem中

这里的证书都是pem扩展名的,然而cas服务器的证书是crt扩展名的,crt扩展名的证书是属于DER编码格式的是一种二进制编码的无法查看,所以要把它转换为扩展名为.pem

ASCII(Base64)编码,可以阅读的格式。

具体的转换方法:

1. 用IE浏览器间接转换,先把crt格式证书导入IE浏览器,再导出来,这时候成了cer格式证书,再用命令把cer格式证书转换pem格式证书

2. opensslx509 -inform der -in server.cer -out server.pem

可以查看其内容如下

elasticsearch+Nginx+django+cas+mysql平台搭建

最后将这部分内容复制到python目录下的cacert.pem之中,完成所有的配置。

接下里进行测试:

 

运行: uwsgi --ini /etc/uwsgi5050.ini

查看运行日志:

elasticsearch+Nginx+django+cas+mysql平台搭建

elasticsearch+Nginx+django+cas+mysql平台搭建

正常启动,访问浏览器

输入www.jiuge.lol访问网站主目录:

elasticsearch+Nginx+django+cas+mysql平台搭建

跳转到cas服务器认证login界面

elasticsearch+Nginx+django+cas+mysql平台搭建

 

->输入用户名密码跳转回主页面

elasticsearch+Nginx+django+cas+mysql平台搭建

自定义错误页面

elasticsearch+Nginx+django+cas+mysql平台搭建

注销认证:

elasticsearch+Nginx+django+cas+mysql平台搭建

cas-mysql认证:

由于之前的cas认证中只是输入相同的用户名和密码就可以认证通过,这显然和符合实际应用,要把可以访问的用户名、密码存储在mysql数据中,每次认证的用户名要去mysql数据库中进行查询。

这里为了更好的对应mysql的版本选择了cas4.2.7版本,另一方面这个版本需要的jar包相对比较少。

 

 

 

 

1.安装并配置mysql数据库:

yum install mysql

yum install mysql-devel

wgethttp://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

rpm -ivhmysql-community-release-el7-5.noarch.rpm

yum install mysql-community-server

更改mysql root用密码

elasticsearch+Nginx+django+cas+mysql平台搭建

elasticsearch+Nginx+django+cas+mysql平台搭建

修改默认编码:

elasticsearch+Nginx+django+cas+mysql平台搭建

远程连接设置:

mysql> grant all privileges on *.* to [email protected]'%'identifiedby 'password';

配置好mysql数据库之后可以创建一个cas_user用户表,然后插入一条数据:

 

CREATE  TABLE `cas_user` (

 

 `id` bigint(16)   NOT  NULL  ,

 

 `account` varchar(30)  DEFAULT  NULL  ,

 

 `password` varchar(255)  DEFAULT NULL  ,

 `valid` tinyint(1)  DEFAULT NULL ,

 

 PRIMARY KEY(`id`)

 

) ENGINE=InnoDB ;

 

insert  into`cas_user`(`id`,`account`,`password`,`valid`) values(2017193618796666,'test',MD5('test001'),1);

 

 

 

 

2.只需要重新部署cas.war到webapps中即可

首先现在cas4.2.7版本在github上面找到对应的zip包即可。

 

elasticsearch+Nginx+django+cas+mysql平台搭建

这里要注意一定解压之后会发现这个和之前的cas3.5有一点不同,之前的在models中就有cas.war包,这个版本中没有这个包。

所以要生成cas.war

首先安装一个构建项目工具-Gradle:

wget https://downloads.gradle.org/distributions/gradle-3.2.1-all.zip

unzip gradle-3.2.1-all.zip

放到/usr/local

配置环境变量:

GRADLE_HOME=/usr/software/gradle-3.2.1

export PATH=${GRADLE_HOME}/bin:${PATH}

检测:

gradle -version

elasticsearch+Nginx+django+cas+mysql平台搭建

安装成功

接下里构建项目

解压cas4.2.7--cd cas4.2.7-cd cas-server-webapp

然后执行 gradle build (时间会有点长)

然后查看该目录文件会多了一个build文件夹

elasticsearch+Nginx+django+cas+mysql平台搭建

然后进入libs文件夹查看:

 

 elasticsearch+Nginx+django+cas+mysql平台搭建

这个已经生成了我们想要的war包

接下来只需要将war包复制到tomcat/webapps下并改名为cas.war即可

下面就要生成所需要的两个jar包:

cas-server-support-jdbc-4.2.7.jar

和mysql-connector-Java-5.1.5.bin.jar

#cdcas-4.2.7/cas-server-support-jdbc

#gradle build(等候一段时间)

可以看到生成了build文件夹在build/libs/下面可以看到:

elasticsearch+Nginx+django+cas+mysql平台搭建

将这个jar包复制到cas项目下的 WEB-INF/lib下面

对于mysql-connector-Java-5.1.5.bin.jar只需要在百度上下载即可,同样也放到上面的目录下

3.配置cas读数据库验证用户并对密码进行加密

elasticsearch+Nginx+django+cas+mysql平台搭建

打开deployerConfigContext.xml

搜索这条配置并注释之

 <!-- <aliasname="acceptUsersAuthenticationHandler"alias="primaryAuthenticationHandler" />-->

而后添加如下配置:

elasticsearch+Nginx+django+cas+mysql平台搭建

注:上面三个绿色框由上到下一次对应你的数据库名称,mysql登录用户名,mysq登录密码。

打开cas.properties

只需要添加如下代码即可

elasticsearch+Nginx+django+cas+mysql平台搭建

注:对应好自己的表名称以及字段名称

把web容器以及相应的容器重启一下

此时通过我的django客户端访问es服务器会出现如下错误:

elasticsearch+Nginx+django+cas+mysql平台搭建

解决的方法是:

只需要修改HTTPSandIMAPS-10000001.json

 elasticsearch+Nginx+django+cas+mysql平台搭建

此时对以上所做的进行一个简单的测试:

django放到了nginx容器中,所以对外只暴露了nginx的端口

访问nginx(django端口为5050),相当于访问django首页。

elasticsearch+Nginx+django+cas+mysql平台搭建

跳转到登录界面(进行认证)

 elasticsearch+Nginx+django+cas+mysql平台搭建

输入用户名密码:(随便输入或者输入cas4.0+版本的默认帐号密码(casuser/Mellon))

elasticsearch+Nginx+django+cas+mysql平台搭建elasticsearch+Nginx+django+cas+mysql平台搭建

输入mysql中的用户名密码:

elasticsearch+Nginx+django+cas+mysql平台搭建

可以发现正常访问了django的首页,所以也证明整个配置没有问题

 

因为elasticsearch和其他的认证模块在配置上没有关联,所以在最后进行配置,

对于代理elasticsearch只需更改nginx的配置文件即可:

如果想给elasticsearch配置一个管理员用户可以进行如下配置:

1.首先在nginx目录下新建一个存放秘钥的文件夹http_passwd_user(名字任意)

2.修改nginx的配置文件nginx.conf

添加如下内容

3.用openssl生成认认证文件:

 printf "admin:$(openssl passwd -cryptadmin007)\n" > /usr/local/nginx/http_passwd_user/admins

如果无法正常访问es则需要在iptables配置文件中加上红色部分的规则

elasticsearch+Nginx+django+cas+mysql平台搭建

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在公司的服务器django-cas-ng采用的是源码安装,而不是pip安装,源码安装是不会安装certifi这个包,所以要单独安装:

elasticsearch+Nginx+django+cas+mysql平台搭建

将这个包解压安装

 

然后把cas服务器上的证书放到了自己的本地服务器的这里面(复制进去就可以,如果不是base64编码的可以先转换一下)

 elasticsearch+Nginx+django+cas+mysql平台搭建