Tomcat

部署tomcat

到http://tomcat.apache.org/下载tomcat,下载后解压到数据盘,执行bin/startup.sh来启动tomcat。注意设置startup.sh和catalina.sh的可执行权限。

./startup.sh
./shutdown.sh

shutdown后要等一会完全关闭后再重新启动。

遇到了tomcat异常挂掉的问题

有权限问题
java.util.logging.ErrorManager: 4
java.io.FileNotFoundException: /usr/local/tomcat/logs/catalina.2017-06-11.log (Permission denied)
有内存不够的问题
[root@VM_5_53_centos logs]# service tomcat restart
Stoping Tomcat
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_92
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000eb550000, 178978816, 0) failed; error=’Cannot allocate memory’ (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 178978816 bytes for committing reserved memory.
# An error report file with more information is saved as:
# //hs_err_pid14383.log
waiting for processes to exit

设置并发连接数

server.xml中在配置中,和连接数相关的参数有:
minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10
maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75
acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100
enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false
connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,但这样设置有隐患的。通常可设置为30000毫秒。
其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数,应同时加大这两个参数。
web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。

设置内存占用

tomcat默认可以使用的内存为128MB,在较大型的应用项目中是不够的。
Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,例如增加如下设置:JAVA_OPTS=’-Xms256m -Xmx512m’,表示初始化内存为256MB,可以使用的最大内存为512MB。

对虚拟路径配置二级域名

在tomcat/conf/server.xml中增加一个Host节点,如下:

<Host name="domain2.brogrammer.cn" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="ReadAdmin" reloadable="false"/>
</Host>

Eclipse中配置J2EE Web module的服务容器

Eclipse是在 “服务偏好/Server/Runtime Environments” 中添加。
注意开发中和生产中要使用同一个Tomcat版本,因为编译可能要使用servlet-api.jar,要保证编译和运行版本一致,它存在于tomcat/lib中。

Tomcat配置https

1.将证书.jks文件放到tomcat/conf目录下
2.编辑conf/server.xml文件,在http和ajp节点中增加redirectPort
<Connector port=”80″ protocol=”HTTP/1.1″ connectionTimeout=”20000″ redirectPort=”443″ />
<Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”443″ />
3.编辑conf/server.xml文件,增加https节点
<Connector port=”443″ protocol=”org.apache.coyote.http11.Http11NioProtocol” maxThreads=”150″ SSLEnabled=”true”>
<SSLHostConfig>
<Certificate certificateKeystoreFile=”conf/ xxx.jks” certificateKeyAlias=”www.abc.com” certificateKeystorePassword=”” type=”RSA” />
</SSLHostConfig>
</Connector>

临时目录问题

Caused by: java.io.IOException: The temporary upload location [/tmp/tomcat.**/work/Tomcat/localhost/ROOT] is not valid
原因分析:临时文件夹无效,系统可能清除了临时目录。

解决方案一:
重启服务,临时方案:会重新生成tomcat目录,但是生产环境不建议如此操作;

解决方案二:
1增加服务配置,自定义baseDir:
2启动时增加参数-Djava.io.tmpdir=自定义目录

解决方案三:
注入一个Bean,手动配置临时目录

/**
 * 文件上传临时路径
 */
 @Bean
 MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setLocation("/app/pttms/tmp");
    return factory.createMultipartConfig();
}

服务端消息框架

消息规范

JMS:Java Message Service,Java消息服务,是基于JVM消息代理的规范。
AMQP:Advanced Message Queuing Protocol,高级消息队列协议,也是一个消息代理的规范,它不仅兼容JMS,还支持跨语言和平台。2004年,摩根大通和iMatrix开始着手AMQP开放标准的开发。2006年,AMQP规范发布。2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布。RabbitMQ采用Erlang语言开发。
AMQP与JMS不同,JMS定义了一个API和一组行为,而AMQP是一个线路级协议。线路级协议描述的是通过网络发送的数据传输格式,任何符合该数据格式的消息发送和接收工具都能互相兼容和进行操作,这样能实现跨技术平台的架构方案。
MQTT:物联网(Internet of Things,IoT)机器之间(Machine-to-Machine,M2M)的大规模沟通中使用传统的HTTP请求/回答(Request/Response)模式不再合适,取而代之的是发布/订阅(Publish/Subscribe)模式。这就是轻量级、可扩展的MQTT,即Message Queuing Telemetry Transport,消息队列遥测传输,是IBM开发的一个即时信息传输通讯协议,是一个客户端服务端架构的发布/订阅模式的基于TCP/IP的基于二进制的消息传输协议。在物联网开发中,MQTT不是唯一的选择,与MQTT互相竞争的协议有XMPP和CoAP协议等,MQTT如今已经成为OASIS规范。MQTT规范很简单,非常适合需要低功耗和网络带宽有限的IoT场景。
TCP/IP参考模型可以分为四层:应用层、传输层、网络层、链路层。TCP和UDP位于传输层,应用层常见的协议有HTTP、FTP、SSH等。MQTT协议运行于TCP之上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT。

异步消息

异步消息中有两个很重要的概念,即消息代理(message broker)和目的地(destination),消息发送者发送消息之后,消息将由消息代理接管,再由消息代理负责保证消息传递到指定目的地。
目的地形式有两种:队列(queue)和主题(topic)。队列用于点对点(point-to-point)形式的消息通信,主题用于发布订阅式(publish/subscribe)的消息通信。队列中的消息一次取出即逝,主题形式的消息可以做到多次使用。

消息框架

ActiveMQ: Apache出品,是最流行的,能力强劲的开源消息总线,是一个队列项目,支持MQTT、AMQP等协议。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经很久了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

kafka同RabbitMQ,ActiveMQ等是分布式消息队列,或者叫分布式消息中间件,或者叫做一种MQ产品(Message Queue)。kafka不支持MQTT协议。

事件驱动框架

事件驱动框架的优势是耦合度很低、系统扩展性好,而且生产者无需关心消费者。事件驱动框架可理解为观察者模式的升级,而观察者模式是固定调用关系的解耦。

参考:
管中窥豹:一线工程师看MQTT,协议详解 http://blog.csdn.net/tangxiaoyin/article/details/76053348
MQTT-Node.js实现-Mosca简介
http://www.jianshu.com/p/8315acec4e6b
MQTT入门篇
https://zhuanlan.zhihu.com/p/20888181
物联网核心协议—消息推送技术演进
http://www.cnblogs.com/Free-Thinker/p/5559798.html
物联网MQTT协议分析和开源Mosquitto部署验证 mosquitto_sub -t topic_name
http://www.cnblogs.com/Free-Thinker/p/5559816.html
MQTT协议笔记之消息流
http://www.blogjava.net/yongboy/archive/2014/02/15/409893.html
MQTT协议通俗讲解
http://blog.csdn.net/u011216417/article/details/69666752

centos6.9下mosquitto搭建

1.下载libwebsockets和mosquitto
libwebsockets下载页面:https://github.com/warmcat/libwebsockets/releases
mosquitto下载页面:https://github.com/eclipse/mosquitto/releases
2.安装依赖
yum -y install gcc gcc-c++ openssl-devel c-ares-devel libuuid-devel wget cmake xmlto
3.增加websocket支持
cd /home
tar -zxvf libwebsockets-2.4.1.tar.gz
cd libwebsockets-2.4.1
mkdir bulid
cd bulid
cmake ..
make && make install
sudo ldconfig #If you’ve installed libwebsockets with make install then you probably just need to run sudo ldconfig to update the linker cache。
4.安装mosquitto
cd /home
tar -zxvf mosquitto-1.4.14.tar.gz
#添加websocket支持
修改config.mk文件以使后面编译的mosquitto文件支持websocket
cd mosquitto-1.4.14
找到mosquitto-1.4.14目录下的config.mk文件,把config.mk文件中的WITH_WEBSOCKETS:=no改为yes,如下:
# Build with websockets support on the broker.
WITH_WEBSOCKETS:=yes
#安装
make && make install
#如果安装过报错如下:
warning: failed to load external entity “/usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl”
compilation error: file manpage.xsl line 3 element import
xsl:import : unable to load /usr/share/xml/docbook/stylesheet/docbook-xsl/manpages/docbook.xsl
compilation error: file mosquitto.8.xml line 4 element refentry
xsltParseStylesheetProcess : document is not a stylesheet
make[1]: *** [mosquitto.8] Error 5
make[1]: Leaving directory `/home/mosquitto-1.4.14/man’
make: *** [docs] Error 2
,则修改/home/mosquitto-1.4.14/man/manpage.xsl中

修改为:
重新执行:make && make install
#如果执行程序时找不到libwebsockets的库文件,执行下面的命令为库做一下符号连接:
ln -s /usr/local/lib/libwebsockets.so.6 /usr/lib64/libwebsockets.so.6
#其它操作
groupadd mosquitto
useradd -g mosquitto mosquitto
#创建mosquitto.conf、pwfile文件
cd /etc/mosquitto/
cp mosquitto.conf.example mosquitto.conf
cp pwfile.example pwfile
cp aclfile.example aclfile
#mosquitto.conf修改配置如下,注意去掉每行前面的tab空白:

	# =================================================================
	# General configuration
	# =================================================================
	# 服务进程的PID
	pid_file /var/run/mosquitto.pid
	# 服务端口号
	port 1883
	# websockets端口号
	listener 9090
	# 添加websockets协议支持
	protocol websockets
	# 最大连接数,-1表示不限制
	max_connections -1
	# 服务进程的系统用户
	user mosquitto

	# =================================================================
	# Security
	# =================================================================
	# 不允许匿名用户
	allow_anonymous false
	# 用户/密码文件,默认格式:username:password
	password_file /etc/mosquitto/pwfile
	# 配置用户访问控制
	acl_file /etc/mosquitto/aclfile

	# =================================================================
	#Persistence configuration
	# =================================================================
	# 消息自动保存的间隔时间:默认30分钟往磁盘写一次,0表示mosquitto关闭才写到磁盘中
	autosave_interval 1800
	# 消息自动保存功能的开关
	autosave_on_changes false
	# 持久化功能的开关
	persistence true
	# 持久化DB文件
	persistence_file mosquitto.db
	# 持久化DB文件目录
	persistence_location /usr/mosquitto/

	# =================================================================
	# Logging
	# =================================================================
	# 4种日志模式:stdout、stderr、syslog、topic
	# 日志路径:none 则表示不记日志,此配置可以提升些许性能
	log_dest file /usr/mosquitto/mosquitto.log
	# 选择日志的级别(可设置多项)
	log_type error
	# 是否记录客户端连接信息
	#connection_messages true
	# 是否记录日志时间
	#log_timestamp true

#创建用户及密码,此处用户名是hthl_pub
mosquitto_passwd -c /etc/mosquitto/pwfile hthl_pub
输入命令后,控制台会提示输入新建用户的密码,连续输入两次密码后,则会生成一个pwfile文件。
注意:mosquitto_passwd -c 每次都只会生成只包含一个用户的文件,如果想在passwd.conf中存放多个用户, 可以使用mosquitto_passwd -b 命令:
mosquitto_passwd -b [最终生成的password_file文件] [用户名] [密码]
mosquitto_passwd -b /etc/mosquitto/pwfile hthl_sub 123456
mosquitto_passwd -D 命令删除一个用户
mosquitto_passwd -D [最终生成的password_file文件] [用户名]
#aclfile修改配置如下:

	#This only affects clients with username "hthl_pub".
	user hthl_pub
	topic write hthl/#
	# This only affects clients with username "hthl_sub".
	user hthl_sub
	topic read hthl/#

#创建存储目录
mkdir /usr/mosquitto
chown -R mosquitto /usr/mosquitto

5.启动 mqtt
mosquitto -c /etc/mosquitto/mosquitto.conf -d
6.推送测试
mosquitto_pub -h 127.0.0.1 -t topic1 -u hthl_pub -P 123456 -m “你好,世界!”
7.卸载
cd /home/mosquitto-1.4.14
make uninstall
reboot

8.Docker build file for mosquitto

sudo docker run -p 1883:1883 --name mosquitto --restart always -d ansi/mosquitto

https://hub.docker.com/r/ansi/mosquitto/

参考
http://www.voidcn.com/article/p-fjphobex-brk.html
http://www.cnblogs.com/littleatp/p/4835879.html

命令行发布测试:
mosquitto_pub -h localhost -t topic1 -u username1 -P password1 -m “你好,世界!”
命令行订阅测试:
mosquitto_sub -t topic1 -u username1 -P password1

OPC

OPC是什么?
http://opcfoundation.cn/about/what-is-opc/index.aspx
http://blog.csdn.net/u013120247/article/details/50163147

HowToStartWithUtgard
https://openscada.atlassian.net/wiki/display/OP/HowToStartWithUtgard

控制系统经常用到的是DCS和PLC
目前常用的无线网络标准最流行的3个是ZigBee、Bluetooth和WiFi。

OPC client examples include utgard and jeasyopc
https://github.com/luoyan35714/OPC_Client

也可以不使用AccessBase方式,使用for循环轮询查看item的数值。
http://tonynju.iteye.com/blog/289929

模拟器
http://www.matrikonopc.cn/products/opc-drivers/opc-simulation-server.aspx
http://www.hifreud.com/2014/12/27/opc-1-install-MatrikonOPC-Server-for-Simulation-and-Test/
http://www.hifreud.com/2014/12/27/opc-2-what-is-opc/
http://www.hifreud.com/2014/12/27/opc-3-main-feature-in-opc/
http://www.hifreud.com/2014/12/27/opc-4-client-invoke-use-utgard/
http://www.hifreud.com/2014/12/27/opc-5-client-invode-use-JeasyOPC/

supervisor

Linux的后台进程运行有好几种方法,例如nohup,screen,upstart,systemd等,但是一个服务程序要可靠地在后台运行,就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,能做开机启动,并监控进程状态,异常退出时能自动重启,它还提供了web管理界面。

安装supervisor
$ sudo apt-get install supervisor
卸载supervisor
$ sudo apt-get remove supervisor
安装完成后,查看其配置文件
$ vi /etc/supervisor/supervisord.conf
查看到自定义配置存放目录为 files=/etc/supervisor/conf.d/*.conf
$ cd /etc/supervisor/conf.d
创建要自启动的服务配置
$ sudo vi service1.conf

配置解释:

[program:service1] #服务名称,在supervisor中可以用这个名字来管理该程序。
command=  #启动程序的命令
directory=/home/user1 #相当于在该目录下执行程序
autostart=true #设置随supervisor的启动而启动
autorestart=true #程序停止之后是否需要重新将其启动
startsecs=10 #重新启动时,等待的时间
startretries=36 #重启程序的次数
redirect_stderr=true #是否将程序错误信息重定向的到文件
stdout_logfile=/home/user1/%(program_name)s_log.txt #将程序输出重定向到该文件
stderr_logfile=/home/user1/%(program_name)s_err.txt #将程序错误信息重定向到该文件
numprocs = 2
numprocs_start = 8850
user = #系统用户名
process_name = 163gs-%(process_num)s

配置好后重启supervisor服务

sudo service supervisor restart

supervisorctl 是命令行管理工具,它的查数查看

supervisorctl help
supervisorctl version
default commands (type help ):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update 
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version

更新配置到 supervisord:

supervisorctl update

Supervisor2.x版本有一些不同:

配置文件位置 /etc/supervisord.conf
需要在supervisord.conf尾部按示例添加服务配置
服务名称是 supervisord
sudo service supervisord restart

更多配置参考
http://supervisord.org/configuration.html
http://www.jianshu.com/p/65f31f5a4e84
http://www.jianshu.com/p/805977544d7f
http://www.linuxidc.com/Linux/2015-04/116701.htm
http://www.cnblogs.com/haoliansheng/p/6611714.html
http://www.cnblogs.com/zhangym/p/5833353.html

错误处理

执行supervisorctl命令,报错 unix:///tmp/supervisor.sock no such file,说明supervisord并未正常启动,原因是在supervisor默认配置中,其启动的sock等都会放到tmp目录,而tmp目录会自动清理导致无法正常启动。

supervisord -c /etc/supervisord.conf
或 supervisord -c /etc/supervisor/supervisord.conf

ubuntu 18.04中 apt找不到supervisor源,修改Ubuntu的apt-get源为国内镜像源。
https://blog.csdn.net/zgljl2012/article/details/79065174/

反向代理

正向代理

代理服务器代理的是客户端,客户端知道目的服务器,也知道代理服务器,服务端不知道真实的客户端。客户端主动请求代理服务器帮助访问目的服务端。
举例:局域网内的VPN代理服务器,正向代理往往处在客户端局域网内。

反向代理

代理服务器代理的是服务端,客户端不知道目的服务器,只知道代理服务器。代理服务器向客户端隐藏了真实的服务端。
反向代理一般是负载均衡(load balance)的实现原理。反向代理往往处在服务端局域网内。

负载均衡的好处:
单个应用宕机不会停止服务,从而升级应用可以逐个升级而不必停止服务。
提高了应用整体的吞吐量。

TCP服务器

可选的TCP服务器有Mina、Netty、Twisted等,它们都是异步、事件驱动(asynchronous、event-driven)的网络编程框架。
其中MINA和Netty是基于Java语言的,Twisted是Python语言的。语言不是重点,重点的是理念。

  • 传统的BIO(Blocking IO/阻塞IO)进行网络编程时,进行网络IO读写时都会阻塞当前线程,使用BIO实现一个TCP服务器,需要对每个客户端连接开启一个线程,很多线程可能会阻塞住等待读写数据,系统资源消耗大。
  • NIO(Non-Blocking IO/非阻塞IO)或AIO(Asynchronous IO/异步IO)通过IO多路复用技术实现,不需要为每个连接创建一个线程,其底层实现使用了操作系统的一些特性如select、pool、epoll、iocp等。

Mina、Netty、Twisted一起学(一):实现简单的TCP服务器
Netty 4.x 用户指南
Netty in Action 学习
一起学Netty
netty(一) java NIO

同步阻塞I/O

Java的两个IO方法 read和write都是同步阻塞的。
阻塞指的是read和write都会阻塞线程直到读取或发送完成或异常。
同步指的是发送方和接收方是同步的,缓慢的发送和网络传输会使接收长时间阻塞,缓慢的接收和网络传输和狭小的TCP缓冲区也会使发送长时间阻塞,所以发送和接收的速度互相影响。
输入流和输出流的读和写操作都是同步阻塞的,阻塞的时间取决于对方I/O线程的处理速度和网络I/O的传输速度。

Java NIO

JDK1.4引入了新的输入/输出(NIO)库。相比jdk1.3,NIO弥补了原来同步阻塞I/O的不足,提供了高速的、面向块的I/O。
一些NIO新增的类库和概念:
1.缓冲区Buffer
在面向流的I/O中,可以将数据直接写入或读到Stream对象中。
在NIO库中,数据读写都是要经过缓冲区。缓冲区实质上是一个数组,并且一个缓冲区不仅仅是一个数组,它还提供了对数据的结构化访问以及维护读写位置(limit)等信息。
最常用的缓冲区是ByteBuffer,一个ByteBuffer提供了一组功能用于操作byte数组。包括ByteBuffer,每一种java基本类型(除了Boolean类型)都对应一种缓冲区:
ByteBuffer:字节缓冲区
CharBuffer:字符缓冲区
ShortBuffer:短整型缓冲区
IntBuffer:整形缓冲区
LongBuffer:长整型缓冲区
FloadBuffer:浮点型缓冲区
DoubleBuffer:双精度浮点型缓冲区
2.通道Channel
通道与流的不同之处在于通道是双向的,可以用于读、写或者二者同时进行,流只是在一个方向上移动(一个流必须是InputStream或者OutputStream的子类)。
因为Channnel是双全工的,所以它可以比流更好地映射底层操作系统的API。在UNIX网络编程模型中,底层操作系统的通道都是双全工的,同时支持读写操作。
实际上Channel可以分为两大类:用于网络读写的SelectbleChannel和用于文件操作的FileChannel。
与Socket类和ServerSocket类相对应,NIO提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现,它们都是SelectableChannel的子类,都支持阻塞和非阻塞两种模式。
3.多路复用器Selector
多路复用器提供选择已经就绪的任务的能力。Selector会不断地轮询注册在其上的Channel,如果某个Channel上面发生读写事件,这个Channel就处于了就绪状态,处于了就绪状态的Channel会被Selector轮询出来,然后通过SelectionKey可以读取就绪Channel集合,进行后续的I/O操作。
JDK在Linux等主流操作系统上通过epoll实现,所以它并没有最大连接句柄1024/2048的限制。这意味着只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端。
Reactor反应器模式:使用单线程模拟多线程,提高资源的利用率和程序的效率,增加系统吞吐量。
Selector类似一个观察者,我们把需要探知的socketchannel告诉Selector,当有事件发生时,Selector会通知我们并传回一组SelectionKey,我们读取这些Key,会获得注册过的socketchannel,然后从这个Channel中读取数据。即主程序不用主动阻塞的等待数据,而是被通知有数据就绪。
4.AIO
JDK1.7升级了NIO类库,升级后的NIO类库被成为NIO2.0,正式提供了异步文件I/O操作,同时提供了与UNIX网络编程事件驱动I/O对应的AIO。NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供以下两种方式获取操作结果。
(1)通过java.util.concurrent.Future类来表示异步操作的结果;
(2)在异步操作的时候传入一个java.nio.channels.CompletionHandler接口的实现类作为操作完成的回调。
NIO2.0的异步套接字通道是真正的异步非阻塞I/O,对应了UNIX网络编程中的事件驱动I/O(AIO),它不需要通过多路复用器(selector)对注册的通道进行轮询操作即可实现异步读写,从而简化了NIO的编程模型。

Base 128 Varints

Google Protobuf3

Google Protobuf 官方文档之Language Guide (proto3)
http://blog.163.com/lnsjc321@126/blog/static/5348428720154325730234/
https://developers.google.com/protocol-buffers/docs/proto3

nginx

nginx命令

./nginx -s reload
nginx -v
nginx -V 包括查看安装的模块
nginx -s stop 立即停止nginx
nginx -s quit 等待到请求被处理完成后停止nginx
nginx 启动nginx

配置nginx

在conf/vhosts下新建一个.conf文件

server {
 listen 80;
 server_name xxx.cn www.xxx.cn;
 index index.html index.htm index.jsp;
 root /xxx/tomcat-7.0.69/webapps/ROOT;
 location ~ .*\.(jsp)?$
 {
 proxy_pass http://127.0.0.1:8080; #主要在这里,设置一个代理
 }
 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
 expires 30d;
 }
 location ~ .*\.(js|css)?$
 {
 expires 1h;
 }
 #伪静态规则
 #include /xxx/nginx/conf/rewrite/default.conf;
 access_log /xxx/nginx/access/xxx.log;
 }

要赋予网站文件目录执行权限 简单的可以 chomd 777 -R www目录,否则可能出现页面不正常,在浏览器开发者工具中发现找不到静态资源。但随着前后端分离,jsp已较少使用,tomcat后台只需要提供api,所以基本不需要把访问tomcat整合到nginx中了。

mac中编译安装nginx

下载 http://nginx.org/download/nginx-1.10.2.tar.gz
解压进入目录 ./configure –with-http_auth_request_module
make
sudo make install

手动启动nginx:
sudo /usr/local/nginx/sbin/nginx

ubuntu 中编译安装nginx

下载目录 http://nginx.org/download/
wget http://nginx.org/download/nginx-1.12.0.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
unzip
apt-get update
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
cd nginx-1.9.15
./configure –with-http_ssl_module –with-http_auth_request_module –add-module=../nginx-rtmp-module-master —prefix=/etc/nginx
make
sudo make install
http://blog.csdn.net/longji/article/details/54865358
如果自启动失败,则去修改vi /etc/init.d/nginx,修改其中的路径。

#如果Nginx服务已存在则可以不要make install,否则就是覆盖安装
替换nginx二进制文件:
cp /app/nginx/sbin/nginx /app/nginx/sbin/nginx.bak
cp ./objs/nginx /app/nginx/sbin/

安装后目录介绍
nginx path prefix: “/etc/nginx”
nginx binary file: “/etc/nginx/sbin/nginx”
nginx modules path: “/etc/nginx/modules”
nginx configuration prefix: “/etc/nginx/conf”
nginx configuration file: “/etc/nginx/conf/nginx.conf”
nginx pid file: “/etc/nginx/logs/nginx.pid”
nginx error log file: “/etc/nginx/logs/error.log”
nginx http access log file: “/etc/nginx/logs/access.log”
nginx http client request body temporary files: “client_body_temp”
nginx http proxy temporary files: “proxy_temp”
nginx http fastcgi temporary files: “fastcgi_temp”
nginx http uwsgi temporary files: “uwsgi_temp”
nginx http scgi temporary files: “scgi_temp”

CentOS

CentOS

CentOS是Community ENTerprise Operating System的简称,社区企业操作系统,它是Linux操作系统的一个发行版本。CentOS也不是全新的Linux发行版,CentOS是在RHEL发布的基础上基于GPL协议将RHEL的构成克隆再现的一个Linux发行版本之一。
在Red Hat家族中有企业版的产品,Red Hat Enterprise Linux(即RHEL)是很多企业采用的Linux发行版本,需要向Red Hat付费才可以使用,并能得到付过费用的服务和技术支持和版本升级。CentOS可以像RHEL一样构筑Linux系统环境,但不需要向Red Hat付任何的产品和服务费用,同时也得不到任何有偿技术支持和升级服务。
在CentOS的全称里面我们可以看到Enterprise OS,也就是说企业系统,这个企业系统并不是企业级别的系统,而是它可以提供企业级应用所需要的要素,例如:
稳定的环境
长期的升级更新支持
保守性强
大规模的系统也能够发挥很好的性能
CentOS满足以上的要素,满足上面要素的发行版还有Fedora 。但是相比CentOS,Fedora提供更多的新的功能和软件,发布更新快等特点,这样在稳定性和管理方面就增加了很多工作。企业所需要的系统环境应该是,高效稳定的系统环境,一次构建后能够长期使用的系统环境,所以Fedora那样的频繁更新发布的系统环境并不对应企业的应用。在众多的RHEL的克隆版本中,CentOS是很出众很优秀的。
http://os.51cto.com/art/201305/392455.htm

磁盘空间用尽

df -h 发现,

/dev/mapper/vg_cloud-lv_root 已用100%,可用为0了,这是原因。

查看各目录占用磁盘大小

du -sh /* | sort -nr

占用空间大的目录

/var/spool/clientmqueue
/var/spool/mqueue
/var/log
/var/cache

du -sh *

查看邮件发送队列
mailq 或 sendmail -bp

删除所有队列
postsuper -d ALL

关闭空主机头,防止直接用ip访问,或者被别的域名恶意指向。

在nginx/conf/vhosts下新建一个xxx.conf,内容为
server {
listen 80 default;
return 500;
}

域名恶意指向有些隐患:
由于搜索引擎也会收录你的IP地址的页面,所以同一个页面搜索引擎会重复收录,造成页面的权重不如单个收录高。
假如那域名是不友善的域名,比如曾经指向非法网站,容易引发搜索引擎惩罚,连带IP受到牵连。即使域名没什么问题,但流量也会被劫持到别的域名,从而遭到广告联盟的封杀。

SSH远程登录

ssh root@ip
ssh Alias 快捷配置

vi ~/.ssh/config,输入

# 服务器1
Host 别名
    HostName IP地址
    Port 22
    User 用户名

连接时,使用ssh 别名,然后输入密码即可。

CentOS 6.5安装jdk1.8

centos上的邮件系统sendmail,可再次自主安装,会生成/etc/mail目录,安装方法可参考
http://seofangfa.com/shell/centos-sendmail.html
执行mailq命令后如果发现有很多邮件队列,可以清空/var/spool/mqueue中的文件。

/var/spool/clientmqueue目录下可能存在很多文件,删除方法

# cd /var/spool/clientmqueue
# ls | xargs rm -f

错误:ECDSA host key “ip地址” for has changed and you have requested strict checking。
清除当前机器里关于远程服务器的缓存和公钥信息

ssh-keygen -R "远程服务器ip地址"

搭建rtmp服务器

安装web环境

安装阿里云web环境一键安装包
安装前需要注意要把数据盘挂载到alidata目录上。

下载nginx-rtmp-moudle

这里下载 ,上传解压到home目录,

重新生成nginx

修改/home/sh-1.4.4/nginx/install_nginx-1.4.4.sh,在–prefix=/alidata/server/nginx \下行增加

--add-module=/home/nginx-rtmp-module-master

然后执行/install_nginx-1.4.4.sh,重新编译生成nginx文件。

停止当前nginx,用上一步生成的文件替换。

/alidata/server/nginx-1.4.4/sbin/nginx

配置rtmp应用服务

在nginx.conf中和http块同级别增加rtmp块,如下:

rtmp_auto_push on;
rtmp {
server {
listen 1935;
chunk_size 4000;

application rtmp1 {
live on;
#allow play all;
#play /home;
}
application hls1 {
live on;
hls on;
hls_path /tmp/hls;
}
}
}

针对hls,在http里面增加一个location配置

location /hls {  
            types {  
                application/vnd.apple.mpegurl m3u8;  
                video/mp2t ts;  
            }  
            root /tmp;  
            add_header Cache-Control no-cache;  
}

重新启动nginx

安装ffmpeg

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
./configure --disable-yasm
make
sudo chmod 777 /usr/local/
make install 

测试推流

 ffmpeg -re -i /home/mm.MOV -vcodec copy -acodec copy -f flv rtmp://****:1935/myapp/test
 ffmpeg -re -i /home/test.264 -vcodec copy -f flv rtmp://****:1935/myapp/test
 ffmpeg -re -i /home/my.flv -f flv rtmp://****:1935/myapp/test

 

查看文档和播放示例

nginx-rtmp-module-master下的doc、test分别提供了文档说明向导和示例,示例使用了jwplayer flash播放rtmp。
再配置一个http vhost,root指向

root /home/nginx-rtmp-module-master/test/www;

修改指向目录中的index.html文件中的file后的内容为自己发布视频的地址,然后可以访问 http://****/index.html 播放视频。