opensips简介

概述

在众多的sip服务器中,主要有俩大类,一类侧重于媒体/业务服务器,比如freeswitch/asterisk,另一类侧重于代理/负载服务器,比如opensips/kamailio。

今天我们对opensips做一个简单介绍。

OpenSIPS 是用于语音、视频、IM、在线状态和任何其他SIP扩展的开源 SIP 代理服务器。

OpenSIPS 是一种多功能、多用途的SIP信令服务器,运营商、电信或 ITSP 将其用于 Class4/5平台、中继、企业/虚拟 PBX 解决方案、会话边界控制器、应用服务器、前端负载等解决方案、IMS 平台、呼叫中心等等。

OpenSIPS 被推荐用于任何类型的 SIP 场景/服务:

1. 高吞吐量 - 数万CPS,数百万个在线呼叫(参见官方测试)

2. 路由和集成的灵活性 - 用于实现自定义路由逻辑的路由脚本,多个接口 API(参见手册)

3. 有效的应用程序构建 - 超过 120 个模块提供功能,用于 SIP 处理、后端操作、集成、路由逻辑(请参阅模块列表)

本章节主要介绍opensips的编译安装、配置启动的通用流程。


开发环境

Centos:CentOS release 6 (Final)或以上版本

opensips:2.4.9

GCC/C++:4.4.7


编译安装

依赖库

yum install -y autoconf automake libtool gcc-c++ ncurses-devel make zlib-devel lynx flex bison mysql pcre python-devel openssl-devel mysql-devel

安装hiredis

git clone https://github.com/redis/hiredis.git hiredis

cd hiredis

make install

源码安装包:

https://opensips.org/pub/opensips/2.4.9/opensips-2.4.9.tar.gz

wget  https://opensips.org/pub/opensips/2.4.9/opensips-2.4.9.tar.gz

tar –zxvf opensips-2.4.9.tar.gz

编译安装:

方法1:

cd  opensips-2.4.9

make include_modules="cachedb_redis db_mysql dialplan python tls_mgm proto_tls proto_ws proto_wss " prefix="/usr/local/opensips" install

方法2:

cd  opensips-2.4.9

make menuconfig

增加 cachedb_redis db_mysql dialplan python tls_mgm proto_tls proto_ws proto_wss 模块编译

修改安装目录为 /usr/local/opensips

保存退出menuconfig

make install


目录结构

默认安装路径为 /usr/local/opensips

编译安装完成后,检查安装目录

opensips

├── etc

│  └── opensips

│      ├── opensips.cfg

│      ├── opensipsctlrc

│      ├── osipsconsolerc

│      ├── scenario_callcenter.xml

│      └── tls

│          ├── ca.conf

│          ├── README

│          ├── request.conf

│          ├── rootCA

│          │  ├── cacert.pem

│          │  ├── certs

│          │  │  └── 01.pem

│          │  ├── index.txt

│          │  ├── private

│          │  │  └── cakey.pem

│          │  └── serial

│          ├── user

│          │  ├── user-calist.pem

│          │  ├── user-cert.pem

│          │  ├── user-cert_req.pem

│          │  └── user-privkey.pem

│          └── user.conf

├── lib64

│  └── opensips

│      ├── modules

│      │  ├── acc.so

│      │  ├── alias_db.so

│      │  ├── auth_aaa.so

│      │  ├── auth_db.so

│      │  ├── auth.so

│      │  ├── avpops.so

│      │  ├── b2b_entities.so

│      │  ├── b2b_sca.so

│      │  ├── benchmark.so

│      │  ├── cachedb_local.so

│      │  ├── cachedb_redis.so

│      │  ├── cachedb_sql.so

│      │  ├── call_center.so

│      │  ├── call_control.so

│      │  ├── cfgutils.so

│      │  ├── clusterer.so

│      │  ├── db_cachedb.so

│      │  ├── db_flatstore.so

│      │  ├── db_mysql.so

│      │  ├── db_text.so

│      │  ├── db_virtual.so

│      │  ├── dialog.so

│      │  ├── dialplan.so

│      │  ├── dispatcher.so

│      │  ├── diversion.so

│      │  ├── dns_cache.so

│      │  ├── domainpolicy.so

│      │  ├── domain.so

│      │  ├── drouting.so

│      │  ├── enum.so

│      │  ├── event_datagram.so

│      │  ├── event_flatstore.so

│      │  ├── event_jsonrpc.so

│      │  ├── event_route.so

│      │  ├── event_routing.so

│      │  ├── event_virtual.so

│      │  ├── event_xmlrpc.so

│      │  ├── exec.so

│      │  ├── fraud_detection.so

│      │  ├── freeswitch_scripting.so

│      │  ├── freeswitch.so

│      │  ├── gflags.so

│      │  ├── group.so

│      │  ├── imc.so

│      │  ├── jsonrpc.so

│      │  ├── load_balancer.so

│      │  ├── mangler.so

│      │  ├── mathops.so

│      │  ├── maxfwd.so

│      │  ├── mediaproxy.so

│      │  ├── mi_datagram.so

│      │  ├── mid_registrar.so

│      │  ├── mi_fifo.so

│      │  ├── mi_http.so

│      │  ├── mi_json.so

│      │  ├── msilo.so

│      │  ├── nathelper.so

│      │  ├── nat_traversal.so

│      │  ├── options.so

│      │  ├── path.so

│      │  ├── peering.so

│      │  ├── permissions.so

│      │  ├── pike.so

│      │  ├── presence_callinfo.so

│      │  ├── presence_xcapdiff.so

│      │  ├── proto_bin.so

│      │  ├── proto_hep.so

│      │  ├── proto_ws.so

│      │  ├── python.so

│      │  ├── qos.so

│      │  ├── ratelimit.so

│      │  ├── registrar.so

│      │  ├── rr.so

│      │  ├── rtpengine.so

│      │  ├── rtpproxy.so

│      │  ├── script_helper.so

│      │  ├── seas.so

│      │  ├── signaling.so

│      │  ├── sipcapture.so

│      │  ├── sip_i.so

│      │  ├── sipmsgops.so

│      │  ├── siptrace.so

│      │  ├── sl.so

│      │  ├── sms.so

│      │  ├── speeddial.so

│      │  ├── sql_cacher.so

│      │  ├── sst.so

│      │  ├── statistics.so

│      │  ├── stun.so

│      │  ├── textops.so

│      │  ├── tls_mgm.so

│      │  ├── tm.so

│      │  ├── topology_hiding.so

│      │  ├── uac_auth.so

│      │  ├── uac_redirect.so

│      │  ├── uac_registrant.so

│      │  ├── uac.so

│      │  ├── uri.so

│      │  ├── userblacklist.so

│      │  └── usrloc.so

│      └── opensipsctl

│          ├── dbtextdb

│          │  └── dbtextdb.py

│          ├── opensipsctl.base

│          ├── opensipsctl.ctlbase

│          ├── opensipsctl.dbtext

│          ├── opensipsctl.fifo

│          ├── opensipsctl.mysql

│          ├── opensipsctl.sqlbase

│          ├── opensipsctl.unixsock

│          ├── opensipsdbctl.base

│          ├── opensipsdbctl.dbtext

│          └── opensipsdbctl.mysql

├── sbin

│  ├── opensips

│  ├── opensipsctl

│  ├── opensipsdbctl

│  ├── opensipsunix

│  ├── osipsconfig

│  └── osipsconsole

└── share

    ├── doc

    │  └── opensips

    │      ├── AUTHORS

    │      ├── INSTALL

    │      ├── NEWS

    │      ├── README

    │      ├── README.acc

    │      ├── README.alias_db

    │      ├── README.auth

    │      ├── README.auth_aaa

    │      ├── README.auth_db

    │      ├── README.avpops

    │      ├── README.b2b_entities

    │      ├── README.b2b_sca

    │      ├── README.benchmark

    │      ├── README.cachedb_local

    │      ├── README.cachedb_redis

    │      ├── README.cachedb_sql

    │      ├── README.call_center

    │      ├── README.call_control

    │      ├── README.cfgutils

    │      ├── README.clusterer

    │      ├── README.db_cachedb

    │      ├── README.db_flatstore

    │      ├── README.db_mysql

    │      ├── README.db_text

    │      ├── README.db_virtual

    │      ├── README.dialog

    │      ├── README.dialplan

    │      ├── README.dispatcher

    │      ├── README.diversion

    │      ├── README.dns_cache

    │      ├── README.domain

    │      ├── README.domainpolicy

    │      ├── README.drouting

    │      ├── README.enum

    │      ├── README.event_datagram

    │      ├── README.event_flatstore

    │      ├── README.event_jsonrpc

    │      ├── README.event_route

    │      ├── README.event_routing

    │      ├── README.event_virtual

    │      ├── README.event_xmlrpc

    │      ├── README.exec

    │      ├── README.fraud_detection

    │      ├── README.freeswitch

    │      ├── README.freeswitch_scripting

    │      ├── README.gflags

    │      ├── README.group

    │      ├── README.imc

    │      ├── README.jsonrpc

    │      ├── README.load_balancer

    │      ├── README.mangler

    │      ├── README.mathops

    │      ├── README.maxfwd

    │      ├── README.mediaproxy

    │      ├── README.mi_datagram

    │      ├── README.mid_registrar

    │      ├── README.mi_fifo

    │      ├── README.mi_http

    │      ├── README.mi_json

    │      ├── README-MODULES

    │      ├── README.msilo

    │      ├── README.nathelper

    │      ├── README.nat_traversal

    │      ├── README.options

    │      ├── README.path

    │      ├── README.peering

    │      ├── README.permissions

    │      ├── README.pike

    │      ├── README.presence_callinfo

    │      ├── README.presence_xcapdiff

    │      ├── README.proto_bin

    │      ├── README.proto_hep

    │      ├── README.proto_ws

    │      ├── README.python

    │      ├── README.qos

    │      ├── README.ratelimit

    │      ├── README.registrar

    │      ├── README.rr

    │      ├── README.rtpengine

    │      ├── README.rtpproxy

    │      ├── README.script_helper

    │      ├── README.seas

    │      ├── README.signaling

    │      ├── README.sipcapture

    │      ├── README.sip_i

    │      ├── README.sipmsgops

    │      ├── README.siptrace

    │      ├── README.sl

    │      ├── README.sms

    │      ├── README.speeddial

    │      ├── README.sql_cacher

    │      ├── README.sst

    │      ├── README.statistics

    │      ├── README.stun

    │      ├── README.textops

    │      ├── README.tls_mgm

    │      ├── README.tm

    │      ├── README.topology_hiding

    │      ├── README.uac

    │      ├── README.uac_auth

    │      ├── README.uac_redirect

    │      ├── README.uac_registrant

    │      ├── README.uri

    │      ├── README.userblacklist

    │      └── README.usrloc

    ├── man

    │  ├── man5

    │  │  └── opensips.cfg.5

    │  └── man8

    │      ├── opensips.8

    │      ├── opensipsctl.8

    │      └── opensipsunix.8

    └── opensips

        ├── dbtext

        │  └── opensips

        │      ├── acc

        │      ├── active_watchers

        │      ├── address

        │      ├── aliases

        │      ├── b2b_entities

        │      ├── b2b_logic

        │      ├── b2b_sca

        │      ├── cachedb

        │      ├── carrierfailureroute

        │      ├── carrierroute

        │      ├── cc_agents

        │      ├── cc_calls

        │      ├── cc_cdrs

        │      ├── cc_flows

        │      ├── closeddial

        │      ├── clusterer

        │      ├── cpl

        │      ├── dbaliases

        │      ├── dialog

        │      ├── dialplan

        │      ├── dispatcher

        │      ├── domain

        │      ├── domainpolicy

        │      ├── dr_carriers

        │      ├── dr_gateways

        │      ├── dr_groups

        │      ├── dr_partitions

        │      ├── dr_rules

        │      ├── emergency_report

        │      ├── emergency_routing

        │      ├── emergency_service_provider

        │      ├── fraud_detection

        │      ├── freeswitch

        │      ├── freeswitch_scripting

        │      ├── globalblacklist

        │      ├── grp

        │      ├── imc_members

        │      ├── imc_rooms

        │      ├── load_balancer

        │      ├── location

        │      ├── missed_calls

        │      ├── presentity

        │      ├── pua

        │      ├── registrant

        │      ├── re_grp

        │      ├── rls_presentity

        │      ├── rls_watchers

        │      ├── route_tree

        │      ├── rtpengine

        │      ├── rtpproxy_sockets

        │      ├── silo

        │      ├── sip_trace

        │      ├── speed_dial

        │      ├── subscriber

        │      ├── tls_mgm

        │      ├── uri

        │      ├── userblacklist

        │      ├── usr_preferences

        │      ├── version

        │      ├── watchers

        │      └── xcap

        ├── menuconfig_templates

        │  ├── opensips_loadbalancer_def.m4

        │  ├── opensips_loadbalancer.m4

        │  ├── opensips_residential_def.m4

        │  ├── opensips_residential.m4

        │  ├── opensips_trunking_def.m4

        │  └── opensips_trunking.m4

        └── mysql

            ├── acc-create.sql

            ├── alias_db-create.sql

            ├── auth_db-create.sql

            ├── avpops-create.sql

            ├── b2b-create.sql

            ├── b2b_sca-create.sql

            ├── cachedb_sql-create.sql

            ├── call_center-create.sql

            ├── carrierroute-create.sql

            ├── closeddial-create.sql

            ├── clusterer-create.sql

            ├── cpl-create.sql

            ├── dialog-create.sql

            ├── dialplan-create.sql

            ├── dispatcher-create.sql

            ├── domain-create.sql

            ├── domainpolicy-create.sql

            ├── drouting-create.sql

            ├── emergency-create.sql

            ├── fraud_detection-create.sql

            ├── freeswitch_scripting-create.sql

            ├── group-create.sql

            ├── imc-create.sql

            ├── load_balancer-create.sql

            ├── msilo-create.sql

            ├── permissions-create.sql

            ├── presence-create.sql

            ├── registrant-create.sql

            ├── rls-create.sql

            ├── rtpengine-create.sql

            ├── rtpproxy-create.sql

            ├── siptrace-create.sql

            ├── speeddial-create.sql

            ├── standard-create.sql

            ├── tls_mgm-create.sql

            ├── uri_db-create.sql

            ├── userblacklist-create.sql

            └── usrloc-create.sql


创建数据库

注意事项:该操作需要保证对应数据库没有创建过

cd  /usr/local/opensips/etc/opensips/

vi  opensipsctlrc

DBENGINE=MYSQL

DBPORT=3306

DBHOST=192.168.0.110

DBNAME=opensips

DBRWUSER=root

DBRWPW="opensips"

DBROOTUSER="root"

执行命令

/usr/local/opensips/sbin/opensipsdbctl  create


防火墙

CENTOS6

iptables  -I  INPUT  1  –p  udp  –dport  5060  –j  ACCEPT

iptables  -I  INPUT  1  –p  tcp  –dport  7443  –j  ACCEPT

service  iptables  save

CENTOS7

firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" port port="5060" protocol="udp" accept'

firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" port port="7443" protocol="tcp" accept'

firewall-cmd --reload


配置日志

修改 /usr/local/opensips/etc/opensips/opensips.cfg

log_facility=LOG_LOCAL0

修改 /etc/rsyslog.conf

local0.*  -/var/log/opensips/opensips.log

新增 /etc/logrotate.d/opensips

/var/log/opensips/opensips.log {

        copytruncate

        noolddir

        size 20M

        rotate 64

        dateext

        dateformat .%Y%m%d.%s

        sharedscripts

        postrotate

                /bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true

        endscript

}

设置定时任务

sudo crontab -e

* * * * *  /usr/sbin/logrotate  /etc/logrotate.d/opensips

重启rsyslog服务

service rsyslog restart


TCP最大连接数限制

用户级别

查看linux系统用户最大打开文件限制

ulimit -n

修改limits.conf

vi /etc/security/limits.conf

* soft nofile 100000

* hard nofile 100000


linux系统级别

查看linux系统对同时打开文件数的硬限制

sysctl -a|grep file-max

修改sysctl.conf

vi /etc/sysctl.conf

fs.file-max = 100000

使sysctl配置立即生效:

sysctl -p


网络端口限制修改,服务器需要作为client时配置

查看linux系统最大追踪TCP连接数量

sysctl -a | grep ipv4.ip_conntrack_max

查看linux系统端口范围

sysctl -a | grep ipv4.ip_local_port_range

修改sysctl.conf

vi /etc/sysctl.conf

net.ipv4.ip_local_port_range = 10240    65535

net.netfilter.nf_conntrack_max = 100000

使sysctl配置立即生效:

sysctl -p

Linux下查看tcp连接数及状态命令:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

统计7443端口连接数

netstat -nat|grep -i "7443"|wc -l

统计已连接上的,状态为established

netstat -na|grep ESTABLISHED|wc -l

查出哪个IP地址连接最多,异常情况需要封IP

netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r

netstat -na|grep SYN|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r


启动脚本

cd  opensips-2.4.9/packaging/redhat_fedora

cp opensips.init /etc/init.d/opensips

chmod 777 /etc/init.d/opensips

sed -i "s/\/usr\/sbin/\/usr\/local\/opensips\/sbin/g" /etc/init.d/opensips

sed -i "s/\/etc\/\$prog/\/usr\/local\/opensips\/etc\/\$prog/g" /etc/init.d/opensips

开机自动启动

useradd -d /usr/local/opensips -s /sbin/nologin opensips

chkconfig --add opensips

chkconfig opensips on


启停命令

启动:

service opensips start

或者

/usr/local/opensips/sbin/opensipsctl  start

后台启动方式,如果启动失败,需要查看log文件

停止:

service opensips stop

或者

/usr/local/opensips/sbin/opensipsctl  stop


常用命令

/usr/local/opensips/sbin/opensips  -C  //检查配置文件是否有错误

/usr/local/opensips/sbin/opensipsctl monitor //opensips运行参数监控

/usr/local/opensips/sbin/opensipsctl ping <uri> //使用OPTION 检测uri

/usr/local/opensips/sbin/opensipsctl dispatcher show //dispatcher模块信息展示


配置文件

当前文档主要描述,opensips作为注册服务器的信令代理和负载节点的配置方法。

/usr/local/opensips/etc/opensips/opensips.cfg

#

# OpenSIPS residential configuration script

#    by OpenSIPS Solutions <team@opensips-solutions.com>

#

# This script was generated via "make menuconfig", from

#  the "Residential" scenario.

# You can enable / disable more features / functionalities by

#  re-generating the scenario with different options.#

#

# Please refer to the Core CookBook at:

#      https://opensips.org/Resources/DocsCookbooks

# for a explanation of possible statements, functions and parameters.

#

####### Global Parameters #########

log_level=3

log_stderror=no

log_facility=LOG_LOCAL0

children=4

/* uncomment the following lines to enable debugging */

#debug_mode=yes

/* uncomment the next line to enable the auto temporary blacklisting of

  not available destinations (default disabled) */

#disable_dns_blacklist=no

/* uncomment the next line to enable IPv6 lookup after IPv4 dns

  lookup failures (default disabled) */

#dns_try_ipv6=yes

/* comment the next line to enable the auto discovery of local aliases

  based on reverse DNS on IPs */

auto_aliases=no

listen=udp:192.168.0.202:5080  # CUSTOMIZE ME

listen=udp:192.168.0.202:5060

#listen = wss:192.168.0.202:7443 use_children 5

tcp_max_connections=4096

user_agent_header="REG-PXY001"

####### Modules Section ########

#set module path

mpath="/usr/local/opensips/lib64/opensips/modules/"

loadmodule "db_mysql.so"

#### SIGNALING module

loadmodule "signaling.so"

#### StateLess module

loadmodule "sl.so"

#### Transaction Module

loadmodule "tm.so"

modparam("tm", "fr_timer", 2)

modparam("tm", "fr_timeout", 5)

modparam("tm", "fr_inv_timeout", 30)

modparam("tm", "restart_fr_on_each_reply", 0)

modparam("tm", "onreply_avp_mode", 1)

#### Record Route Module

loadmodule "rr.so"

/* do not append from tag to the RR (no need for this script) */

modparam("rr", "enable_double_rr", 1)

modparam("rr", "append_fromtag", 1)

loadmodule "dialog.so"

modparam("dialog", "db_url", "mysql://root:123456@localhost/opensips")

#### MAX ForWarD module

loadmodule "maxfwd.so"

loadmodule "textops.so"

#### SIP MSG OPerationS module

loadmodule "sipmsgops.so"

#### FIFO Management Interface

loadmodule "mi_fifo.so"

modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")

modparam("mi_fifo", "fifo_mode", 0666)

#### URI module

loadmodule "uri.so"

modparam("uri", "use_uri_table", 0)

#### USeR LOCation module

loadmodule "usrloc.so"

modparam("usrloc", "nat_bflag", "NAT")

modparam("usrloc", "working_mode_preset", "single-instance-no-db")

#### REGISTRAR module

loadmodule "registrar.so"

modparam("registrar", "tcp_persistent_flag", "TCP_PERSISTENT")

/* uncomment the next line not to allow more than 10 contacts per AOR */

#modparam("registrar", "max_contacts", 10)

#### ACCounting module

loadmodule "acc.so"

/* what special events should be accounted ? */

modparam("acc", "early_media", 0)

modparam("acc", "report_cancels", 0)

/* by default we do not adjust the direct of the sequential requests.

  if you enable this parameter, be sure to enable "append_fromtag"

  in "rr" module */

modparam("acc", "detect_direction", 0)

loadmodule "proto_udp.so"

loadmodule "dispatcher.so"

modparam("dispatcher", "db_url", "mysql://root:123456@localhost/opensips")

modparam("dispatcher", "ds_ping_method", "OPTIONS")

modparam("dispatcher", "ds_ping_interval", 60)

modparam("dispatcher", "ds_probing_threshhold", 2)

modparam("dispatcher", "ds_probing_mode", 1)

loadmodule "load_balancer.so"

modparam("load_balancer", "db_url", "mysql://root:123456@localhost/opensips")

modparam("load_balancer", "probing_method", "OPTIONS")

modparam("load_balancer", "probing_interval", 60)

####### Routing Logic ########

# main request routing logic

route{

        script_trace( 1, "$rm from $si, ruri=$ru", "me");

        if (!mf_process_maxfwd_header("10")) {

                sl_send_reply("483","Too Many Hops");

                exit;

        }

        if (!has_totag()) {

                # initial request

                record_route();

        }

        else {

                # sequential request - obey the indicated route

                loose_route();

                t_relay();

                exit;

        }

        # handle cancel and re-transmissions

        # from now on we have only the initial requests

        # select the node that'll handle the call (load balanced)

        # the method used is different for invite/register requests

        # unknown methods are rejected here

        if ( is_method("CANCEL") ) {

                if ( t_check_trans() )

                        t_relay();

                exit;

        }

        else if(is_method("OPTIONS")) {

            # send reply for each options request

            sl_send_reply("200", "ok");

            exit;

        }

        else if (is_method("INVITE")) {

                xlog("L_INFO", "INFO: this sip message is an invite\n");

                if (!ds_select_dst("1", "1")) {

                        send_reply("503","Service Unavailable");

                        exit;

                }

        }

        else if (is_method("REGISTER")) {

                xlog("L_INFO", "INFO: this sip message is a register\n");

                if (!ds_select_dst("1", "1")) {

                        send_reply("503","Service Unavailable");

                        exit;

                }

        }

        else {

                send_reply("405","Method Not Allowed");

                exit;

        }

        # route the request

        if (!t_relay()) {

                sl_reply_error();

        }

}

增加网关数据

/usr/local/opensips/sbin/opensipsctl dispatcher addgw 1 sip:192.168.0.146:5060 '' 0 50 'fs1' 'reg001'

/usr/local/opensips/sbin/opensipsctl dispatcher addgw 1 sip:192.168.0.150:5060 '' 0 50 'fs2' 'reg002'

sip软终端配置



加载测试

通过sip软终端注册,发起呼叫,测试信令和媒体的连通性。


总结

opensips作为负载均衡的代理网关,性能非常好。

网关常见的功能,我们通过opensips.cfg配置文件的路由脚本基本很容易实现,具体请关注opensips的子模块介绍和接口。



空空如常

求真得真

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容