存檔

‘nginx’ 分類的存檔

免費域名證書+nginx開啟https訪問

2018年4月7日 3 條評論

越來越多的網站開始啟用https訪問,包括谷歌也表示提升https網站在搜索結果中的排名。

開啟https首先需要有域名證書,大多都是要收費的,個人站在使用let‘s encrypt的免費證書就可以。

本站的證書效果:

生成辦法:
第一步 下載域名證書工具

第二步 生成證書,只需修改郵箱 網站根目錄 域名就可以了。

執行生成證書命令前需要在nginx支持網站所有權驗證
2.1 增加隱藏目錄訪問

2.2 生成域名證書

第三步 修改nginx 配置支持https方式訪問

上一步生成的證書

/etc/letsencrypt/live/www.52587952.com/fullchain.pem
/etc/letsencrypt/live/www.52587952.com/privkey.pem

第四步 定時更新證書
crontab 中增加定時任務,每15天更新一次證書
Let's Encrypt證書是有效期90天的,需要我們自己手工更新續期才可以

分類: nginx 標簽:

如何在ubuntu 16.04 上安裝Nginx

2017年12月9日 4 條評論

概述

Nginx 是世界上最受歡迎的web服務器,許多大流量的主機都采用Nginx作為服務器。在大多數場景下作為web服務器的Nginx比Apache更加節省資源,它也可當作反向代理服務器。

本文主要介紹如何在ubuntu16.04上安裝Nginx

前提條件

開始以前,你需要有一個安裝好的ubuntu16.04,并且你需要有一個擁有sudo權限的非root普通用戶。

第一步:安裝Nginx

Ubuntu默認的源中就有Nginx,所以安裝是比較簡單的。

首先,更新apt源,以便軟件是最新的,然后就可以安裝nginx:

  • sudo apt-get update
  • sudo apt-get install nginx

執行這兩個命令之后,apt-get就會安裝好Nginx和它依賴的軟件。

第二步:配置防火墻

開始測試Nginx前,我們需要配置防火墻,以便允許外界訪問nginx服務。Nginx在安裝的時候使用ufw注冊自己作為一個服務,這樣對nginx的訪問就會變得很容易。

顯示所有ufw應用的配置:

sudo ufw app list

你可以得到一個配置的輸出列表:

我們可以看到,有三個Nginx的配置:

  • Nginx Full: 這個配置打開 80端口和443端口
  • Nginx HTTP: 這個配置只打開80 (普通, 未加密通信)
  • Nginx HTTPS: 這個配置只打開 443 (TLS/SSL 加密通信 )

一般來說我們應該配置最嚴的限制,因為本文我們還沒有配置SSL,所以我們只打開80端口。

我們執行:

驗證修改狀態:

我們可以看到HTTP是被打開的:

第三步: 檢查你的web server

安裝完成后,Ubuntu 16.04 會自動啟動 Nginx. 我們可以使用systemd?檢查運行狀態:

輸出

服務已經正常啟動,當然最好的確認方法是通過訪問web頁面的方式。

如果我們能訪問到默認加載頁就證明啟動成功了。

如果你不知道服務器的ip可以使用如下命令:

 

有了IP之后,在瀏覽器里輸入:

http://server_domain_or_IP

你就能看到Nginx的默認加載頁了:

Nginx default page

第四步: 管理 Nginx 進程

現在我們已經有nginx在運行了,我們可以再試一些管理命令:

停止nginx:

啟動nginx:

重啟nginx:

修改配置文件后,平滑加載配置命令(不會斷開用戶訪問):

默認,nginx是隨著系統啟動的時候自動運行。如果你不想開機啟動,那么你可以禁止nginx開機啟動:

重新配置nginx開機自動啟動:

第五步: 熟悉Nginx的文件和目錄

現在我們已經管理nginx了,接下來可以熟悉一下nginx的目錄結構和一些重要的文件:

網站文件位置

      • /var/www/html: 網站文件存放的地方, 默認只有我們上面看到nginx頁面,可以通過改變nginx配置文件的方式來修改這個位置。

服務器配置

      • /etc/nginx: nginx配置文件目錄。所有的nginx配置文件都在這里。
      • /etc/nginx/nginx.conf: Nginx的主配置文件. 可以修改他來改變nginx的全局配置。
      • /etc/nginx/sites-available/: 這個目錄存儲每一個網站的"server blocks"。nginx通常不會使用這些配置,除非它們陪連接到 ?sites-enabled?目錄 (see below)。一般所有的server block 配置都在這個目錄中設置,然后軟連接到別的目錄 。
      • /etc/nginx/sites-enabled/: 這個目錄存儲生效的 "server blocks" 配置. 通常,這個配置都是鏈接到 sites-available目錄中的配置文件
      • /etc/nginx/snippets: 這個目錄主要可以包含在其它nginx配置文件中的配置片段。重復的配置都可以重構為配置片段。

日志文件

    • /var/log/nginx/access.log: 每一個訪問請求都會記錄在這個文件中,除非你做了其它設置。
    • /var/log/nginx/error.log: 任何Nginx的錯誤信息都會記錄到這個文件中。
分類: nginx 標簽: ,

nginx的location、root、alias指令用法和區別

2017年4月4日 7 條評論

nginx指定文件路徑有兩種方式root和alias,指令的使用方法和作用域:
[root]
語法:root path
默認值:root html
配置段:http、server、location、if
[alias]
語法:alias path
配置段:location

root與alias主要區別在于nginx如何解釋location后面的uri,這會使兩者分別以不同的方式將請求映射到服務器文件上。
root的處理結果是:root路徑+location路徑
alias的處理結果是:使用alias路徑替換location路徑
alias是一個目錄別名的定義,root則是最上層目錄的定義。
還有一個重要的區別是alias后面必須要用“/”結束,否則會找不到文件的。。。而root則可有可無~~

root實例:

如果一個請求的URI是/t/a.html時,web服務器將會返回服務器上的/www/root/html/t/a.html的文件。

alias實例:

如果一個請求的URI是/t/a.html時,web服務器將會返回服務器上的/www/root/html/new_t/a.html的文件。注意這里是new_t,因為alias會把location后面配置的路徑丟棄掉,把當前匹配到的目錄指向到指定的目錄。

注意:
1. 使用alias時,目錄名后面一定要加"/"。
3. alias在使用正則匹配時,必須捕捉要匹配的內容并在指定的內容處使用。
4. alias只能位于location塊中。(root可以不放在location中)

分類: nginx 標簽:

nginx反向代理獲取用戶真實ip

2017年3月5日 2 條評論

nginx做反向代理時,默認的配置后端獲取到的ip都是來自于nginx,那么如何轉發用戶的真實IP到后端程序呢?
當前端使用nginx代理,后端使用php-fpm時,如果還是使用$_SERVER['REMOTE_ADDR'],那么php程序獲取到的是nginx的ip地址,而不是用戶的真實ip。

在nginx的配置文件中加入下面三個指令,這樣后端php就可以使用$_SERVER['HTTP_X_REAL_IP']獲取到訪客的ip。

如果你想使用$_SERVER['REMOTE_ADDR'],不想修改代碼,那么可以通過修改REMOTE_ADDR的值來實現。

經過多層代理后 $http_x_forwared_for 會含有多個ip,其中第一個ip是客戶端的ip,REMOTE_ADDR只能是客戶端的ip,所以可以用正則提取 $http_x_forwarded_for的第一個ip給REMOTE_ADDR:

分類: nginx 標簽:

nginx 的 access log rewrite log 日志配置

2017年3月5日 沒有評論

nginx 的 rewrite log 是記錄在 error log 文件中,而不是access log中。
nginx 開啟 rewrite 的方法(在server段中添加):
首先,打開 error_log 日志

然后打開 rewrite_log 開關

這樣就可以在 error.log 中生成重寫的 rewrite 日志。

當server段不指定access_log時,并且http段中也未指定任何access_log參數時,它會默認寫到logs/access.log這個文件,也就是access_log默認值就是logs/access.log,而且是所有server的訪問日志。
如果我們不需要,在http段中加一行access_log off;然后在特定的server中配置自己想寫入的日志。

nginx的http段中,設置access log:

nginx有一個非常靈活的日志記錄模式。每個級別的配置可以有各自獨立的訪問日志。日志格式通過log_format命令來定義。

1. access_log指令

語法: access_log path [format [buffer=size [flush=time]]];
access_log path format gzip[=level] [buffer=size] [flush=time];
access_log syslog:server=address[,parameter=value] [format];
access_log off;
默認值: access_log logs/access.log combined;
配置段: http, server, location, if in location, limit_except
gzip壓縮等級。
buffer設置內存緩存區大小。
flush保存在緩存區中的最長時間。
不記錄日志:access_log off;
使用默認combined格式記錄日志:access_log logs/access.log 或 access_log logs/access.log combined;

2. log_format指令

語法: log_format name string …;
默認值: log_format combined “…”;
配置段: http
name表示格式名稱,string表示等義的格式。log_format有一個默認的無需設置的combined日志格式,相當于apache的combined日志格式,如下所示:

如果nginx位于負載均衡器,squid,nginx反向代理之后,web服務器無法直接獲取到客戶端真實的IP地址了。 $remote_addr獲取反向代理的IP地址。反向代理服務器在轉發請求的http頭信息中,可以增加X-Forwarded-For信息,用來記錄 客戶端IP地址和客戶端請求的服務器地址。

日志格式允許包含的變量注釋如下:

發送給客戶端的響應頭擁有“sent_http_”前綴。 比如$sent_http_content_range。
實例如下:

3. open_log_file_cache指令

語法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
默認值: open_log_file_cache off;
配置段: http, server, location
對于每一條日志記錄,都將是先打開文件,再寫入日志,然后關閉。可以使用open_log_file_cache來設置日志文件緩存(默認是off),格式如下:
參數注釋如下:
max:設置緩存中的最大文件描述符數量,如果緩存被占滿,采用LRU算法將描述符關閉。
inactive:設置存活時間,默認是10s
min_uses:設置在inactive時間段內,日志文件最少使用多少次后,該日志文件描述符記入緩存中,默認是1次
valid:設置檢查頻率,默認60s
off:禁用緩存
實例如下:

4. log_not_found指令

語法: log_not_found on | off;
默認值: log_not_found on;
配置段: http, server, location
是否在error_log中記錄不存在的錯誤。默認是。

5. log_subrequest指令

語法: log_subrequest on | off;
默認值: log_subrequest off;
配置段: http, server, location
是否在access_log中記錄子請求的訪問日志。默認不記錄。

6. rewrite_log指令

由ngx_http_rewrite_module模塊提供的。用來記錄重寫日志的。對于調試重寫規則建議開啟。 Nginx重寫規則指南
語法: rewrite_log on | off;
默認值: rewrite_log off;
配置段: http, server, location, if
啟用時將在error log中記錄notice級別的重寫日志。

7. error_log指令

語法: error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];
默認值: error_log logs/error.log error;
配置段: main, http, server, location
配置錯誤日志。

分類: nginx 標簽: , ,

nginx開啟https

2017年2月15日 1 條評論

開啟https配置

#下面是http跳轉至https

分類: nginx 標簽:

nginx解決跨域

2017年1月22日 3 條評論

什么是跨域?

使用js獲取數據時,涉及到的兩個url只要協議、域名、端口有任何一個不同,都被當作是不同的域,相互訪問就會有跨域問題。
例如客戶端的域名是www.redis.com.cn,而請求的域名是www.264.cn
如果直接使用ajax訪問,會有以下錯誤
XMLHttpRequest cannot load http://www.264.cn/server.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://www.redis.com.cn' is therefore not allowed access.

如何解決跨域?

在服務器頁面的Response header中加入如下內容,可以實現POST跨域。
// 指定允許其他域名訪問
header('Access-Control-Allow-Origin:*');
// 響應類型
header('Access-Control-Allow-Methods:POST');
// 響應頭設置
header('Access-Control-Allow-Headers:x-requested-with,content-type');

Access-Control-Allow-Origin:* 表示允許任何域名跨域訪問
如果需要指定某域名才允許跨域訪問,只需把Access-Control-Allow-Origin:*改為Access-Control-Allow-Origin:允許的域名
例如:header('Access-Control-Allow-Origin:http://www.redis.com.cn');

 

1.nginx配置文件增加響應頭

在服務器端的nginx.conf中配置增加配置

這樣就可以實現GET,POST,OPTIONS的跨域請求的支持

2.修改php代碼加入響應頭

例如,server.php 路徑:http://www.264.cn/server.php

3.修改客端的nginx配置,利用反向代理來實現

例如,www.redis.com.cn/html/request.html 想請求www.264.cn/api/msg?method=1&para=2;

變成訪問本地域名地址

通過nginx中增加location反向代理到服務器端

 

 

分類: nginx 標簽:

iis監聽指定ip配置,iis和nginx共存

2016年11月30日 沒有評論

服務器增加ip之后,默認都監聽在80端口,這樣新加的ip就不能供nginx使用。

打開cmd, netstat -aon

你會看見 TCP 0.0.0.0:80 或者id為4的進程監聽在80端口

解決辦法:
1.下載httpcfg.exe

http://www.microsoft.com/downloads/details.aspx?FamilyID=96a35011-fd83-419d-939b-9a772ea2df90&displaylang=en

2.查看系統監聽情況,打開cmd之行

輸出結果

這表示沒有監聽,給iis綁定指定ip

執行結果,表示設置正確
HttpQueryServiceConfiguration completed with 0.

重啟iis服務器

現在iis只監聽在我們指定的ip xxx.xxx.xxx.xxx上,新的ip可以供nginx或者apache使用了。

iis7可以使用netsh http add iplisten ipaddress=xxx.xxx.xxx.xxx

分類: nginx 標簽:

windows下配置nginx和php環境(wnmp)

2016年11月27日 1 條評論

1.準備
創建安裝目錄D:/web,我們所有的文件都會放在這個目錄下

下載nginx最新版

下載php:php-5.4.16-Win32-VC9-x86.zip

2.下載完成會后獲得如下文件,解壓縮并重命名文件夾去掉版本號
php-5.4.16-Win32-VC9-x86.zip
nginx-1.10.2.zip

3.配置nginx
nginx不需要額外的配置,直接運行就可以,打開命令行cmd切換到d:/web/nginx
輸入 start nginx 后回車即可啟動
瀏覽器中訪問http://localhost/可以看到歡迎頁面表示安裝成功
具體可以參考windows下安裝nginx

3.配置php
在php的目錄下可以找到php.ini-development文件,復制一份并將文件名修改為php.ini。然后修改配置文件內容
; extension_dir = "ext" ,刪除前面的分號并修改為:extension_dir = "D:/web/php/ext"
;cgi.force_redirect = 1,刪除前面的分號:cgi.force_redirect = 1
;cgi.fix_pathinfo=1,刪除前面的分號:cgi.fix_pathinfo=1
;cgi.rfc2616_headers = 0,刪除前面的分號:cgi.rfc2616_headers = 1

命令行下輸入如下命令啟動php,不報錯表示啟動成功。

4.檢查nginx、php是否安裝成功
在D:/web/nginx/html下新建一個phpinfo.php,加入如下內容后保存

修改nginx.conf 增加server,也就是虛擬服務器

重啟nginx
打開瀏覽器訪問http://localhost/phpinfo.php
能看到php信息表示安裝成功。

4.安裝mysql
這個步驟根其它環境無特殊不同,如果安裝過可以直接使用,未安裝的可以根據mysql安裝向導下一步即可。

最終安裝之后的目錄結構

附:nginx和php的快速啟動和關閉腳本
啟動腳本

關閉腳本

遇到的問題:
如果遇到提示php不是有效的win32程序,是因為安裝的微軟運行時庫不對2003需要使用vc9版本的php

分類: nginx 標簽: , ,

nginx + fastcgi + c/c++

2016年7月18日 1 條評論

使用php寫后端程序的例子很多,用c/c++的比較少。

本文采用nginx,spawn,fastcgi++來構建一個基于cgi的web程序。
由于fastcgi++依賴于boost庫,我們先來裝boost庫

Linux下編譯boost

1.編譯前的準備工作

2.下載安裝包并解壓

編譯安裝

測試boost庫是否可以使用,boost編譯完成后運行程序報錯,

最開始以為是bzip2沒裝上,折騰了許久也沒搞定,最后我發現boost的官方文檔寫著gcc4.4.7,而我本地的編譯器是4.4.6,之后我把gcc升級到4.8重新編譯通過。

redhat6.3升級gcc4.8.0編譯安裝方法:

1.下載源碼并解壓

2.下載編譯所需的依賴項

3.建立編譯輸出目錄
mkdir gcc-build-4.8.0

4.進入此目錄,執行以下命令,生成makefile文件

5.執行以下命令進行編譯,編譯時間比較長

6.安裝
sudo make install

安裝完成后查看版本

重新執行boost的編譯,編寫一個例子測試是否成功

編譯運行

spawn-fcgi安裝

fastcgi安裝

啟動fastcgi程序

如果啟動報錯,可以加參數-n來看具體原因。

我的報錯如下,因為升級了gcc4.8,沒有升級libstdc++.so.6導致。

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found錯誤的解決

沒有3.4.15

連接到libstdc++.so.6新的庫

再次啟動fastcgi程序

程序會在前臺運行
檢查程序是否正常運行

配置nginx,增加

重新加載ngnx的配置

打開瀏覽器,訪問http://192.168.18.11/utf8-helloworld.fcgi,你會看到。
English: Hello World
Russian: Привет мир
Greek: Γεια σα? κ?σμο
Chinese: 世界您好
Japanese: 今日は世界
Runic English?: ???? ?????

參考
http://www.cnblogs.com/skynet/p/4173450.html
http://www.cnblogs.com/wanghetao/p/3934350.html
http://www.nongnu.org/fastcgipp/doc/2.1/index.html

分類: c++, nginx 標簽:
极速快乐十分助手