Nginx (engine x) 是一款輕量級的 Web 服務器 、反向代理服務器及電子郵件(IMAP/POP3)代理服務器。它是來自俄羅斯的Igor Sysoev在爲Rambler Media工做期間,使用C語言開發的。html
Igor Sysoev將Nginx的代碼開源,而且賦予其最自由的2-clause BSD-like license許可證。因爲Nginx使用基於事件驅動的架構可以併發處理百萬級別的TCP鏈接,高度模塊化的設計和自由的許可證使得擴展Nginx功能的第三方模塊層出不窮,並且優秀的設計帶來了極佳的穩定性,所以其做爲Web服務器被普遍應用到大流量的網站上。java
所謂反向代理(Reverse Proxy)方式是指以代理服務器來接受 internet 上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給 internet 上請求鏈接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。nginx
既然有反向代理,那麼也就有正向代理。正向代理是一個位於客戶端和原始服務器之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標,而後代理向原始服務器轉交請求並將得到的內容返回給客戶端。c++
能夠說正向代理代理的是客戶端,反向代理代理的是服務器。web
使用Nginx有以下優點:正則表達式
優點 | 說明 |
---|---|
更快 | Nginx能夠比其餘web服務器更快地響應請求 |
高擴展性 | Nginx採用低耦合的設計,擁有衆多優秀的的第三方模塊 |
高穩定性 | 每一個worker進程相對獨立,master進程在1個worker進程出錯時能夠快速「拉起」新的worker子進程提供服務 |
低內存消耗 | 通常狀況下,10000個非活躍的HTTP Keep-Alive鏈接在Nginx中僅消耗2.5MB的內存,這是Nginx支持高併發鏈接的基礎。單機支持10萬以上的併發鏈接,這並非極限,限制主要取決於內存 |
熱部署 | aster管理進程與worker工做進程的分離設計,使得Nginx可以提供熱部署功能,便可以在7×24小時不間斷服務的前提下,升級Nginx的可執行文件。固然,它也支持不中止服務就更新配置項、更換日誌文件等功能。 |
最自由的BSD許可協議 | 這是Nginx能夠快速發展的強大動力。BSD許可協議不僅是容許用戶無償使用Nginx,它還容許用戶在本身的項目中直接使用或修改Nginx源碼,而後發佈。 |
豐富的模塊 | 擁有無數個官方功能模塊、第三方功能模塊使得Nginx可以知足絕大部分應用場景,這些功能模塊間能夠疊加以實現更增強大、複雜的功能,有些模塊還支持Nginx與Perl、Lua等腳本語言集成工做,大大提升了開發效率。 |
如今服務器通常都使用Linux操做系統,在編譯和安裝Nginx以前,你須要先安裝其依賴的庫。安全
下面列舉幾個完成Web服務器最基本功能所必需的庫。bash
GCC(GNU Compiler Collection)可用來編譯C語言程序。服務器
Nginx一般不會直接提供二進制可執行程序,所以咱們須要編譯其源碼。網絡
並且咱們可能會使用C++來編寫Nginx HTTP模塊,這時就須要用到G++編譯器了。
用yum安裝G++編譯器:
yum install -y gcc-c++
複製代碼
PCRE庫PCRE(Perl Compatible Regular Expressions,Perl兼容正則表達式)是由Philip Hazel開發的函數庫,目前爲不少軟件所使用,該庫支持正則表達式。它由RegEx演化而來,實際上, Perl正則表達式也是源自於Henry Spencer寫的RegEx。
若是咱們在配置文件nginx.conf裏使用了正則表達式,那麼在編譯Nginx時就必須把PCRE庫編譯進Nginx,由於Nginx的HTTP模塊要靠它來解析正則表達式。
固然,若是你確認不會使用正則表達式,就沒必要安裝它。
其yum安裝方式以下:
yum install -y pcre pcre-devel
複製代碼
pcre-devel是使用PCRE作二次開發時所須要的開發庫,包括頭文件等,這也是編譯Nginx所必須使用的。
zlib庫用於對HTTP包的內容作gzip格式的壓縮,若是咱們在nginx.conf裏配置了gzip on, 並指定對於某些類型(content-type)的HTTP響應使用gzip來進行壓縮以減小網絡傳輸量,那麼,在編譯時就必須把zlib編譯進Nginx。
其yum安裝方式以下
yum install -y zlib zlib-devel
複製代碼
同理,zlib是直接使用的庫,zlib-devel是二次開發所須要的庫。
若是咱們的服務器不僅是要支持HTTP,還須要在更安全的SSL協議上傳輸HTTP,那麼就須要擁有OpenSSL了。
另外,若是咱們想使用MD五、SHA1等散列函數,那麼也須要安裝它。
其yum安裝方式以下:
yum install -y openssl openssl-devel
複製代碼
進入Nginx官方站點的下載界面,選擇最新的穩定版本。
而後使用 wget 命令下載:
[root@host nginx]# wget http://nginx.org/download/nginx-1.16.0.tar.gz
--2019-05-23 03:28:52-- http://nginx.org/download/nginx-1.16.0.tar.gz
Resolving nginx.org... 62.210.92.35, 95.211.80.227, 2001:1af8:4060:a004:21::e3
Connecting to nginx.org|62.210.92.35|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1032345 (1008K) [application/octet-stream]
Saving to: 「nginx-1.16.0.tar.gz」
100%[==========================================================================================================================================>] 1,032,345 715K/s in 1.4s
2019-05-23 03:28:53 (715 KB/s) - 「nginx-1.16.0.tar.gz」 saved [1032345/1032345]
複製代碼
解壓文件:
[root@host nginx]# tar xf nginx-1.16.0.tar.gz
[root@host nginx]# ls
nginx-1.16.0 nginx-1.16.0.tar.gz
[root@host nginx]# cd nginx-1.16.0
[root@host nginx-1.16.0]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
複製代碼
編譯並安裝Nginx使用下面三條命令:
./configure
make
make install
複製代碼
若是你依賴的庫找不到的話,在執行./configure
命令的時候會報錯,例如找不到PCRE庫:
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
複製代碼
正常的輸出應該是下面這樣,而且生成了Makefile
:
[root@host nginx-1.16.0]# ./configure
checking for OS
+ Linux 4.10.4-1.el6.elrepo.i686 i686
checking for C compiler ... found
+ using GNU C compiler
+ gcc version: 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC)
checking for gcc -pipe switch ... found
checking for -Wl,-E switch ... found
checking for gcc builtin atomic operations ... found
checking for C99 variadic macros ... found
checking for gcc variadic macros ... found
checking for gcc builtin 64 bit byteswap ... found
checking for unistd.h ... found
checking for inttypes.h ... found
checking for limits.h ... found
checking for sys/filio.h ... not found
checking for sys/param.h ... found
checking for sys/mount.h ... found
checking for sys/statvfs.h ... found
checking for crypt.h ... found
checking for Linux specific features
checking for epoll ... found
checking for EPOLLRDHUP ... found
checking for EPOLLEXCLUSIVE ... not found
checking for O_PATH ... not found
checking for sendfile() ... found
checking for sendfile64() ... found
checking for sys/prctl.h ... found
checking for prctl(PR_SET_DUMPABLE) ... found
checking for prctl(PR_SET_KEEPCAPS) ... found
checking for capabilities ... found
checking for crypt_r() ... found
checking for sys/vfs.h ... found
checking for nobody group ... found
checking for poll() ... found
checking for /dev/poll ... not found
checking for kqueue ... not found
checking for crypt() ... not found
checking for crypt() in libcrypt ... found
checking for F_READAHEAD ... not found
checking for posix_fadvise() ... found
checking for O_DIRECT ... found
checking for F_NOCACHE ... not found
checking for directio() ... not found
checking for statfs() ... found
checking for statvfs() ... found
checking for dlopen() ... not found
checking for dlopen() in libdl ... found
checking for sched_yield() ... found
checking for sched_setaffinity() ... found
checking for SO_SETFIB ... not found
checking for SO_REUSEPORT ... found
checking for SO_ACCEPTFILTER ... not found
checking for SO_BINDANY ... not found
checking for IP_TRANSPARENT ... found
checking for IP_BINDANY ... not found
checking for IP_BIND_ADDRESS_NO_PORT ... not found
checking for IP_RECVDSTADDR ... not found
checking for IP_SENDSRCADDR ... not found
checking for IP_PKTINFO ... found
checking for IPV6_RECVPKTINFO ... found
checking for TCP_DEFER_ACCEPT ... found
checking for TCP_KEEPIDLE ... found
checking for TCP_FASTOPEN ... not found
checking for TCP_INFO ... found
checking for accept4() ... found
checking for eventfd() ... found
checking for int size ... 4 bytes
checking for long size ... 4 bytes
checking for long long size ... 8 bytes
checking for void * size ... 4 bytes
checking for uint32_t ... found
checking for uint64_t ... found
checking for sig_atomic_t ... found
checking for sig_atomic_t size ... 4 bytes
checking for socklen_t ... found
checking for in_addr_t ... found
checking for in_port_t ... found
checking for rlim_t ... found
checking for uintptr_t ... uintptr_t found
checking for system byte ordering ... little endian
checking for size_t size ... 4 bytes
checking for off_t size ... 8 bytes
checking for time_t size ... 4 bytes
checking for AF_INET6 ... found
checking for setproctitle() ... not found
checking for pread() ... found
checking for pwrite() ... found
checking for pwritev() ... found
checking for sys_nerr ... found
checking for localtime_r() ... found
checking for clock_gettime(CLOCK_MONOTONIC) ... not found
checking for clock_gettime(CLOCK_MONOTONIC) in librt ... found
checking for posix_memalign() ... found
checking for memalign() ... found
checking for mmap(MAP_ANON|MAP_SHARED) ... found
checking for mmap("/dev/zero", MAP_SHARED) ... found
checking for System V shared memory ... found
checking for POSIX semaphores ... not found
checking for POSIX semaphores in libpthread ... found
checking for struct msghdr.msg_control ... found
checking for ioctl(FIONBIO) ... found
checking for struct tm.tm_gmtoff ... found
checking for struct dirent.d_namlen ... not found
checking for struct dirent.d_type ... found
checking for sysconf(_SC_NPROCESSORS_ONLN) ... found
checking for sysconf(_SC_LEVEL1_DCACHE_LINESIZE) ... found
checking for openat(), fstatat() ... found
checking for getaddrinfo() ... found
checking for PCRE library ... found
checking for PCRE JIT support ... not found
checking for zlib library ... found
creating objs/Makefile
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/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"
複製代碼
安裝成功之後,能夠經過-v參數查看Nginx版本。
[root@host sbin]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.16.0
複製代碼
Nginx支持直接啓動,也支持帶參數啓動,下面分別演示一下。
Nginx須要使用80端口,若是80端口被佔用,啓動會有以下報錯:
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
複製代碼
可使用lsof
工具查看端口占用狀況,若是你沒有裝,可使用以下命令安裝:
yum install -y lsof
複製代碼
查看本機80端口的佔用狀況,並殺掉佔用的進程:
[root@host sbin]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 1765 root 53u IPv6 15062 0t0 TCP *:http (LISTEN)
[root@host sbin]# killall -9 java
[root@host sbin]# lsof -i :80
[root@host sbin]#
複製代碼
使用whereis
命令查看nginx的安裝目錄:
[root@host nginx-1.16.0]# whereis nginx
nginx: /usr/local/nginx
複製代碼
若是不加任何參數啓動,會使用默認的nginx.conf
配置文件啓動Nginx:
/usr/local/nginx/sbin/nginx
複製代碼
啓動成功之後,再請求服務器的時候能夠看到包含下面內容的網頁:
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.
複製代碼
-c參數指定配置文件的啓動方式:
./nginx -c mynginx.conf
複製代碼
-p參數指定Nginx的安裝目錄:
./nginx -p mydir/nginx
複製代碼
-g參數臨時指定一些全局配置項
./nginx -g "pid varnginx/test.pid;"
複製代碼
上面這行命令意味着會把pid文件寫到varnginx/test.pid中。
-g參數的約束條件是指定的配置項不能與默認路徑下的nginx.conf中的配置項相沖突,不然沒法啓動。
就像上例那樣,相似這樣的配置項:pid logs/nginx.pid,是不能存在於默認的nginx.conf中的。
另外一個約束條件是,以-g方式啓動的Nginx服務執行其餘命令行時,須要把-g參數也帶上,不然可能出現配置項不匹配的情形。
在不啓動Nginx的狀況下,使用-t參數僅測試配置文件是否有錯誤。 例如:
./nginx -t
複製代碼
執行結果中顯示配置是否正確。
[root@host sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
複製代碼
測試配置選項時,使用-q參數能夠不把error級別如下的信息輸出到屏幕。 例如:
./nginx -t -q
複製代碼
中止Nginx的服務主要有兩種方式。
一種是快速中止,即當即中止Nginx服務正在處理的全部網絡請求,立刻丟棄鏈接中止服務。
另一種是平緩地中止,即容許Nginx處理完當前的請求,但再也不接收新的請求,以後再關閉鏈接,中止工做。
/usr/local/nginx/sbin/nginx -s stop
複製代碼
kill -s SIGTERM 進程ID
或kill -s SIGINT 進程ID
與上面./nginx -s stop
命令的效果是同樣的。
[root@host sbin]# ps -ef|grep nginx
root 10568 1 0 04:22 ? 00:00:00 nginx: master process ./nginx
nobody 10569 10568 0 04:22 ? 00:00:00 nginx: worker process
root 10571 5440 0 04:23 pts/1 00:00:00 grep nginx
[root@host sbin]# kill -s SIGINT 10568
[root@host sbin]# ps -ef|grep nginx
root 10574 5440 0 04:24 pts/1 00:00:00 grep nginx
[root@host sbin]#
複製代碼
若是但願Nginx服務能夠正常地處理完當前全部請求再中止服務,那麼可使用-s quit參數來中止服務。
例如:
./nginx -s quit
複製代碼
該命令與快速中止Nginx服務是有區別的。
當快速中止服務時,worker進程與master進程在收到信號後會馬上跳出循環,退出進程。
而「優雅」地中止服務時,首先會關閉監聽端口,中止接收新的鏈接,而後把當前正在處理的鏈接所有處理完,最後再退出進程。
與快速中止服務類似,能夠直接發送QUIT信號給master進程來中止服務,其效果與執行-s quit
命令是同樣的。
例如:
kill -s SIGQUIT <nginx master pid>
複製代碼
若是但願「優雅」地中止某個worker進程,那麼能夠經過向該進程發送WINCH信號來中止服務 。
例如:
kill -s SIGWINCH <nginx worker pid>
複製代碼
./nginx -g TERM | INT | QUIT
複製代碼
TERM 和 INT 信號用於快速中止,QUIT 信號用於平滑中止。
使用-s reload參數可使運行中的Nginx服務從新加載nginx.conf文件。 例如:
usrlocal/nginx/sbin/nginx -s reload
複製代碼
使用-s reopen參數能夠從新打開日誌文件,這樣能夠先把當前日誌文件更名或轉移到其餘目錄中進行備份,再從新打開時就會生成新的日誌文件。
這個功能使得日誌文件不至於過大。 例如:
./nginx -s reopen
複製代碼
這與使用kill命令發送USR1信號效果相同。
kill -s SIGUSR1 <nginx master pid>
複製代碼
本文簡單介紹了Nginx的做用和優勢,而後演示瞭如何安裝Nginx,以及如何啓動和關閉服務。