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
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
输入changeit密码可以看到证书成功导入了
二、配置https
修改tomcat中的server.xml,添加如下内容
此时开启tomcat访问:
说明https配置生效:
三、搭建cas服务器以及客户端测试
1.部署cas
下载cas(网址:http://www.jasig.org/cas)
解压之后在models文件夹下面有一个cas-server-webapp-3.5.0.war,将其改名为cas.war 放到webapps目录下作为单点登录服务器:
此时访问
输入用户名密码(相同字符串就行)注:4.0版本以上cas的默认帐号密码为casuser/Mellon
出现此界面则说明cas服务器搭建成功
2、对cas客户端进行部署测试
下载cas-client-core-3.2.1.jar,commons-logging-1.1.jar并将其拷贝到测试目录examples中的lib下面
此时若在同一台机器上做测试可以安装两个tomcat,其中tomcat-app作为客户端
对于一台机器安装两个tomcat的方法是:
修改环境变量/etc/profile
然后source立即生效
然后在修改tomcat启动文件catalina.sh
将所有的CATALINA_HOME更改为CATALINA_HOME2
(%s/CATALINA_HOME/CATALINA_HOME2/g)
最后只修改server.xml将那些端口改为没有占用的即可(这里修改成7070)
接下来就要进行客户端的配置:
这里用的是tomcat自带的examples目录做测试
修改其web.xml:
添加:
<!--======================== 单点登录开始 ======================== -->
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
<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
会跳转到如下认证界面
输入用户名密码(jiuge)
注意:此处的结果虽然和不做认证显示相同,但是仔细观察就会发现在地址栏会有票据信息显示的
若要把客户端tomcat放在其他机器只需要导入cas服务器的证书到jre中即可(server.crt);其他的配置和上面的完全一样。
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 文件添加如下配置
配置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文件下)中添加如下配置:
访问nginx服务器(用的是8000端口):
正常运行,配置结束
django_cas_ng的搭建
安装 django-cas-ng
接下来修改django的配置文件:
首先修改setting文件:
说明:
CAS_SERVER_URL为cas服务器的地址(注意对应好端口,前面搭建cas服务器用的9433端口,这里为了方便记忆修改了cas服务器的端口为8433)
CAS_REDIRECT_URL= '/lc' 指定cas认证完成之后重定向地址 默认”/”
修改url.py文件:
这里的url匹配规则是测试用的,如果是在实际项目中,可以研究一个完善的url,以及自定义错误页面,避免url被暴露。
这里在views中简单做了一下过滤,认证通过转到index.html 没有认证转到认证界面login这里采用的是login_required模块
这里可以运行一下以下两条命令查看一下
接下来就用到前面配置cas服务器生成的server.crt证书了
因为django是python的框架。所以查看Python的证书
需要把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
可以查看其内容如下
最后将这部分内容复制到python目录下的cacert.pem之中,完成所有的配置。
接下里进行测试:
运行: uwsgi --ini /etc/uwsgi5050.ini
查看运行日志:
正常启动,访问浏览器
输入www.jiuge.lol访问网站主目录:
跳转到cas服务器认证login界面
->输入用户名密码跳转回主页面
自定义错误页面
注销认证:
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用密码
修改默认编码:
远程连接设置:
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包即可。
这里要注意一定解压之后会发现这个和之前的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
安装成功
接下里构建项目
解压cas4.2.7--cd cas4.2.7-cd cas-server-webapp
然后执行 gradle build (时间会有点长)
然后查看该目录文件会多了一个build文件夹
然后进入libs文件夹查看:
这个已经生成了我们想要的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/下面可以看到:
将这个jar包复制到cas项目下的 WEB-INF/lib下面
对于mysql-connector-Java-5.1.5.bin.jar只需要在百度上下载即可,同样也放到上面的目录下
3.配置cas读数据库验证用户并对密码进行加密
打开deployerConfigContext.xml
搜索这条配置并注释之
<!-- <aliasname="acceptUsersAuthenticationHandler"alias="primaryAuthenticationHandler" />-->
而后添加如下配置:
注:上面三个绿色框由上到下一次对应你的数据库名称,mysql登录用户名,mysq登录密码。
打开cas.properties
只需要添加如下代码即可
注:对应好自己的表名称以及字段名称
把web容器以及相应的容器重启一下
此时通过我的django客户端访问es服务器会出现如下错误:
解决的方法是:
只需要修改HTTPSandIMAPS-10000001.json
此时对以上所做的进行一个简单的测试:
django放到了nginx容器中,所以对外只暴露了nginx的端口
访问nginx(django端口为5050),相当于访问django首页。
跳转到登录界面(进行认证)
输入用户名密码:(随便输入或者输入cas4.0+版本的默认帐号密码(casuser/Mellon))
输入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配置文件中加上红色部分的规则
在公司的服务器django-cas-ng采用的是源码安装,而不是pip安装,源码安装是不会安装certifi这个包,所以要单独安装:
将这个包解压安装
然后把cas服务器上的证书放到了自己的本地服务器的这里面(复制进去就可以,如果不是base64编码的可以先转换一下)