tomcat安装使用

一、JDK

  • JDK是 Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具,没有JDK的话,无法编译Java程序(指java源码.java文件)

  • 使用tomcat,首先安装JDK并配置java环境。

1、JDK版本一

OpenJDK: 开源版本

关闭防火墙和selinux,同步时间

[root@tomcat-77 ~]# yum -y install ntpdate
[root@tomcat-77 ~]# ntpdate time2.aliyun.com

安装jdk,这里选择java-1.8.0-openjdk,yum本地安装即可
[root@tomcat-77 ~]# yum -y install java-1.8.0-openjdk
[r[root@tomcat-77 ~]# java -version   #版本查询
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)  #混合模式
注意:安装完成后,要配置JAVA_HOME环境变量,指向java的安装路径;
设定java环境变量
[root@tomcat-77 ~]# echo  $JAVA_HOME   #查询是否有路径
[root@tomcat-77 ~]# vim /etc/profile.d/java.sh  #编写脚本
export JAVA_HOME=/usr
[root@tomcat-77 ~]# . /etc/profile.d/java.sh
[root@tomcat-77 ~]# echo $JAVA_HOME
/usr

2、JDK版本二

Oracle JDK:oracle官方版本
  • oracle官方网站下载,安装相应版本的rpm包;
jdk-VERSION-OS-ARCH.rpm
例如:jdk-1.8.0_25-linux-x64.rpm

3、java环境变量配置

  • 安装完成后,要配置JAVA_HOME环境变量,指向java的安装路径;
    OpenJDK版本:
JAVA_HOME=/usr

Oracle JDK版本:

JAVA_HOME=/usr/java/jdk_VERSION

二、Servlet容器:

servlet容器的主要任务是管理servlet的生命周期。而web容器更准确的说应该叫web服务器,它是来管理和部署 web应用的。
web容器最典型的就是tomcat了,Tomcat是web容 器也是servlet容器。

  • Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
  • 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
  • 最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。

三、java在web中的应用JSP技术

1、JSP技术定义

  • JSP是一种技术,JSP技术是在传统的网页HTML文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。使JSP开发的Web应用可以跨平台运行。

  • JSP属于Servlet,因为在编译JSP时,会把JSP先编译为一个Servlet,然后由容器来提供服务

2、JSP页面运行过程

.jsp文件 -->jasper--> .java --> javac --> .class类 --> jvm虚拟机
示例:

<html>
<title>TITLE</title>
<body>
<h1>...</h1>
<%
... java code... #java代码
%>
</body>
</html>

注意:基于jasper将静态输出的数据转为java代码进行输出,结果为servlet规范的代码;

3、JSP Container: jsp容器

JSP技术加Servlet容器就是形成了jsp容器,他就是后来的JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。

  • 商业实现软件有:
    WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss, ...
  • 开源实现软件有:
    Tomcat, Jetty, Resin, ...

四、Tomcat安装

  • Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML标准通用标记语言下的一个应用页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

官方网站:http://tomcat.apache.org/
Java 2 EE技术体系的不完整实现;

1、安装Tomcat:

方法一:Tomcat的Base Repo安装:
[root@tomcat-77 ~]# yum install -y tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
[root@tomcat-77 ~]# systemctl start tomcat.service

tomcat #核心包
tomcat-lib #库文件
tomcat-admin-webapp s#基于web页面管理接口
tomcat-webapps #jsp示例程序
tomcat-docs-webapp #操作文档页面

方法二:Tomcat 解压展开安装
 ~]# tar xf apache-tomcat-VERSION.tar.gz  -C /usr/local/  #解压缩到指定目录
 ~]# cd /usr/local
local ~]# ln -sv apache-tomcat-VERSION  tomcat  #设置别名
local ~]# vim /etc/profile.d/tomcat.sh  #编辑环境变量shell
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
local ~]# .  /etc/profile.d/tomcat.sh #执行
local ~]#  cd tomcat/bin
bin ~]#catalina.sh --help #帮助信息
bin ~]#catalina.sh version  #版本信息
bin ~]#catalina.sh start  #启动 tomcat
bin ~]#catalina.sh stop #停止tomcat
bin ~]#catalina.sh stop 9 #9秒后停止tomcat
bin ~]#catalina.sh stop 9 -force#9秒后强制停止tomcat

2、tomcat程序环境:

tomcat的目录结构
bin:脚本,及启动时用到的类;
conf:配置文件目录;
lib:库文件,Java类库,jar;
logs:日志文件目录;
temp:临时文件目录;
webapps:webapp的默认目录;
work:工作目录;

3、tomcat的配置文件构成:

  • server.xml:主配置文件;

web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置;
context.xml:每个webapp都可以专用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置;
tomcat-users.xml:用户认证的账号和密码文件;
catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略;
catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数;
logging.properties:日志系统相关的配置;

4、Tomcat的核心组件:server.xml

<Server>
    <Service>
       <connector/>
        <connector/>
...
        <Engine>#引擎
             <Host> #主机
                <Context/> #程序
                <Context/>
               ...
            </Host> 
             <Host>
              ...
            </Host>
              ...
         </Engine>
    </Service>
</Server>
每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:

顶级组件:Server
服务类组件:Service
连接器组件:http, https, ajp(apache jserv protocol)
容器类:Engine, Host, Context
被嵌套类:valve, logger, realm, loader, manager, ...
集群类组件:listener, cluster, ...

五、JSP WebAPP部署:

1、JSP WebAPP的组织结构:

/: webapps的根目录
index.jsp:主页;
WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件;
META-INF/:类似于WEB-INF/;
classes/:类文件,当前webapp所提供的类;
lib/:类文件,当前webapp所提供的类,被打包为jar格式;

2、webapp归档格式:

.war:webapp
.jar:EJB的类打包文件;
.rar:资源适配器类打包文件;
.ear:企业级webapp;

[root@tomcat-77 ~]# ls /var/lib/tomcat
webapps

3、部署(deploy)webapp的相关操作:

步骤:
  • deploy:将webapp的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问此webapp;将其特有的类和依赖的类通过class loader装载至JVM;
部署有两种方式:自动部署和手动部署

操作分为:

  • 冷部署:把webapp复制到指定的位置,而后才启动tomcat;
  • 热部署:在不停止tomcat的前提下进行部署;
反部署:

undeploy:,停止webapp,并从tomcat实例上卸载webapp;

部署工具:

manage:r、ant脚本、tcd(tomcat client deployer)等;

命令:

start:启动处于停止状态的webapp;
stop:停止webapp,不再向用户提供服务;其类依然在jvm上;
redeploy:重新部署;

4、手动提供一测试类应用,并冷部署:

示例:

[root@tomcat-77 ~]# cd  /var/cache/tomcat/work
[root@tomcat-77 work]# ls
Catalina
[root@tomcat-77 work]# tree Catalina/
Catalina/
└── localhost
    ├── _
    │   └── org
    │       └── apache
    │           └── jsp
    │               ├── index_jsp.class
    │               └── index_jsp.java
    ├── docs
    ├── examples
    ├── host-manager  #管理虚拟主机
    ├── manager
    │   └── org
    │       └── apache
    │           └── jsp
    │               └── WEB_002dINF
    │                   └── jsp
    │                       ├── _401_jsp.class
    │                       └── _401_jsp.java
    └── sample

# mkidr  -pv  /usr/local/tomcat/webapps/test/{classes,lib,WEB-INF}
创建文件/usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<% out.println("hello world");
%>
</body>
</html>

六、tomcat的两个管理应用:

1、启用manager
[root@tomcat-77 ~]# vim /etc/tomcat/tomcat-users.xml 
 <role rolename="manager-gui"/>   <user username="tomcat" password="tomcat" roles="manager-gui"/>
[root@tomcat-77 ~]# systemctl restart tomcat
登录

部署管理页面

内存使用和回收信息
2、host-manager虚拟主机管理
[root@tomcat-77 ~]# vim /etc/tomcat/tomcat-users.xml 
<role rolename="admin-gui"/> 
  <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
[root@tomcat-77 ~]# systemctl restart tomcat
登录

显示和添加虚拟主机
  • 通过gui界面,可以热部署虚拟主机

3、tomcat的常用组件配置:

  • Server:代表tomcat instance,即表现出的一个java进程;监听在8005端口,只接收“SHUTDOWN”。各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口;

  • Service:用于实现将一个或多个connector组件关联至一个engine组件;

4、Connector连接器组件:

负责接收请求,常见的有三类http/https/ajp;

进入tomcat的请求可分为两类:

  • (1) standalone : 请求来自于客户端浏览器;
  • (2) 由其它的web server反代:来自前端的反代服务器;
  • 情况一:nginx反代 --> http connector --> tomcat
  • 情况二:
    • httpd(proxy_http_module)反代 --> http connector --> tomcat
    • httpd(proxy_ajp_module)反代 --> ajp connector --> tomcat
  • 情况三:httpd(mod_jk) --> ajp connector --> tomcat

5、Connector连接器属性:

port="8080" #监听的端口
protocol="HTTP/1.1" #协议
connectionTimeout="20000" #超时时间
address:监听的IP地址;默认为本机所有可用地址;
maxThreads:最大并发连接数,默认为200;
enableLookups:是否启用DNS查询功能,提升性能建议关闭;
acceptCount:等待队列的最大长度;
secure:安全
sslProtocol:

6、Engine容器组件:

Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost来定义默认的虚拟主机;

Engine容器组件属性:

name= #名称
defaultHost="localhost" #默认主机
jvmRoute= :jvm的路由标识

7、Host组件:

位于engine内部用于接收请求并进行相应处理的主机或虚拟主机,

示例:
<Host name="localhost"  appBase="webapps"
unpackWARs="true" autoDeploy="true"> #自动部署
</Host>

常用属性说明:

  • (1) appBase:此Host的webapps的默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径;可以使用基于$CATALINA_BASE变量所定义的路径的相对路径;
  • (2) autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat;
示例:
<Host name="tc1.magedu.com" appBase="/appdata/webapps"   #webapps的默认存放目录
 unpackWARs="true" autoDeploy="true">#自动部署
</Host>

# mkdir -pv /appdata/webapps #创建存储目录
# mkdir -pv /appdata/webapps/ROOT/{lib,classes,WEB-INF}     #创建目录,站点部署到root路径下

提供一个测试页即可;

8、Context组件:

示例:
<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable="true"/> #访问url路径,然后被指定其他路径上,可以被重新装载

9、Valve组件:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"  #prefix日志前缀,suffix日志为后缀
pattern="%h %l %u %t &quot;%r&quot; %s %b" />#这里&quot是引号的意思,%r用户的请求内容

Valve存在多种类型:
定义访问日志:org.apache.catalina.valves.AccessLogValve
定义访问控制:org.apache.catalina.valves.RemoteAddrValve
tomcat日志路径:/var/log/tomcat/
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172.16.100.67"/>

综合示例:
<Host name="node1.magedu.com" appBase="/web/apps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="node1_access" suffix=".log"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
<Context path="/test" docBase="/tmp/test" reloadable="true">   #访问url为test,文档路径为tmp/test,可以被重新装载
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="node1_test_access_" suffix=".log" #前缀是node1_test_access,后缀是log
pattern="%h %l %u %t &quot;%r&quot; %s %b" />  #记录日志格式
</Context>
</Host>

七、tomcat反代配置

1、LNMT架构

Client (http) --> nginx (reverse proxy)(http) --> tomcat (http connector)

nginx连接器

nginx反代设置:
vim /etc/nginx/conf.d/ilinux.conf
server {
     listen 80;  #监听端口
      server_name www.ilinux.io; #服务名称 
location / {
proxy_pass http://192.168.1.15:80;  #匹配静态内容到后端静态主机的80端口
}

location ~* \.(jsp|do)$ {
proxy_pass http://192.168.1.16:8080; #匹配动态jsp内容到后端Tomcat主机
}

2、LAMT架构

Linux Apache(httpd) MySQL Tomcat
httpd的代理模块:

proxy_module:反代核心模块
proxy_http_module:适配http协议客户端;
proxy_ajp_module:适配ajp协议客户端;

Client (http) --> httpd (proxy_http_module)(http) --> tomcat (http connector)
Client (http) --> httpd (proxy_ajp_module)(ajp) --> tomcat (ajp connector)
Client (http) --> httpd (mod_jk)(ajp) --> tomcat (ajp connector)

http连接器:使用proxy_http_module模块反向代理

#proxy_http_module代理配置示例:
<VirtualHost *:80>  #定义虚拟主机
ServerName      tc1.ilinux.io
ProxyRequests Off   #关闭正向代理
ProxyVia        On     #在响应报文中加via
ProxyPreserveHost On  #请求报文转发到后端
<Proxy *>
    Require all granted #反代功能可以由那些用户使用
</Proxy>
#如果后端有多个虚拟主机,不能使用ip地址
ProxyPass / http://192.168.1.15:8080/ #后端tomcat主机地址端口  
ProxyPassReverse / http://192.168.1.15:8080/ #返回重定向 
<Location />
Require all granted  #此url可以被谁访问
</Location>
</VirtualHost>

ajp连接器:使用proxy_ajp_module代理

#proxy_ajp_module代理配置示例
<VirtualHost *:80>
ServerName      tc1.ilinux.io
ProxyRequests Off#关闭正向代理
ProxyVia        On     #在响应报文中加via
ProxyPreserveHost On
<Proxy *>
Require all granted#反代功能可以由那些用户使用
</Proxy>
#如果后端有多个虚拟主机,不能使用ip地址
ProxyPass / ajp://http://192.168.1.15:8009/  后端tomcat主机地址端口  
ProxyPassReverse / ajp://http://192.168.1.15:8009/
<Location />
Require all granted#此url可以被谁访问
</Location>
</VirtualHost>

八、Tomcat的常用优化配置:

1 、内存空间管理:

image.png
image.png

image.png

编辑/etc/sysconfig/tomcat

 #重要不能超过32G!!!!!!!!!!!
JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= -XX:PermSize= -XX:MaxPermSize=" 
#实验添加:
JAVA_OPTS= "-Xmx512m"  -Xms"512m"

-server:服务器模型
-Xms:堆内存初始化大小;
-Xmx:堆内存空间上限;
-XX:NewSize=:新生代空间初始化大小;
-XX:MaxNewSize=:新生代空间最大值;
-XX:PermSize=:持久代空间初始化大小;
-XX:MaxPermSize=:持久代空间最大值;

2、线程池设置:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

常用属性:
maxThreads:最大线程数;
minSpareThreads:最小空闲线程数;
maxSpareThreads:最大空闲线程数;
acceptCount:等待队列的最大长度;
URIEncoding:URI地址编码格式,建议使用UTF-8;
enableLookups:是否启用dns解析,建议禁用;
compression:是否启用传输压缩机制,建议“on";
compressionMinSize:启用压缩传输的数据流最小值,单位是字节;
compressableMimeType:定义启用压缩功能的MIME类型;
text/html, text/xml, text/css, text/javascript

3)、禁用8005端口;

<Server port="-1" shutdown="SHUTDOWN">

(4) 隐藏版本信息:

<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />

Server="SOME STRING"   #加上自定义字符串

九、JVM常用的分析工具:

JVM的分析工具有:

  • jps:用来查看运行的所有jvm进程;
  • jinfo:查看进程的运行环境参数,主要是jvm命令行参数;
  • jstat:对jvm应用程序的资源和性能进行实时监控;
  • jstack:查看所有线程的运行状态;
  • jmap:查看jvm占用物理内存的状态;
  • jconsole:图形界面,是一个内置 Java 性能分析器,对资源消耗和性能进行监控;
  • jvisualvm:图形界面,用来监控JVM的运行情况的插件;

1、jps工具

jps:Java虚拟机进程状态工具,

格式:
jps [-q] [-mlvV] [<hostid>]
-q:静默模式;
-v:显示传递给jvm的命令行参数;
-m:输出传入main方法的参数;
-l:输出main类或jar完全限定名称;
-V:显示通过flag文件传递给jvm的参数;
[<hostid>]:主机id,默认为localhost;

2、jinfo工具

jinfo:输出给定的java进程的所有配置信息;

格式:
jinfo [option] <pid>
-flags:to print VM flags打印标志位
-sysprops:to print Java system properties
-flag <name>:to print the value of the named VM flag

3、jstack工具

jstack:查看指定的java进程的线程栈的相关信息;

格式:
jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
-l:long listings,会显示额外的锁信息,因此,发生死锁时常用此选项;
-m:混合模式,既输出java堆栈信息,也输出C/C++堆栈信息;
-F:当使用“jstack -l PID"无响应,可以使用-F强制输出信息;

4、jstat工具

jstat:输出指定的java进程的统计信息

格式:
jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

示例:
# jstat -options
-class:class loader
-compiler:JIT
-gc:gc
-gccapacity:统计堆中各代的容量
-gccause:
-gcmetacapacity
-gcnew:新生代
-gcnewcapacity
-gcold:老年代
-gcoldcapacity
-gcutil
-printcompilation

[<interval> [<count>]]
interval:时间间隔,单位是毫秒;
count:显示的次数;

-gc:
YGC:新生代的垃圾回收次数;
YGCT:新生代垃圾回收消耗的时长;
FGC:Full GC的次数;
FGCT:Full GC消耗的时长;
GCT:GC消耗的总时长;

[root@tomcat-77 ~]# jps #查询java进程端口
3552 Jps
3541 Jstat
2296 Bootstrap
3529 Jstat
[root@tomcat-77 ~]# jstat -gc 2296 1000
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
1344.0 1344.0  0.0    36.9  10816.0   4288.3   26984.0    19719.9   25728.0 24993.2 2688.0 2449.0     83    0.201   6      0.184    0.385

5、jmap工具

jmap:Memory Map, 用于查看堆内存的使用状态;
jhat:堆分析工具
格式:

jmap [option] <pid>

查看堆空间的详细信息:

jmap -heap <pid>

查看堆内存中的对象的数目:

jmap -histo[:live] <pid>
live:只统计活动对象;

保存堆内存数据至文件中,而后使用jvisualvm或jhat进行查看:

jmap -dump:<dump-options> <pid>
dump-options:
live         dump only live objects; if not specified, all objects in the heap are dumped.
format=b     binary format
file=<file>  dump heap to <file>

6、jconsole和jvisualvm工具

远程图形工具软件
[root@tomcat-77 ~]# ssh -X root@192.168.1.77
The authenticity of host '192.168.1.77 (192.168.1.77)' can't be established.
ECDSA key fingerprint is SHA256:Pe8fJryVngsVj6R+3J5Vq2Bv5CPbWaZ08m1DwMmV1fc.
ECDSA key fingerprint is MD5:ea:8e:35:b5:c2:eb:cb:b7:8e:6f:55:06:5e:11:cd:9d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.77' (ECDSA) to the list of known hosts.
root@192.168.1.77's password: 
Last login: Sun Oct  7 20:58:43 2018 from 192.168.1.78
[root@tomcat-77 ~]# jconsole
[root@tomcat-77 ~]# jvisualvm
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容