nginx安裝及配置 & 支持 https

1.nginx概述

Nginx 是一個(gè)免費(fèi)、開源、高性能、輕量級的 HTTP 和反向代理服務(wù)器坊罢,
也是一個(gè)電子郵件(IMAP/POP3)代理服務(wù)器蒜撮,其特點(diǎn)是占有內(nèi)存少赦役,并發(fā)能力強(qiáng)语淘。

Nginx 由內(nèi)核和一系列模塊組成,內(nèi)核提供 Web 服務(wù)的基本功能孩革,
如啟用網(wǎng)絡(luò)協(xié)議岁歉,創(chuàng)建運(yùn)行環(huán)境,接收和分配客戶端請求膝蜈,處理模塊之間的交互锅移。

#nginx模塊
Nginx 的各種功能和操作都由模塊來實(shí)現(xiàn)。Nginx 的模塊從結(jié)構(gòu)上分為:
>> 核心模塊:HTTP 模塊饱搏、EVENT 模塊和 MAIL 模塊非剃。
>> 基礎(chǔ)模塊:HTTP Access 模塊、HTTP FastCGI 模塊推沸、HTTP Proxy 模塊和 HTTP Rewrite 模塊备绽。
>> 第三方模塊:HTTP Upstream Request Hash 模塊券坞、Notice 模塊和 HTTP Access Key 模塊及用戶自己開發(fā)的模塊。

這樣的設(shè)計(jì)使 Nginx 方便開發(fā)和擴(kuò)展肺素,也正因此才使得 Nginx 功能如此強(qiáng)大恨锚。

Nginx 的模塊默認(rèn)編譯進(jìn) Nginx 中,如果需要增加或刪除模塊倍靡,
需要重新編譯 Nginx眠冈,這一點(diǎn)不如 Apache 的動態(tài)加載模塊方便。

如果有需要?jiǎng)討B(tài)加載模塊菌瘫,可以使用由淘寶網(wǎng)發(fā)起的 Web 服務(wù)器 Tengine,
在 Nginx 的基礎(chǔ)上增加了很多高級特性布卡,完全兼容 Nginx雨让,已被國內(nèi)很多網(wǎng)站采用。

#Nginx 有很多擴(kuò)展版本:
>> 開源版 nginx.org
>> 商業(yè)版 NGINX Plus
>> 淘寶網(wǎng)發(fā)起的 Web 服務(wù)器 Tengine
>> 基于 Nginx 和 Lua 的 Web 平臺 OpenResty

2.nginx安裝

https://wiki.ubuntu.org.cn/Nginx (ubuntu安裝nginx)

官網(wǎng) http://nginx.org/

關(guān)鍵模塊

靜態(tài)頁面攔截規(guī)則  location(在server里)
反向代理      proxy_pass(在location里)
負(fù)載均衡      upstream(在server外)

2.1 cd /user/local/software

cd /user/local/software   目錄下(沒有的話,就創(chuàng)建)

2.2 上傳nginx包及高可用包到該目錄下

nginx-1.6.2.tar.gz
keepalived-1.2.18.tar.gz
nginx包.png

2.3 解壓至 /usr/local下

tar -zxf nginx-1.6.2.tar.gz /usr/local

2.4 下載所需要的依賴庫文件:

yum install pcre
yum install pcre-devel
yum install zlib
yum install zlib-devel

2.5 進(jìn)行configure配置

cd nginx-1.6.2 && ./configure --prefix=/usr/local/nginx 

下圖代表成功

nginx安裝成功時(shí)表現(xiàn).png

查看是否報(bào)錯(cuò):
報(bào)錯(cuò)1:error: C compiler cc is not found
解決方案1:
安裝gcc-c++包
命令:yum -y install gcc-c++
-y:所有的詢問均選擇yes

2.6 編譯安裝(cd 到 /usr/local/nginx-1.6.2目錄下)

make && make install

2.7 啟動nginx

cd /usr/local/nginx目錄下: 看到如下4個(gè)目錄
 ....conf 配置文件  
 ... html 網(wǎng)頁文件
 ...logs  日志文件 
 ...sbin  主要二進(jìn)制程序
啟動命令:
/usr/local/nginx/sbin/nginx -s start

2.8 查看是否啟動成功

netstat -ano | grep 80 
或
ps -ef|grep nginx
查看nginx進(jìn)程.png

2.9 關(guān)閉命令

/usr/local/nginx/sbin/nginx -s stop

2.10 重啟命令

/usr/local/nginx/sbin/nginx -s reload

2.11 瀏覽器訪問地址:看到歡迎頁面即可

http://192.168.0.100:80

利用nginx訪問頁面.png

若是失敺薜取:可能為80端口被占用等栖忠。
lsof -i:80查看進(jìn)程pid,然后kill -9 pid即可

2.12 常用命令

nginx -s stop :快速關(guān)閉Nginx,可能不保存相關(guān)信息贸街,并迅速終止web服務(wù)庵寞。
nginx -s quit :平穩(wěn)關(guān)閉Nginx,保存相關(guān)信息薛匪,有安排的結(jié)束web服務(wù)捐川。
nginx -s reload :因改變了Nginx相關(guān)配置,需要重新加載配置而重載逸尖。
nginx -s reopen :重新打開日志文件古沥。
nginx -c filename :為 Nginx 指定一個(gè)配置文件,來代替缺省的娇跟。
nginx -t :不運(yùn)行岩齿,而僅僅測試配置文件。nginx 將檢查配置文件的語法的正確性苞俘,并嘗試打開配置文件中所引用到的文件盹沈。
nginx -v:顯示 nginx 的版本。
nginx -V:顯示 nginx 的版本吃谣,編譯器版本和配置參數(shù)乞封。
nginx反向代理.jpg

3.nginx配置文件

3.1 Nginx 配置語法

>> 配置文件由指令和指令塊構(gòu)成
>> 每條指令以分號(;)結(jié)尾,指令和參數(shù)間以空格符分隔
>> 指令塊以大括號{}將多條指令組織在一起
>> include 語句允許組合多個(gè)配置文件以提高可維護(hù)性
>> 使用 # 添加注釋
>> 使用 $ 定義變量
>> 部分指令的參數(shù)支持正則表達(dá)式

3.2 nginx配置模塊

nginx.conf.png

3.2.1 全局塊

全局配置部分用來配置對整個(gè) Server 都有效的參數(shù)基协。
主要會設(shè)置一些影響 Nginx 服務(wù)器整體運(yùn)行的配置指令歌亲,
包括配置運(yùn)行 Nginx 服務(wù)器的用戶(組)、允許生成的 Worker Process 數(shù)澜驮,
進(jìn)程 PID 存放路徑陷揪、日志存放路徑和類型以及配置文件的引入等。

3.2.2 Events 塊

Events 塊涉及的指令主要影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接,
常用的設(shè)置包括是否開啟對多 Work Process 下的網(wǎng)絡(luò)連接進(jìn)行序列化悍缠,
是否允許同時(shí)接收多個(gè)網(wǎng)絡(luò)連接卦绣,選取哪種事件驅(qū)動模型來處理連接請求,
每個(gè) Word Process 可以同時(shí)支持的最大連接數(shù)等飞蚓。

3.2.3 HTTP 塊

這算是 Nginx 服務(wù)器配置中最頻繁的部分滤港,代理、緩存和日志定義
等絕大多數(shù)功能和第三方模塊的配置都在這里趴拧。 
需要注意的是:HTTP 塊也可以包括 HTTP 全局塊溅漾、Server 塊。

1.HTTP 全局塊
HTTP 全局塊配置的指令包括文件引入著榴、MIME-TYPE 定義添履、
日志自定義、連接超時(shí)時(shí)間脑又、單鏈接請求數(shù)上限等暮胧。

2.Server 塊
這塊和虛擬主機(jī)有密切關(guān)系,虛擬主機(jī)從用戶角度看问麸,和一臺獨(dú)立的硬件主機(jī)是完全一樣的往衷,
該技術(shù)的產(chǎn)生是為了節(jié)省互聯(lián)網(wǎng)服務(wù)器硬件成本。
每個(gè) HTTP 塊可以包括多個(gè) Server 塊严卖,而每個(gè) Server 塊就相當(dāng)于一個(gè)虛擬主機(jī)席舍。
而每個(gè) Server 塊也分為全局 Server 塊,以及可以同時(shí)包含多個(gè) Locaton 塊妄田。
2.1 全局 Server 塊:
也被叫做“虛擬服務(wù)器”部分俺亮,它描述的是一組根據(jù)不同server_name指令邏輯分割的資源,
這些虛擬服務(wù)器響應(yīng) HTTP 請求疟呐,因此都包含在 HTTP 部分脚曾。
最常見的配置是本虛擬機(jī)主機(jī)的監(jiān)聽配置和本虛擬主機(jī)的名稱或 IP 配置。
2.2 Location 塊:
一個(gè) Server 塊可以配置多個(gè) Location 塊启具。
這塊的主要作用是基于 Nginx 服務(wù)器接收到的請求字符串(例如 server_name/uri-string)本讥,
對虛擬主機(jī)名稱 (也可以是 IP 別名)之外的字符串(例如前面的 /uri-string)進(jìn)行匹配,對特定的請求進(jìn)行處理鲁冯。
地址定向拷沸、數(shù)據(jù)緩存和應(yīng)答控制等功能,還有許多第三方模塊的配置也在這里進(jìn)行薯演。

3.3 nginx配置文件詳解

#定義Nginx運(yùn)行的用戶和用戶組
user www www; 

#nginx進(jìn)程數(shù)撞芍,<=CPU數(shù) 
worker_processes 4; 

#全局錯(cuò)誤日志定義類型,[debug | info | notice | warn | error | crit]
#error_log  /data/nginx/logs/error.log;
#error_log  /data/nginx/logs/error.log  notice;

#日志文件存放路徑 access_log path [format [buffer=size | off]]
access_log /data/nginx/logs/lazyegg.com/web/access.log combinedio;

#進(jìn)程pid文件
#pid        logs/nginx.pid;

#指定進(jìn)程可以打開的最大描述符:數(shù)目
#工作模式與連接數(shù)上限
##這個(gè)指令是指當(dāng)一個(gè)nginx進(jìn)程打開的最多文件描述符數(shù)目跨扮,理論值應(yīng)該是最多打開文件數(shù)(ulimit -n)與nginx進(jìn)程數(shù)相除序无,但是nginx分配請求并不是那么均勻验毡,所以最好與ulimit -n 的值保持一致。
#這是因?yàn)閚ginx調(diào)度時(shí)分配請求到進(jìn)程并不是那么的均衡帝嗡,所以假如填寫10240晶通,總并發(fā)量達(dá)到3-4萬時(shí)就有進(jìn)程可能超過10240了,這時(shí)會返回502錯(cuò)誤哟玷。
worker_rlimit_nofile 65535;

#################################  events  ###############################
events {
    accept_mutex [on|off] #on時(shí),可以避免驚群效應(yīng)狮辽。是否打開Ningx的負(fù)載均衡鎖;此鎖能夠讓多個(gè)worker進(jìn)輪流地巢寡、序列化地與新的客戶端建立連接喉脖;而通常當(dāng)一個(gè)worker進(jìn)程的負(fù)載達(dá)到其上限的7/8,master就盡可能不再將請求調(diào)度此worker抑月;
    lock_file /path/to/lock_file;#lock文件
    accept_mutex_delay #ms; accept鎖模式中动看,一個(gè)worker進(jìn)程為取得accept鎖的等待時(shí)長;如果某worker進(jìn)程在某次試圖取得鎖時(shí)失敗了爪幻,至少要等待#ms才能再一次請求鎖;
    multi_accept on|off;#是否允許一次性地響應(yīng)多個(gè)用戶請求须误;默認(rèn)為Off;
    use [epoll|rtsig|select|poll];#定義使用的事件模型挨稿,建議讓nginx自動選擇;
    worker_connections  1024;#每個(gè)進(jìn)程最大連接數(shù)(最大連接=連接數(shù)x進(jìn)程數(shù))每個(gè)worker允許同時(shí)產(chǎn)生多少個(gè)鏈接京痢,默認(rèn)1024
    
    #keepalive 超時(shí)時(shí)間
    keepalive_timeout 60;

    #客戶端請求頭部的緩沖區(qū)大小奶甘。
    client_header_buffer_size 4k;

    #這個(gè)將為打開文件指定緩存,默認(rèn)是沒有啟用的祭椰,max指定緩存數(shù)量臭家,建議和打開文件數(shù)一致,inactive是指經(jīng)過多長時(shí)間文件沒被請求后刪除緩存方淤。
    open_file_cache max=65535 inactive=60s;
    #這個(gè)是指多長時(shí)間檢查一次緩存的有效信息钉赁。
    open_file_cache_valid 80s;
        #open_file_cache指令中的inactive參數(shù)時(shí)間內(nèi)文件的最少使用次數(shù),如果超過這個(gè)數(shù)字携茂,文件描述符一直是在緩存中打開的你踩,如上例,如果有一個(gè)文件在inactive時(shí)間內(nèi)一次沒被使用讳苦,它將被移除带膜。
    open_file_cache_min_uses 1;

    #語法:open_file_cache_errors on | off 默認(rèn)值:open_file_cache_errors off 使用字段:http, server, location 這個(gè)指令指定是否在搜索一個(gè)文件是記錄cache錯(cuò)誤.
    open_file_cache_errors on;
}

##############################   http    ##################################

#設(shè)定http服務(wù)器,利用它的反向代理功能提供負(fù)載均衡支持
http{
    #文件擴(kuò)展名與文件類型映射表
    include mime.types;

    #默認(rèn)文件類型
    default_type application/octet-stream;

    #默認(rèn)編碼
    charset utf-8;

    #服務(wù)器名字的hash表大小
    server_names_hash_bucket_size 128;

    #客戶端請求頭部的緩沖區(qū)大小鸳谜。
    client_header_buffer_size 32k;

    #客戶請求頭緩沖大小膝藕。
    large_client_header_buffers 4 64k;

    #允許客戶端請求的最大單個(gè)文件字節(jié)數(shù)
    client_max_body_size 8m;

    #開啟高效文件傳輸模式,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來輸出文件咐扭,對于普通應(yīng)用設(shè)為 on芭挽,如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用滑废,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度览绿,降低系統(tǒng)的負(fù)載策严。注意:如果圖片顯示不正常把這個(gè)改成off。
    sendfile on;

    #開啟目錄列表訪問饿敲,適合下載服務(wù)器妻导,默認(rèn)關(guān)閉。
    autoindex on;

    #此選項(xiàng)允許或禁止使用socke的TCP_CORK的選項(xiàng)怀各,此選項(xiàng)僅在使用sendfile的時(shí)候使用
    tcp_nopush on;

    tcp_nodelay on;

    #長連接超時(shí)時(shí)間倔韭,單位是秒
    keepalive_timeout 120;

    #FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用,提高訪問速度瓢对。下面參數(shù)看字面意思都能理解寿酌。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模塊設(shè)置
    gzip on; #開啟gzip壓縮輸出
    gzip_min_length 1k;    #最小壓縮文件大小
    gzip_buffers 4 16k;    #壓縮緩沖區(qū)
    gzip_http_version 1.0; #壓縮版本(默認(rèn)1.1,前端如果是squid2.5請使用1.0)
    gzip_comp_level 2;     #壓縮等級
    gzip_types text/plain application/x-javascript text/css application/xml;    #壓縮類型硕蛹,默認(rèn)就已經(jīng)包含textml醇疼,所以下面就不用再寫了,寫上去也不會有問題法焰,但是會有一個(gè)warn秧荆。
    gzip_vary on;

    #開啟限制IP連接數(shù)的時(shí)候需要使用
    #limit_zone crawler $binary_remote_addr 10m;

    #日志文件輸出格式 這個(gè)位置相于全局設(shè)置
    #$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
    #$remote_user:用來記錄客戶端用戶名稱埃仪;
    #$time_local: 用來記錄訪問時(shí)間與時(shí)區(qū)乙濒;
    #$request: 用來記錄請求的url與http協(xié)議;
    #$status: 用來記錄請求狀態(tài)卵蛉;成功是200颁股,
    #$body_bytes_sent :記錄發(fā)送給客戶端文件主體內(nèi)容大小傻丝;
    #$http_referer:用來記錄從那個(gè)頁面鏈接訪問過來的甘有;
    #$http_user_agent:記錄客戶瀏覽器的相關(guān)信息;
    #通常web服務(wù)器放在反向代理的后面葡缰,這樣就不能獲取到客戶的IP地址了梧疲,通過$remote_add拿到的IP地址是反向代理服務(wù)器的iP地址。反向代理服務(wù)器在轉(zhuǎn)發(fā)請求的http頭信息中运准,可以增加x_forwarded_for信息幌氮,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務(wù)器地址。
    log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';

    #負(fù)載均衡配置
    upstream lazyegg.net {

        #upstream的負(fù)載均衡胁澳,weight是權(quán)重该互,可以根據(jù)機(jī)器配置定義權(quán)重。weigth參數(shù)表示權(quán)值韭畸,權(quán)值越高被分配到的幾率越大宇智。
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;

        #nginx的upstream目前支持4種方式的分配
        #1蔓搞、輪詢(默認(rèn))
        #每個(gè)請求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉随橘,能自動剔除喂分。
        #2、weight
        #指定輪詢權(quán)重机蔗,weight和訪問比率成正比蒲祈,用于后端服務(wù)器性能不均的情況。
        #例如:
        #upstream bakend {
        #    server 192.168.0.14 weight=10;
        #    server 192.168.0.15 weight=10;
        #}
        #2萝嘁、ip_hash
        #每個(gè)請求按訪問ip的hash結(jié)果分配梆掸,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器,可以解決session的問題牙言。
        #例如:
        #upstream bakend {
        #    ip_hash;
        #    server 192.168.0.14:88;
        #    server 192.168.0.15:80;
        #}
        #3酸钦、fair(第三方)
        #按后端服務(wù)器的響應(yīng)時(shí)間來分配請求,響應(yīng)時(shí)間短的優(yōu)先分配咱枉。
        #upstream backend {
        #    server server1;
        #    server server2;
        #    fair;
        #}
        #4卑硫、url_hash(第三方)
        #按訪問url的hash結(jié)果來分配請求,使每個(gè)url定向到同一個(gè)后端服務(wù)器蚕断,后端服務(wù)器為緩存時(shí)比較有效拔恰。
        #例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數(shù)基括,hash_method是使用的hash算法
        #upstream backend {
        #    server squid1:3128;
        #    server squid2:3128;
        #    hash $request_uri;
        #    hash_method crc32;
        #}

        #tips:
        #upstream bakend{#定義負(fù)載均衡設(shè)備的Ip及設(shè)備狀態(tài)}{
        #    ip_hash;
        #    server 127.0.0.1:9090 down;
        #    server 127.0.0.1:8080 weight=2;
        #    server 127.0.0.1:6060;
        #    server 127.0.0.1:7070 backup;
        #}
        #在需要使用負(fù)載均衡的server中增加 proxy_pass http://bakend/;

        #每個(gè)設(shè)備的狀態(tài)設(shè)置為:
        #1.down表示單前的server暫時(shí)不參與負(fù)載
        #2.weight為weight越大,負(fù)載的權(quán)重就越大财岔。
        #3.max_fails:允許請求失敗的次數(shù)默認(rèn)為1.當(dāng)超過最大次數(shù)時(shí)风皿,返回proxy_next_upstream模塊定義的錯(cuò)誤
        #4.fail_timeout:max_fails次失敗后,暫停的時(shí)間匠璧。
        #5.backup: 其它所有的非backup機(jī)器down或者忙的時(shí)候桐款,請求backup機(jī)器。所以這臺機(jī)器壓力會最輕夷恍。

        #nginx支持同時(shí)設(shè)置多組的負(fù)載均衡魔眨,用來給不用的server來使用。
        #client_body_in_file_only設(shè)置為On 可以講client post過來的數(shù)據(jù)記錄到文件中用來做debug
        #client_body_temp_path設(shè)置記錄文件的目錄 可以設(shè)置最多3層目錄
        #location對URL進(jìn)行匹配.可以進(jìn)行重定向或者進(jìn)行新的代理 負(fù)載均衡
    }

       #虛擬主機(jī)的配置
    server {
        #監(jiān)聽端口
        listen 80;

        #域名可以有多個(gè)酿雪,用空格隔開
        server_name lazyegg.net;
        #默認(rèn)入口文件名稱
        index index.html index.htm index.php;
        root /data/www/lazyegg;

        #對******進(jìn)行負(fù)載均衡
        location ~ .*.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }

        #圖片緩存時(shí)間設(shè)置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 10d;
        }

        #JS和CSS緩存時(shí)間設(shè)置
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }

        #定義本虛擬主機(jī)的訪問日志
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;

        #對 "/connect-controller" 啟用反向代理
        location /connect-controller {
            proxy_pass http://127.0.0.1:88; #請注意此處端口號不能與虛擬主機(jī)監(jiān)聽的端口號一樣(也就是server監(jiān)聽的端口)
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;

            #后端的Web服務(wù)器可以通過X-Forwarded-For獲取用戶真實(shí)IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            #以下是一些反向代理的配置遏暴,可選。
            proxy_set_header Host $host;

            #允許客戶端請求的最大單文件字節(jié)數(shù)
            client_max_body_size 10m;

            #緩沖區(qū)代理緩沖用戶端請求的最大字節(jié)數(shù)指黎,
            #如果把它設(shè)置為比較大的數(shù)值朋凉,例如256k,那么醋安,無論使用firefox還是IE瀏覽器杂彭,來提交任意小于256k的圖片墓毒,都很正常。如果注釋該指令亲怠,使用默認(rèn)的client_body_buffer_size設(shè)置所计,也就是操作系統(tǒng)頁面大小的兩倍,8k或者16k团秽,問題就出現(xiàn)了主胧。
            #無論使用firefox4.0還是IE8.0,提交一個(gè)比較大徙垫,200k左右的圖片讥裤,都返回500 Internal Server Error錯(cuò)誤
            client_body_buffer_size 128k;

            #表示使nginx阻止HTTP應(yīng)答代碼為400或者更高的應(yīng)答。
            proxy_intercept_errors on;

            #后端服務(wù)器連接的超時(shí)時(shí)間_發(fā)起握手等候響應(yīng)超時(shí)時(shí)間
            #nginx跟后端服務(wù)器連接超時(shí)時(shí)間(代理連接超時(shí))
            proxy_connect_timeout 90;

            #后端服務(wù)器數(shù)據(jù)回傳時(shí)間(代理發(fā)送超時(shí))
            #后端服務(wù)器數(shù)據(jù)回傳時(shí)間_就是在規(guī)定時(shí)間之內(nèi)后端服務(wù)器必須傳完所有的數(shù)據(jù)
            proxy_send_timeout 90;

            #連接成功后姻报,后端服務(wù)器響應(yīng)時(shí)間(代理接收超時(shí))
            #連接成功后_等候后端服務(wù)器響應(yīng)時(shí)間_其實(shí)已經(jīng)進(jìn)入后端的排隊(duì)之中等候處理(也可以說是后端服務(wù)器處理請求的時(shí)間)
            proxy_read_timeout 90;

            #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
            #設(shè)置從被代理服務(wù)器讀取的第一部分應(yīng)答的緩沖區(qū)大小斩个,通常情況下這部分應(yīng)答中包含一個(gè)小的應(yīng)答頭撑蚌,默認(rèn)情況下這個(gè)值的大小為指令proxy_buffers中指定的一個(gè)緩沖區(qū)的大小,不過可以將其設(shè)置為更小
            proxy_buffer_size 4k;

            #proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的設(shè)置
            #設(shè)置用于讀取應(yīng)答(來自被代理服務(wù)器)的緩沖區(qū)數(shù)目和大小哥力,默認(rèn)情況也為分頁大小,根據(jù)操作系統(tǒng)的不同可能是4k或者8k
            proxy_buffers 4 32k;

            #高負(fù)荷下緩沖大屑炙洹(proxy_buffers*2)
            proxy_busy_buffers_size 64k;

            #設(shè)置在寫入proxy_temp_path時(shí)數(shù)據(jù)的大小足绅,預(yù)防一個(gè)工作進(jìn)程在傳遞文件時(shí)阻塞太長
            #設(shè)定緩存文件夾大小,大于這個(gè)值笆焰,將從upstream服務(wù)器傳
            proxy_temp_file_write_size 64k;
            #返回根路徑地址(相對路徑:相對于/usr/local/nginx/)
            root   html;
            #默認(rèn)訪問文件
            index  index.html index.htm;
        }

        #本地動靜分離反向代理配置
        #所有jsp的頁面均交由tomcat或resin處理
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }
    }
    
    # HTTPS server
    server {
        listen       443 ssl; # 監(jiān)聽443端口
        server_name  www.zy.com; # 定義使用www.zy.com訪問

        ssl_certificate      cert.pem;  # ssl證書文件位置
        ssl_certificate_key  cert.key;  # ssl證書key的位置

        # ssl配置參數(shù)(可選)
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        # 數(shù)字簽名
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }   
}

3.4 Nginx 配置:動靜分離

Nginx 動靜分離簡單來說就是把動態(tài)跟靜態(tài)請求分開劫谅,
不能理解成只是單純的把動態(tài)頁面和靜態(tài)頁面物理分離。

嚴(yán)格意義上說應(yīng)該是動態(tài)請求跟靜態(tài)請求分開嚷掠,
可以理解成使用 Nginx 處理靜態(tài)頁面捏检,Tomcat 處理動態(tài)頁面。

動靜分離從目前實(shí)現(xiàn)角度來講大致分為兩種:
>> 純粹把靜態(tài)文件獨(dú)立成單獨(dú)的域名不皆,放在獨(dú)立的服務(wù)器上贯城,也是目前主流推崇的方案; 
>> 動態(tài)跟靜態(tài)文件混合在一起發(fā)布霹娄,通過 Nginx 來分開能犯。 

通過 Location 指定不同的后綴名實(shí)現(xiàn)不同的請求轉(zhuǎn)發(fā)。
通過 Expires 參數(shù)設(shè)置犬耻,可以使瀏覽器緩存過期時(shí)間踩晶,減少與服務(wù)器之前的請求和流量。

具體 Expires 定義:
是給一個(gè)資源設(shè)定一個(gè)過期時(shí)間枕磁,也就是說無需去服務(wù)端驗(yàn)證合瓢,
直接通過瀏覽器自身確認(rèn)是否過期即可, 所以不會產(chǎn)生額外的流量透典。

此種方法非常適合不經(jīng)常變動的資源(如果經(jīng)常更新的文件晴楔, 不建議使用 Expires 來緩存)顿苇。

以設(shè)置 3d 為例,表示在這 3 天之內(nèi)訪問這個(gè) URL税弃,發(fā)送一個(gè)請求纪岁,
比對服務(wù)器該文件最后更新時(shí)間沒有變化,則不會從服務(wù)器抓取则果,
返回狀態(tài)碼 304幔翰,如果有修改,則直接從服務(wù)器重新下載西壮,返回狀態(tài)碼 200遗增。

步驟大致為

#1.服務(wù)器找個(gè)目錄存放自己的靜態(tài)文件

#2.修改 nginx.conf
server {
    listen       80;
    server_name  localhost;
    location /static/ {
        root   /usr/data/www;
    }
    location /image/ {
         root /usr/data/;
         autoindex on;
    }
}

#3.重新加載配置文件
nginx -s reload

3.5 Nginx 的 rewrite 配置

http://www.reibang.com/p/a8261a1a64f8

4.正則表達(dá)式

字符 描述
~ 區(qū)分大小寫匹配
~* 不區(qū)分大小寫匹配
!~ 區(qū)分大小寫不匹配
!~* 不區(qū)分大小寫不匹配
-f及!-f 判斷是否存在文件
-d和!-d 判斷是否存在目錄
-e和!-e 判斷是否存在文件或目錄
-x和!-x 判斷文件是否可執(zhí)行
\ 將后面接著的字符標(biāo)記為一個(gè)特殊字符或一個(gè)原義字符或一個(gè)向后引用。如“\n”匹配一個(gè)換行符款青,而“$”則匹配“$”
^ 匹配輸入字符串的起始位置
$ 匹配輸入字符串的結(jié)束位置
* 匹配前面的字符零次或多次做修。如“ol*”能匹配“o”及“ol”、“oll”
+ 匹配前面的字符一次或多次抡草。如“ol+”能匹配“ol”及“oll”饰及、“oll”,但不能匹配“o”
? 匹配前面的字符零次或一次康震,例如“do(es)?”能匹配“do”或者“does”燎含,"?"等效于"{0,1}"
. 匹配除“\n”之外的任何單個(gè)字符
.\n 匹配包括“\n”在內(nèi)的任意字符,請使用諸如之類的模式腿短。
(pattern) 匹配括號內(nèi)pattern并可以在后面獲取對應(yīng)的匹配屏箍,常用0...9屬性獲取小括號中的匹配內(nèi)容,要匹配圓括號字符需要(Content)

5.nginx中的server_name與listen詳解

"server_name:"

可以設(shè)置基于域名的虛擬主機(jī), 不同的域名會通過請求頭的Host字段, 
匹配到特定的server塊, 轉(zhuǎn)發(fā)到對應(yīng)的虛擬主機(jī)

server_name在收到請求后的匹配邏輯和location的匹配邏輯類似
(支持正則匹配; 支持多域名匹配, 多域名間以空格分開)

5.1 假設(shè)將某一個(gè)server的端口修改為8081

listen配置.png
cd 到/etc/sysconfig/下,找到iptables文件,添加如下一行,端口放行記錄
開啟某端口.png
保存退出后(centos7執(zhí)行下述命令)
systemctl restart iptables.service #重啟防火墻使配置生效
systemctl enable iptables.service #設(shè)置防火墻開機(jī)啟動
訪問[http://192.168.0.100:80](http://192.168.1.172/)81即可

5.2 安全加固 (此處有大坑)

此處若是在某個(gè)server的listen上同時(shí)加上ip及端口,則其優(yōu)先級更高
另一個(gè)不加ip的server, 無法生效
listen是socket層面的事情赴魁,而server_name只是url的解析,
當(dāng)然只有監(jiān)聽到的請求才能被解析鹦付,于是這就回到了一個(gè)tcp監(jiān)聽端口的問題:
如果serverA監(jiān)聽不指定ip,則相當(dāng)于監(jiān)聽0.0.0.0:port择卦,
ServerB監(jiān)聽指定ip1:port敲长,此時(shí)如果請求指定ip1必然會被ServerB接收到并處理,
可以通過(netstat或者lsof等工具檢查nginx進(jìn)程的端口綁定情況)
server {
  listen 192.168.0.100:8080; # 將listen處設(shè)置為nginx所在服務(wù)器的ip及端口
}

server {
  listen 8081; # 上一個(gè)server配置完, 這里將無法生效...(坑坑坑)
}

6.nginx配置ssl證書 --> 支持 https訪問

6.1 生成證書

6.1.1 生成證書方法1:

在nginx.conf同級目錄下 ---> 執(zhí)行下述命令

mkdir nginx-ssl
cd nginx-ssl
# 生成一個(gè) 私鑰, 生成該私鑰時(shí), 會讓輸入密碼, 比如 123456
openssl genrsa -aes128 -out cert.key 2048
# 如果后續(xù)再使用此文件, 需要重復(fù)輸入上一步設(shè)置的密碼, 那么可以執(zhí)行下述命令實(shí)現(xiàn)免密
openssl rsa -in cert.key -out cert.key
# 創(chuàng)建服務(wù)器證書的申請文件 cert.csr, 
# 其中Country Name填CN,Common Name填主機(jī)名也可以不填,如果不填瀏覽器會認(rèn)為不安全.
# (例如你以后的url為https://zy.com/xxxx....這里就可以填 zy.com),其他的都可以不填.
openssl req -new -key cert.key -out cert.csr
# 生成一個(gè) CA 證書請求
openssl req -new -x509 -key cert.key -out ca.crt -days 3650
# 自己簽發(fā)證書: 創(chuàng)建自當(dāng)前日期起有效期為期十年的服務(wù)器證書 cert.pem
openssl x509 -req -days 3650 -in cert.csr -CA ca.crt -CAkey cert.key -CAcreateserial -out cert.pem


此時(shí),共生成5個(gè)文件(cert.key, cert.pem --> 這倆文件配置到 nginx 中):
ca.crt
ca.srl
cert.csr
cert.key
cert.pem

6.1.2 Let's Encrypt

https://letsencrypt.org/zh-cn/getting-started/

通常秉继,如果網(wǎng)站需要支持 HTTPS 協(xié)議祈噪,網(wǎng)站管理員則要從 SSL 證書供應(yīng)商處購買 SSL 證書,Let's Encrypt 除外尚辑。

Let's Encrypt 是一個(gè)免費(fèi)辑鲤、開放,自動化的證書頒發(fā)機(jī)構(gòu)杠茬,由 ISRG(Internet Security Research Group)運(yùn)作月褥。
ISRG 是一個(gè)關(guān)注網(wǎng)絡(luò)安全的公益組織弛随,其贊助商包括 
Mozilla、Akamai宁赤、Cisco舀透、EFF、Chrome决左、IdenTrust愕够、Facebook等公司。
ISRG 的目的是消除資金和技術(shù)領(lǐng)域的障礙佛猛,全面推進(jìn)網(wǎng)站從HTTP到HTTPS過度的進(jìn)程惑芭。

目前,包括FireFox继找、Chrome在內(nèi)的主流瀏覽器都支持Let's Encrypt證書遂跟,
已經(jīng)有不少用戶在真實(shí)項(xiàng)目中使用Let's Encrypt證書。
Let's Encrypt免費(fèi)SSL證書的有效期是90天码荔,到期后可以再續(xù)期漩勤,這樣也就可以變相長期使用了。 

6.1.3 直接購買

由GlobalSign缩搅、GeoTrust越败、Verisign等全球公認(rèn)的數(shù)字證書頒發(fā)機(jī)構(gòu)頒發(fā)的SSL證書。
或國內(nèi)相關(guān)代理廠商也可.

https://www.globalsign.com/
https://www.geotrust.com/
http://www.verisign.com/

6.2 在server塊中配置 ssl 的支持

server {
    listen       443 ssl; # 監(jiān)聽443端口
    server_name  localhost; # 定義使用www.zy.com訪問
    
    ssl on;
    #證書及秘鑰配置
    ssl_certificate      /etc/nginx/nginx-ssl/cert.pem;  # ssl證書文件位置
    ssl_certificate_key  /etc/nginx/nginx-ssl/cert.key;  # ssl證書key的位置
    ssl_protocols TLSv1.1 TLSv1.2 SSLv2 SSLv3; # 支持的 TLS/SSL 協(xié)議
    #數(shù)字簽名
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers on;
    #ssl_verify_client on; #雙向認(rèn)證
    #ssl_client_certificate ca.crt;#雙向認(rèn)證

    # ssl配置參數(shù)(可選)
    #ssl_session_cache    shared:SSL:1m;
    #ssl_session_timeout  5m;

    location / {
        root   html;
        index  index.html index.htm;
    }
}

nginx -s reload重新加載配置文件或重啟nginx即可

https訪問.png

6.3 常見問題

6.3.1 生成秘鑰時(shí), 輸入了密碼, 導(dǎo)致重啟nginx后, 報(bào)錯(cuò)如下:

密碼錯(cuò)誤.png
解決方案:
參考 6.1.1 中生成秘鑰后的下一步. (即實(shí)現(xiàn)免密功能)

7.nginx 原理及參數(shù)優(yōu)化配置

7.1概述

Nginx 默認(rèn)采用多進(jìn)程工作方式硼瓣,Nginx 啟動后究飞,會運(yùn)行一個(gè) Master 進(jìn)程和多個(gè) Worker 進(jìn)程。

其中 Master 充當(dāng)整個(gè)進(jìn)程組與用戶的交互接口堂鲤,同時(shí)對進(jìn)程進(jìn)行監(jiān)護(hù)亿傅,
管理 Worker 進(jìn)程來實(shí)現(xiàn)重啟服務(wù)、平滑升級瘟栖、更換日志文件葵擎、配置文件實(shí)時(shí)生效等功能。

Worker 用來處理基本的網(wǎng)絡(luò)事件半哟,Worker 之間是平等的酬滤,他們共同競爭來處理來自客戶端的請求。

7.2 master-workers 的機(jī)制

Nginx-Master-Worker.jpg
#master-workers 的機(jī)制的好處?
可以使用 nginx-s reload 熱部署寓涨。
每個(gè) Worker 是獨(dú)立的進(jìn)程盯串,不需要加鎖,省掉了鎖帶來的開銷戒良。
采用獨(dú)立的進(jìn)程体捏,可以讓互相之間不會影響,一個(gè)進(jìn)程退出后,
其他進(jìn)程還在工作几缭,服務(wù)不會中斷河泳,Master 進(jìn)程則很快啟動新的 Worker 進(jìn)程。

#需要設(shè)置多少個(gè) Worker奏司?
Nginx 同 Redis 類似都采用了 IO 多路復(fù)用機(jī)制乔询,每個(gè) Worker 都是一個(gè)獨(dú)立的進(jìn)程,
但每個(gè)進(jìn)程里只有一個(gè)主線程韵洋,通過異步非阻塞的方式來處理請求竿刁,即使是成千上萬個(gè)請求也不在話下。
每個(gè) Worker 的線程可以把一個(gè) CPU 的性能發(fā)揮到極致搪缨。
所以 Worker 數(shù)和服務(wù)器的 CPU 數(shù)相等是最為適宜的食拜。
設(shè)少了會浪費(fèi) CPU,設(shè)多了會造成 CPU 頻繁切換上下文帶來的損耗副编。
[
#設(shè)置 worker 數(shù)量负甸。
 worker_processes 4 
#work 綁定 cpu(4 work 綁定 4cpu)。 
 worker_cpu_affinity 0001 0010 0100 1000 
#work 綁定 cpu (4 work 綁定 8cpu 中的 4 個(gè)) 痹届。 
 worker_cpu_affinity 0000001 00000010 00000100 00001000
]
連接數(shù) worker_connection:這個(gè)值是表示每個(gè) Worker 進(jìn)程所能建立連接的最大值呻待。
所以,一個(gè) Nginx 能建立的最大連接數(shù)队腐,應(yīng)該是 worker_connections * worker_processes蚕捉。
>> 對于 HTTP 請求本地資源來說,能夠支持的最大并發(fā)數(shù)量是 
worker_connections * worker_processes柴淘,
>> 對于 HTTP 1.1 的瀏覽器每次訪問要占兩個(gè)連接迫淹。所以普通的靜態(tài)訪問最大并發(fā)數(shù)是
worker_connections * worker_processes / 2。
>> 如果是 HTTP 作為反向代理來說为严,最大并發(fā)數(shù)量應(yīng)該是 
worker_connections * worker_processes / 4敛熬。
因?yàn)樽鳛榉聪虼矸?wù)器,每個(gè)并發(fā)會建立與客戶端的連接和與后端服務(wù)的連接第股,會占用兩個(gè)連接应民。
Nginx 請求處理流程.jpg

7.3 Nginx 是如何實(shí)現(xiàn)高并發(fā)的?

Nginx 采用的是多進(jìn)程(單線程)&多路 IO 復(fù)用模型夕吻,異步诲锹,非阻塞。

一個(gè)主進(jìn)程Master梭冠,多個(gè)工作進(jìn)程Worker辕狰,
每個(gè)Worker進(jìn)程可以處理多個(gè)請求 改备,
Master 進(jìn)程主要負(fù)責(zé)收集控漠、分發(fā)請求。

每當(dāng)一個(gè)請求過來時(shí),Master 就拉起一個(gè) Worker 進(jìn)程負(fù)責(zé)處理這個(gè)請求盐捷。
同時(shí) Master 進(jìn)程也負(fù)責(zé)監(jiān)控 Woker 的狀態(tài)偶翅,保證高可靠性。

Nginx的 Work 進(jìn)程碉渡,為了應(yīng)對高并發(fā)場景聚谁,采取了Reactor模型(也就是 I/O 多路復(fù)用,NIO)滞诺。

I/O 多路復(fù)用模型:
在 I/O 多路復(fù)用模型中形导,最重要的系統(tǒng)調(diào)用函數(shù)就是Select(其他的還有epoll等)。
該方法能夠同時(shí)監(jiān)控多個(gè)文件描述符的可讀可寫情況(每一個(gè)網(wǎng)絡(luò)連接其實(shí)都對應(yīng)一個(gè)文件描述符)习霹,
當(dāng)其中的某些文件描述符可讀或者可寫時(shí)朵耕,Select 方法就會返回可讀以及可寫的文件描述符個(gè)數(shù)。

Work 進(jìn)程使用 I/O 多路復(fù)用模塊同時(shí)監(jiān)聽多個(gè) FD(文件描述符)淋叶,
當(dāng) Accept阎曹、Read、Write 和 Close 事件產(chǎn)生時(shí)煞檩,操作系統(tǒng)就會回調(diào) FD 綁定的事件處理器处嫌。
這時(shí)候 Work 進(jìn)程再去處理相應(yīng)事件,而不是阻塞在某個(gè)請求連接上等待斟湃。
這樣就可以實(shí)現(xiàn)一個(gè)進(jìn)程同時(shí)處理多個(gè)連接熏迹。
每一個(gè) Worker 進(jìn)程通過 I/O 多路復(fù)用處理多個(gè)連接請求。

為了減少進(jìn)程切換(需要系統(tǒng)調(diào)用)的性能損耗桐早,
一般設(shè)置 Worker 進(jìn)程數(shù)量和 CPU 數(shù)量一致癣缅。

7.4 Nginx 常見的優(yōu)化配置

>> 調(diào)整 worker_processes:
指 Nginx 要生成的 Worker 數(shù)量,最佳實(shí)踐是每個(gè) CPU 運(yùn)行 1 個(gè)工作進(jìn)程哄酝。
>> 最大化 worker_connections友存。
>> 啟用 Gzip 壓縮:
壓縮文件大小,減少了客戶端 HTTP 的傳輸帶寬陶衅,因此提高了頁面加載速度屡立。
>> 為靜態(tài)文件啟用緩存。
>> 禁用 access_logs(不太好):
訪問日志記錄搀军,它記錄每個(gè) Nginx 請求膨俐,因此消耗了大量 CPU 資源,從而降低了 Nginx 性能罩句。

參考資源
https://mp.weixin.qq.com/s/wC_TURy_zpLUdA0gIcJD3w (nginx核心參考)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焚刺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子门烂,更是在濱河造成了極大的恐慌乳愉,老刑警劉巖兄淫,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔓姚,居然都是意外死亡捕虽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門坡脐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泄私,“玉大人,你說我怎么就攤上這事备闲∩味耍” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵恬砂,是天一觀的道長斩松。 經(jīng)常有香客問我,道長觉既,這世上最難降的妖魔是什么惧盹? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮瞪讼,結(jié)果婚禮上钧椰,老公的妹妹穿的比我還像新娘。我一直安慰自己符欠,他們只是感情好嫡霞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著希柿,像睡著了一般诊沪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曾撤,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天端姚,我揣著相機(jī)與錄音,去河邊找鬼挤悉。 笑死渐裸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的装悲。 我是一名探鬼主播昏鹃,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诀诊!你這毒婦竟也來了洞渤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤属瓣,失蹤者是張志新(化名)和其女友劉穎载迄,沒想到半個(gè)月后奈懒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宪巨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溜畅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捏卓。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖慈格,靈堂內(nèi)的尸體忽然破棺而出怠晴,到底是詐尸還是另有隱情,我是刑警寧澤浴捆,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布蒜田,位于F島的核電站,受9級特大地震影響选泻,放射性物質(zhì)發(fā)生泄漏冲粤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一页眯、第九天 我趴在偏房一處隱蔽的房頂上張望梯捕。 院中可真熱鬧,春花似錦窝撵、人聲如沸傀顾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽短曾。三九已至,卻和暖如春赐劣,著一層夾襖步出監(jiān)牢的瞬間嫉拐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工魁兼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椭岩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓璃赡,卻偏偏與公主長得像判哥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子碉考,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354