From 1f07330c685c348496ae2b97f0c1112182333acf Mon Sep 17 00:00:00 2001 From: ShaoBo Wan Date: Sat, 23 Sep 2017 13:04:59 +0800 Subject: [PATCH 001/106] =?UTF-8?q?Nginx=E5=8D=95IP=E5=A4=9A=E5=9F=9F?= =?UTF-8?q?=E5=90=8D=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Nginx/more-domain-config.md | 16 ++++++++++++++++ README.md | 2 ++ 2 files changed, 18 insertions(+) create mode 100644 Nginx/more-domain-config.md diff --git a/Nginx/more-domain-config.md b/Nginx/more-domain-config.md new file mode 100644 index 0000000..b3b9d4d --- /dev/null +++ b/Nginx/more-domain-config.md @@ -0,0 +1,16 @@ +## Nginx单IP多域名配置 + ++ 域名列表 + +| 序号 | 域名 | 根目录 | +| :------------ |:---------------:| :-----| +| 1 | www.tinywan.com | https://www.tinywan.com/ | +| 2 | www.tinywan.com | https://www.tinywan.com/ | +| 3 | www.tinywan.com | https://www.tinywan.com/ | + +./configure --prefix=/opt/openresty --with-luajit --with-http_ssl_module \ +--with-openssl=/usr/local/openssl --with-openssl-opt="enable-tlsext" \ +--without-http_redis2_module --with-http_iconv_module \ +--with-http_stub_status_module --with-http_xslt_module \ +--add-dynamic-module=/home/www/DEMO/nginx-ts-module \ +--add-dynamic-module=/home/www/DEMO/nginx-rtmp-module \ No newline at end of file diff --git a/README.md b/README.md index fe01898..386ef9d 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ + [Nginx高性能WEB服务器详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-high-basic.md) + [Nginx高并发系统内核优化和PHP7配置文件优化](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-parameter-config.md) + [Nginx和PHP-FPM启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-start-script.md) + + 项目案例 + + [Nginx单IP多域名配置](Nginx单IP多域名配置) + Lua 教程 + [Lua 基础语法](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Lua-Script/lua-basic.md) + [luajit 执行文件默认安装路径](#Nginx_base_knowledge) From fffb7bd718ef7fe5963fc8d30888870d5bff93a0 Mon Sep 17 00:00:00 2001 From: ShaoBo Wan Date: Sat, 23 Sep 2017 13:22:56 +0800 Subject: [PATCH 002/106] =?UTF-8?q?Nginx=20=E5=90=8C=E4=B8=80=E4=B8=AAIP?= =?UTF-8?q?=E4=B8=8A=E9=85=8D=E7=BD=AE=E5=A4=9A=E4=B8=AAHTTPS=E4=B8=BB?= =?UTF-8?q?=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Nginx/more-domain-config.md | 159 ++++++++++++++++++++++++++++++++---- README.md | 2 +- 2 files changed, 146 insertions(+), 15 deletions(-) diff --git a/Nginx/more-domain-config.md b/Nginx/more-domain-config.md index b3b9d4d..c668bf3 100644 --- a/Nginx/more-domain-config.md +++ b/Nginx/more-domain-config.md @@ -1,16 +1,147 @@ -## Nginx单IP多域名配置 +## Nginx 同一个IP上配置多个HTTPS主机 ++ [Nginx 同一个IP上配置多个HTTPS主机](http://www.ttlsa.com/web/multiple-https-host-nginx-with-a-ip-configuration/) ++ 域名列表 -+ 域名列表 + | 序号 | 域名 | HTTPS主机 | + | :------------ |:---------------:| :-----| + | 1 | www.tinywan.com | https://www.tinywan.com/ | + | 2 | live.tinywan.com | https://live.tinywan.com/ | + | 3 | vod.tinywan.com | https://vod.tinywan.com/ | + | 4 | doc.tinywan.com | https://doc.tinywan.com/ | -| 序号 | 域名 | 根目录 | -| :------------ |:---------------:| :-----| -| 1 | www.tinywan.com | https://www.tinywan.com/ | -| 2 | www.tinywan.com | https://www.tinywan.com/ | -| 3 | www.tinywan.com | https://www.tinywan.com/ | - -./configure --prefix=/opt/openresty --with-luajit --with-http_ssl_module \ ---with-openssl=/usr/local/openssl --with-openssl-opt="enable-tlsext" \ ---without-http_redis2_module --with-http_iconv_module \ ---with-http_stub_status_module --with-http_xslt_module \ ---add-dynamic-module=/home/www/DEMO/nginx-ts-module \ ---add-dynamic-module=/home/www/DEMO/nginx-rtmp-module \ No newline at end of file ++ Openresty 编译 + + ```bash + www@TinywanAliYun:~/DEMO/openresty-1.11.2.5$ + ./configure --prefix=/usr/local/openresty --with-luajit \ + --with-http_ssl_module --with-openssl=/usr/local/openssl \ + --with-openssl-opt="enable-tlsext" --without-http_redis2_module \ + --with-http_iconv_module --with-http_stub_status_module \ + --with-http_xslt_module --add-dynamic-module=/home/www/DEMO/nginx-ts-module \ + --add-dynamic-module=/home/www/DEMO/nginx-rtmp-module + ... + make + sudo make install + ``` + > 注意添加配置:`--with-openssl-opt="enable-tlsext" `,默认情况下是`TLS SNI support disabled` ++ `Nginx.conf`配置文件: + + 配置文件列表 + + ```bash + www@TinywanAliYun:/usr/local/openresty/nginx/conf/vhost$ ls + doc.tinywan.com.conf live_rtmp_hls.conf live.tinywan.com.conf + main.conf vod.tinywan.com.conf www.tinywan.com.conf + ``` + + `nginx.conf` + + ```bash + http { + ... + index index.php index.html index.htm; + include "/usr/local/openresty/nginx/conf/vhost/*.conf"; + } + ``` + + `main.conf` + + ```bash + # 配置HTTP请求重定向 + server { + listen 80; + server_name www.tinywan.com; #live.tinywan.com vod.tinywan.com; + rewrite ^ https://$http_host$request_uri? permanent; + } + ``` + + `www.tinywan.com.conf` + + ```bash + server { + #listen 80; + listen 443 ssl; + server_name www.tinywan.com; + set $root_path /home/www/web/go-study-line/public; + root $root_path; + + ssl on; + ssl_certificate /etc/letsencrypt/live/www.tinywan.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/www.tinywan.com//privkey.pem; + server_tokens off; + + location / { + #access_by_lua_file /usr/local/openresty/nginx/conf/lua_script/resty-limit-req.lua; + if (!-e $request_filename) { + rewrite ^(.*)$ /index.php?s=/$1 last; + break; + } + } + + location = /favicon.ico { + log_not_found off; + } + + location ~ \.php$ { + #access_by_lua_file /usr/local/openresty/nginx/conf/lua_script/resty-limit-req.lua; + fastcgi_pass unix:/var/run/php7.1.8-fpm.sock; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + fastcgi_buffer_size 128k; + fastcgi_buffers 4 256k; + fastcgi_busy_buffers_size 256k; + fastcgi_connect_timeout 300; + fastcgi_send_timeout 300; + fastcgi_read_timeout 300; + } + } + ``` + + `live.tinywan.com.conf` + + ```bash + # live.tinywan.com + server{ + listen 443 ssl; + server_name live.tinywan.com; + + root /home/www/web/live.tinywan.com; + + ssl on; + ssl_certificate /etc/letsencrypt/live/www.tinywan.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/www.tinywan.com//privkey.pem; + server_tokens off; + + } + ``` + + `vod.tinywan.com.conf` + + ```bash + # vod.tinywan.com + server{ + listen 443 ssl; + server_name vod.tinywan.com; + + root /home/www/web/vod.tinywan.com; + + ssl on; + ssl_certificate /etc/letsencrypt/live/www.tinywan.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/www.tinywan.com//privkey.pem; + server_tokens off; + + } + ``` + + `doc.tinywan.com.conf` + + ```bash + # doc.tinywan.com + server{ + listen 443 ssl; + server_name doc.tinywan.com; + + root /home/www/web/doc.tinywan.com; + + ssl on; + ssl_certificate /etc/letsencrypt/live/www.tinywan.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/www.tinywan.com//privkey.pem; + server_tokens off; + + } + ``` + \ No newline at end of file diff --git a/README.md b/README.md index 386ef9d..a8725ce 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ + [Nginx高并发系统内核优化和PHP7配置文件优化](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-parameter-config.md) + [Nginx和PHP-FPM启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-start-script.md) + 项目案例 - + [Nginx单IP多域名配置](Nginx单IP多域名配置) + + [Nginx 同一个IP上配置多个HTTPS主机](https://github.com/Tinywan/lua-nginx-redis/blob/master/Nginx/more-domain-config.md) + Lua 教程 + [Lua 基础语法](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Lua-Script/lua-basic.md) + [luajit 执行文件默认安装路径](#Nginx_base_knowledge) From 8da7cfc92cdd8ed6ddf801873d609da796bf1a30 Mon Sep 17 00:00:00 2001 From: ShaoBo Wan Date: Sat, 23 Sep 2017 13:26:43 +0800 Subject: [PATCH 003/106] =?UTF-8?q?Nginx=20=E5=90=8C=E4=B8=80=E4=B8=AAIP?= =?UTF-8?q?=E4=B8=8A=E9=85=8D=E7=BD=AE=E5=A4=9A=E4=B8=AAHTTPS=E4=B8=BB?= =?UTF-8?q?=E6=9C=BA=EF=BC=8C=E5=9F=9F=E5=90=8D=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Nginx/more-domain-config.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Nginx/more-domain-config.md b/Nginx/more-domain-config.md index c668bf3..670bdca 100644 --- a/Nginx/more-domain-config.md +++ b/Nginx/more-domain-config.md @@ -2,12 +2,12 @@ + [Nginx 同一个IP上配置多个HTTPS主机](http://www.ttlsa.com/web/multiple-https-host-nginx-with-a-ip-configuration/) + 域名列表 - | 序号 | 域名 | HTTPS主机 | - | :------------ |:---------------:| :-----| - | 1 | www.tinywan.com | https://www.tinywan.com/ | - | 2 | live.tinywan.com | https://live.tinywan.com/ | - | 3 | vod.tinywan.com | https://vod.tinywan.com/ | - | 4 | doc.tinywan.com | https://doc.tinywan.com/ | + | 序号 | 名称 | 域名 | HTTPS主机 | + | :--: |:--: |:---------------:| :-----| + | 1 | 官方域名 | www.tinywan.com | https://www.tinywan.com/ | + | 2 | 直播域名 | live.tinywan.com | https://live.tinywan.com/ | + | 3 | 点播域名 | vod.tinywan.com | https://vod.tinywan.com/ | + | 4 | 文档域名 | doc.tinywan.com | https://doc.tinywan.com/ | + Openresty 编译 From 74f5542e451d3cba14ca5f97ef7aad89042058cc Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Mon, 25 Sep 2017 13:31:44 +0800 Subject: [PATCH 004/106] =?UTF-8?q?=E8=A7=A3=E5=86=B3=EF=BC=9Afind:=20path?= =?UTF-8?q?s=20must=20precede=20expression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Nginx-Rtmp/backup_mysql.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nginx-Rtmp/backup_mysql.sh b/Nginx-Rtmp/backup_mysql.sh index 518175d..33a12be 100644 --- a/Nginx-Rtmp/backup_mysql.sh +++ b/Nginx-Rtmp/backup_mysql.sh @@ -56,7 +56,7 @@ shell_unlock(){ mysql_zip(){ cd $SHELL_DIR /bin/bzip2 $BACKUP_NAME - find ./ -mindepth 1 -maxdepth 3 -type f -name *.bz2 -mmin +43200 | xargs rm -rf + find ./ -mindepth 1 -maxdepth 3 -type f -name '*.bz2' -mmin +43200 | xargs rm -rf #进行查找资料,多文件的查找的时候需要增加单引号 find ./ -mindepth 1 -maxdepth 3 -type f -name *.sql -mmin +1440 | xargs rm -rf find ./ -mindepth 1 -maxdepth 3 -type f -name *.log -mmin +1440 | xargs rm -rf } From 6518b53932025adf76d958a221de7abfab80499b Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Thu, 28 Sep 2017 09:55:24 +0800 Subject: [PATCH 005/106] =?UTF-8?q?Ubuntu=2016.04.2=20LTS=20=20=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Nginx/nginx-start-script.md | 74 +++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/Nginx/nginx-start-script.md b/Nginx/nginx-start-script.md index 16779fb..8d1ae03 100644 --- a/Nginx/nginx-start-script.md +++ b/Nginx/nginx-start-script.md @@ -1,6 +1,7 @@ ## 服务启动、停止和重启脚本 + [PHP-FPM](#PHP-FPM) + [Nginx](#Nginx) +## Ubuntu 14.04.2 LTS 启动脚本 #### PHP-FPM + 下载文件[php-fpm.sh](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/PHP/PHP-FPM/php-fpm.sh) + 注意配置文件:`sudo vim /usr/local/php-7.2/etc/php-fpm.conf` @@ -565,7 +566,7 @@ sudo vim /etc/init.d/nginx NGINXPATH=${NGINXPATH:-/opt/openresty/nginx} ``` -+ `Ubuntu 14.04.2 LTS `开启服务 ++ 开启服务 ```bash www@tinywan:~$ sudo service nginx restart @@ -573,13 +574,80 @@ * Stopping Nginx Server... [ OK ] * Starting Nginx Server... [ OK ] ``` -+ `Ubuntu 16.04.2 LTS` 开启服务 +## Ubuntu 16.04.2 LTS 启动脚本 +#### PHP-FPM ++ `php-fpm.sh`代码 同上 ++ 注意,需要重新加载服务: + + ``` + sudo systemctl daemon-reload + ``` ++ 开启服务 + + ```bash + www@TinywanAliYun:~/build$ sudo systemctl start php-fpm.service + ``` +#### Nginx ++ `nginx.sh`代码: + + ```javascript + #!/bin/sh + unalias stop + NGINX_CMD="/opt/nginx/sbin/nginx" + NGINX_CONF="/opt/nginx/conf/nginx.conf" + RETVAL=0 + start() { + echo "Starting NGINX Web Server: \c" + $NGINX_CMD -c $NGINX_CONF & + RETVAL=$? + [ $RETVAL -eq 0 ] && echo "ok" || echo "failed" + return $RETVAL + } + stop() { + echo "Stopping NGINX Web Server: \c" + $NGINX_CMD -s quit + RETVAL=$? + [ $RETVAL -eq 0 ] && echo "ok" || echo "failed" + return $RETVAL + } + case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + stop + start + ;; + *) + echo "Usage: $0 {start|stop|restart}" + exit 1 + esac + exit $RETVAL + ``` ++ CP到默认开启的服务脚本: + + ``` + sudo cp nginx.sh /etc/init.d/nginx + ``` ++ 给予权限: + + ``` + sudo chmod +x /etc/init.d/nginx + ``` ++ 加载服务: + + ``` + sudo systemctl daemon-reload + ``` ++ 开启服务 ```javascript sudo systemctl start nginx ``` + [辅助]`Ubuntu 16.04.2 LTS` 启动脚本`nginx_16.05.sh`,[Nginx官方参考](https://www.nginx.com/resources/wiki/start/topics/tutorials/solaris_11/#startup-script) - + 参考文章: + [linux wget 命令用法详解(附实例说明)](http://www.jb51.net/LINUXjishu/86326.html) + [理解Linux系统/etc/init.d目录和/etc/rc.local脚本](http://blog.csdn.net/acs713/article/details/7322082) From b2a5f74ed018b12f5fa0a98a1256d148ae85aabe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ShaoBo=20Wan=28=E6=97=A0=E6=9E=81=29?= Date: Sun, 22 Oct 2017 11:33:31 +0800 Subject: [PATCH 006/106] =?UTF-8?q?=E8=AE=A9PHP7=E8=BE=BE=E5=88=B0?= =?UTF-8?q?=E6=9C=80=E9=AB=98=E6=80=A7=E8=83=BD=E7=9A=84=E5=87=A0=E4=B8=AA?= =?UTF-8?q?Tips?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 让PHP7达到最高性能的几个Tips --- Nginx/nginx-parameter-config.md | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/Nginx/nginx-parameter-config.md b/Nginx/nginx-parameter-config.md index 0003301..b21b75d 100644 --- a/Nginx/nginx-parameter-config.md +++ b/Nginx/nginx-parameter-config.md @@ -219,11 +219,35 @@ + 启用Zend Opcache,php.ini配置文件中加入 ```bash - zend_extension=opcache.so opcache.enable=1 + zend_extension=opcache.so + opcache.memory_consumption=128 + opcache.interned_strings_buffer=8 + opcache.max_accelerated_files=4000 + opcache.revalidate_freq=60 + opcache.fast_shutdown=1 opcache.enable_cli=1 + opcache.huge_code_pages=1 + opcache.file_cache=/tmp + ``` ++ 缓存文件记录 + + ```bash + www@TinywanAliYun:/tmp$ tree -L 6 + . + ├── 8fc9c56d14b6542c6ff7147207730f6b + │   └── home + │   └── www + │   └── web + │   └── go-study-line + │   ├── application + │   ├── config + │   ├── public + │   ├── runtime + │   ├── thinkphp + │   └── vendor ``` -+ 使用新的编译器,使用新一点的编译器, 推荐GCC 4.8以上, 因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升 ++ 使用新的编译器,使用新一点的编译器, 推荐GCC 4.8以上, 因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升 + 开启HugePages,然后开启Opcache的huge_code_pages + 系统中开启HugePages @@ -398,4 +422,4 @@ + [php-fpm backlog参数潜在问题](http://blog.csdn.net/willas/article/details/11634825) + [Adjusting child processes for PHP-FPM (Nginx)](https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/) + [Nginx的worker_processes优化](http://blog.chinaunix.net/uid-26000296-id-3987521.html) - \ No newline at end of file + From 3f7f805f0c360e5116cd350f7ce89ca9bec2a24b Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Mon, 23 Oct 2017 16:38:05 +0800 Subject: [PATCH 007/106] Update nginx-start-script.md --- Nginx/nginx-start-script.md | 755 ++++++++++++++++++------------------ 1 file changed, 379 insertions(+), 376 deletions(-) diff --git a/Nginx/nginx-start-script.md b/Nginx/nginx-start-script.md index 8d1ae03..333c484 100644 --- a/Nginx/nginx-start-script.md +++ b/Nginx/nginx-start-script.md @@ -2,7 +2,7 @@ + [PHP-FPM](#PHP-FPM) + [Nginx](#Nginx) ## Ubuntu 14.04.2 LTS 启动脚本 -#### PHP-FPM +### PHP-FPM 服务 + 下载文件[php-fpm.sh](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/PHP/PHP-FPM/php-fpm.sh) + 注意配置文件:`sudo vim /usr/local/php-7.2/etc/php-fpm.conf` > 务必开启配置文件的pid路径:`pid = run/php-fpm.pid` @@ -165,406 +165,409 @@ Stopping PHP-FPM Server ... [OK] Starting PHP-FPM Server ... [OK] ``` -#### Nginx -+ 查看当前nginx是否已经在开机启动项里面: +### Nginx 服务 - ```bash - ls /etc/rc* - ``` -+ 第一种安装方式,下载文件安装 - - ```bash - #使用wget -O 下载并以不同的文件名保存 - sudo wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx - # 给与权限 - sudo chmod +x /etc/init.d/nginx - # 设置为启动项 - sudo update-rc.d nginx defaults - ``` -+   需要修改的地方: - +   1、`NGINXPATH=${NGINXPATH:-/opt/openresty/nginx}` 修改为自己的路径 - +   2、`PIDSPATH=${PIDSPATH:-$NGINXPATH/logs}` pid文件路径 - > 如果在配置文件修改为:`pid /run/nginx.pid;` -         PIDSPATH=${PIDSPATH:-$NGINXPATH/logs}修改为:PIDSPATH="/run" -+   第二种安装方式,和PHP-FPM一样,`nginx.sh`代码 ++ **第一种安装方式** + + 查看当前nginx是否已经在开机启动项里面: + + ```bash + ls /etc/rc* + ``` + + 如何安装 + + ```bash + #使用wget -O 下载并以不同的文件名保存 + sudo wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx + # 给与权限 + sudo chmod +x /etc/init.d/nginx + # 设置为启动项 + sudo update-rc.d nginx defaults + ``` + +   需要修改的地方: + +   1、`NGINXPATH=${NGINXPATH:-/opt/openresty/nginx}` 修改为自己的路径 + +   2、`PIDSPATH=${PIDSPATH:-$NGINXPATH/logs}` pid文件路径 + > 如果在配置文件修改为:`pid /run/nginx.pid;` +         PIDSPATH=${PIDSPATH:-$NGINXPATH/logs}修改为:PIDSPATH="/run" ++   第二种安装方式 + + 和PHP-FPM一样,`nginx.sh`代码 - ```bash - #! /bin/sh - ### BEGIN INIT INFO - # Provides: nginx - # Required-Start: $remote_fs $syslog - # Required-Stop: $remote_fs $syslog - # Default-Start: 2 3 4 5 - # Default-Stop: 0 1 6 - # Short-Description: nginx init.d dash script for Ubuntu or other *nix. - # Description: nginx init.d dash script for Ubuntu or other *nix. - ### END INIT INFO - #------------------------------------------------------------------------------ - # nginx - this Debian Almquist shell (dash) script, starts and stops the nginx - # daemon for Ubuntu and other *nix releases. - # - # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ - # proxy and IMAP/POP3 proxy server. This \ - # script will manage the initiation of the \ - # server and it's process state. - # - # processname: nginx - # config: /usr/local/nginx/conf/nginx.conf - # pidfile: /usr/local/nginx/logs/nginx.pid - # Provides: nginx - - #------------------------------------------------------------------------------ - # Functions - #------------------------------------------------------------------------------ - LSB_FUNC=/lib/lsb/init-functions - - # Test that init functions exists - test -r $LSB_FUNC || { - echo "$0: Cannot find $LSB_FUNC! Script exiting." 1>&2 - exit 5 - } - - . $LSB_FUNC - - #------------------------------------------------------------------------------ - # Consts - #------------------------------------------------------------------------------ - # Include nginx defaults if available - if [ -f /etc/default/nginx ]; then - . /etc/default/nginx - fi - - # Minimize path - PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin - - PS=${PS:-"nginx"} # process name - DESCRIPTION=${DESCRIPTION:-"Nginx Server..."} # process description - NGINXPATH=${NGINXPATH:-/opt/openresty/nginx} # root path where installed - DAEMON=${DAEMON:-$NGINXPATH/sbin/nginx} # path to daemon binary - NGINX_CONF_FILE=${NGINX_CONF_FILE:-$NGINXPATH/conf/nginx.conf} # config file path - PIDNAME=${PIDNAME:-"nginx"} # lets you do $PS-slave - PIDFILE=${PIDFILE:-$PIDNAME.pid} # pid file - PIDSPATH=${PIDSPATH:-$NGINXPATH/logs} # default pid location, you should change it - RUNAS=${RUNAS:-root} # user to run as - SCRIPT_OK=0 # ala error codes - SCRIPT_ERROR=1 # ala error codes - TRUE=1 # boolean - FALSE=0 # boolean - - #------------------------------------------------------------------------------ - # Simple Tests - #------------------------------------------------------------------------------ - - # Test if nginx is a file and executable - test -x $DAEMON || { - echo "$0: You don't have permissions to execute nginx." 1>&2 - exit 4 - } - - # You can also set your conditions like so: - # set exit condition - # set -e - - #------------------------------------------------------------------------------ - # Functions - #------------------------------------------------------------------------------ - - setFilePerms(){ - if [ -f $PIDSPATH/$PIDFILE ]; then - chmod 400 $PIDSPATH/$PIDFILE + ```bash + #! /bin/sh + ### BEGIN INIT INFO + # Provides: nginx + # Required-Start: $remote_fs $syslog + # Required-Stop: $remote_fs $syslog + # Default-Start: 2 3 4 5 + # Default-Stop: 0 1 6 + # Short-Description: nginx init.d dash script for Ubuntu or other *nix. + # Description: nginx init.d dash script for Ubuntu or other *nix. + ### END INIT INFO + #------------------------------------------------------------------------------ + # nginx - this Debian Almquist shell (dash) script, starts and stops the nginx + # daemon for Ubuntu and other *nix releases. + # + # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ + # proxy and IMAP/POP3 proxy server. This \ + # script will manage the initiation of the \ + # server and it's process state. + # + # processname: nginx + # config: /usr/local/nginx/conf/nginx.conf + # pidfile: /usr/local/nginx/logs/nginx.pid + # Provides: nginx + + #------------------------------------------------------------------------------ + # Functions + #------------------------------------------------------------------------------ + LSB_FUNC=/lib/lsb/init-functions + + # Test that init functions exists + test -r $LSB_FUNC || { + echo "$0: Cannot find $LSB_FUNC! Script exiting." 1>&2 + exit 5 + } + + . $LSB_FUNC + + #------------------------------------------------------------------------------ + # Consts + #------------------------------------------------------------------------------ + # Include nginx defaults if available + if [ -f /etc/default/nginx ]; then + . /etc/default/nginx fi - } - - configtest() { - $DAEMON -t -c $NGINX_CONF_FILE - } - - getPSCount() { - return `pgrep -f $PS | wc -l` - } - - isRunning() { - if [ $1 ]; then - pidof_daemon $1 - PID=$? - - if [ $PID -gt 0 ]; then - return 1 + + # Minimize path + PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + + PS=${PS:-"nginx"} # process name + DESCRIPTION=${DESCRIPTION:-"Nginx Server..."} # process description + NGINXPATH=${NGINXPATH:-/opt/openresty/nginx} # root path where installed + DAEMON=${DAEMON:-$NGINXPATH/sbin/nginx} # path to daemon binary + NGINX_CONF_FILE=${NGINX_CONF_FILE:-$NGINXPATH/conf/nginx.conf} # config file path + PIDNAME=${PIDNAME:-"nginx"} # lets you do $PS-slave + PIDFILE=${PIDFILE:-$PIDNAME.pid} # pid file + PIDSPATH=${PIDSPATH:-$NGINXPATH/logs} # default pid location, you should change it + RUNAS=${RUNAS:-root} # user to run as + SCRIPT_OK=0 # ala error codes + SCRIPT_ERROR=1 # ala error codes + TRUE=1 # boolean + FALSE=0 # boolean + + #------------------------------------------------------------------------------ + # Simple Tests + #------------------------------------------------------------------------------ + + # Test if nginx is a file and executable + test -x $DAEMON || { + echo "$0: You don't have permissions to execute nginx." 1>&2 + exit 4 + } + + # You can also set your conditions like so: + # set exit condition + # set -e + + #------------------------------------------------------------------------------ + # Functions + #------------------------------------------------------------------------------ + + setFilePerms(){ + if [ -f $PIDSPATH/$PIDFILE ]; then + chmod 400 $PIDSPATH/$PIDFILE + fi + } + + configtest() { + $DAEMON -t -c $NGINX_CONF_FILE + } + + getPSCount() { + return `pgrep -f $PS | wc -l` + } + + isRunning() { + if [ $1 ]; then + pidof_daemon $1 + PID=$? + + if [ $PID -gt 0 ]; then + return 1 + else + return 0 + fi else - return 0 + pidof_daemon + PID=$? + + if [ $PID -gt 0 ]; then + return 1 + else + return 0 + fi fi - else - pidof_daemon - PID=$? - - if [ $PID -gt 0 ]; then - return 1 + } + + #courtesy of php-fpm + wait_for_pid () { + try=0 + + while test $try -lt 35 ; do + case "$1" in + 'created') + if [ -f "$2" ]; then + try='' + break + fi + ;; + + 'removed') + if [ ! -f "$2" ]; then + try='' + break + fi + ;; + esac + + try=`expr $try + 1` + sleep 1 + done + } + + status(){ + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + log_warning_msg "$DESCRIPTION found running with processes: `pidof $PS`" + rc=0 else - return 0 + log_warning_msg "$DESCRIPTION is NOT running." + rc=3 fi - fi - } - - #courtesy of php-fpm - wait_for_pid () { - try=0 - - while test $try -lt 35 ; do - case "$1" in - 'created') - if [ -f "$2" ]; then - try='' - break + + return + } + + removePIDFile(){ + if [ $1 ]; then + if [ -f $1 ]; then + rm -f $1 fi - ;; - - 'removed') - if [ ! -f "$2" ]; then - try='' - break + else + #Do default removal + if [ -f $PIDSPATH/$PIDFILE ]; then + rm -f $PIDSPATH/$PIDFILE fi - ;; - esac - - try=`expr $try + 1` - sleep 1 - done - } - - status(){ - isRunning - isAlive=$? - - if [ "${isAlive}" -eq $TRUE ]; then - log_warning_msg "$DESCRIPTION found running with processes: `pidof $PS`" - rc=0 - else - log_warning_msg "$DESCRIPTION is NOT running." - rc=3 - fi - - return - } - - removePIDFile(){ - if [ $1 ]; then - if [ -f $1 ]; then - rm -f $1 fi - else - #Do default removal - if [ -f $PIDSPATH/$PIDFILE ]; then - rm -f $PIDSPATH/$PIDFILE - fi - fi - } - - start() { - log_daemon_msg "Starting $DESCRIPTION" - - isRunning - isAlive=$? - - if [ "${isAlive}" -eq $TRUE ]; then - log_end_msg $SCRIPT_ERROR - rc=0 - else - start-stop-daemon --start --quiet --chuid \ - $RUNAS --pidfile $PIDSPATH/$PIDFILE --exec $DAEMON \ - -- -c $NGINX_CONF_FILE - status=$? - setFilePerms - - if [ "${status}" -eq 0 ]; then - log_end_msg $SCRIPT_OK + } + + start() { + log_daemon_msg "Starting $DESCRIPTION" + + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + log_end_msg $SCRIPT_ERROR rc=0 + else + start-stop-daemon --start --quiet --chuid \ + $RUNAS --pidfile $PIDSPATH/$PIDFILE --exec $DAEMON \ + -- -c $NGINX_CONF_FILE + status=$? + setFilePerms + + if [ "${status}" -eq 0 ]; then + log_end_msg $SCRIPT_OK + rc=0 + else + log_end_msg $SCRIPT_ERROR + rc=7 + fi + fi + + return + } + + stop() { + log_daemon_msg "Stopping $DESCRIPTION" + + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + start-stop-daemon --stop --quiet --pidfile $PIDSPATH/$PIDFILE + + wait_for_pid 'removed' $PIDSPATH/$PIDFILE + + if [ -n "$try" ]; then + log_end_msg $SCRIPT_ERROR + rc=0 # lsb states 1, but under status it is 2 (which is more prescriptive). Deferring to standard. + else + removePIDFile + log_end_msg $SCRIPT_OK + rc=0 + fi else log_end_msg $SCRIPT_ERROR rc=7 fi - fi - - return - } - - stop() { - log_daemon_msg "Stopping $DESCRIPTION" - - isRunning - isAlive=$? - - if [ "${isAlive}" -eq $TRUE ]; then - start-stop-daemon --stop --quiet --pidfile $PIDSPATH/$PIDFILE - - wait_for_pid 'removed' $PIDSPATH/$PIDFILE - - if [ -n "$try" ]; then - log_end_msg $SCRIPT_ERROR - rc=0 # lsb states 1, but under status it is 2 (which is more prescriptive). Deferring to standard. - else - removePIDFile + + return + } + + reload() { + configtest || return $? + + log_daemon_msg "Reloading (via HUP) $DESCRIPTION" + + isRunning + + if [ $? -eq $TRUE ]; then + kill -HUP `cat $PIDSPATH/$PIDFILE` log_end_msg $SCRIPT_OK rc=0 + else + log_end_msg $SCRIPT_ERROR + rc=7 fi - else - log_end_msg $SCRIPT_ERROR - rc=7 - fi - - return - } - - reload() { - configtest || return $? - - log_daemon_msg "Reloading (via HUP) $DESCRIPTION" - - isRunning - - if [ $? -eq $TRUE ]; then - kill -HUP `cat $PIDSPATH/$PIDFILE` - log_end_msg $SCRIPT_OK - rc=0 - else - log_end_msg $SCRIPT_ERROR - rc=7 - fi - - return - } - - quietupgrade() { - log_daemon_msg "Peforming Quiet Upgrade $DESCRIPTION" - - isRunning - isAlive=$? - - if [ "${isAlive}" -eq $TRUE ]; then - kill -USR2 `cat $PIDSPATH/$PIDFILE` - kill -WINCH `cat $PIDSPATH/$PIDFILE.oldbin` - + + return + } + + quietupgrade() { + log_daemon_msg "Peforming Quiet Upgrade $DESCRIPTION" + isRunning isAlive=$? - + if [ "${isAlive}" -eq $TRUE ]; then - kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin` - wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin - removePIDFile $PIDSPATH/$PIDFILE.oldbin - - log_end_msg $SCRIPT_OK - rc=0 + kill -USR2 `cat $PIDSPATH/$PIDFILE` + kill -WINCH `cat $PIDSPATH/$PIDFILE.oldbin` + + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin` + wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin + removePIDFile $PIDSPATH/$PIDFILE.oldbin + + log_end_msg $SCRIPT_OK + rc=0 + else + log_end_msg $SCRIPT_ERROR + + log_daemon_msg "ERROR! Reverting back to original $DESCRIPTION" + + kill -HUP `cat $PIDSPATH/$PIDFILE` + kill -TERM `cat $PIDSPATH/$PIDFILE.oldbin` + kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin` + + wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin + removePIDFile $PIDSPATH/$PIDFILE.oldbin + + log_end_msg $SCRIPT_OK + rc=0 + fi else log_end_msg $SCRIPT_ERROR - - log_daemon_msg "ERROR! Reverting back to original $DESCRIPTION" - - kill -HUP `cat $PIDSPATH/$PIDFILE` - kill -TERM `cat $PIDSPATH/$PIDFILE.oldbin` - kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin` - - wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin - removePIDFile $PIDSPATH/$PIDFILE.oldbin - - log_end_msg $SCRIPT_OK - rc=0 - fi - else - log_end_msg $SCRIPT_ERROR - rc=7 - fi - - return - } - - terminate() { - log_daemon_msg "Force terminating (via KILL) $DESCRIPTION" - - PIDS=`pidof $PS` || true - - [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE` - - for i in $PIDS; do - if [ "$i" = "$PIDS2" ]; then - kill $i - wait_for_pid 'removed' $PIDSPATH/$PIDFILE - removePIDFile - fi - done - - log_end_msg $SCRIPT_OK - rc=0 - } - - destroy() { - log_daemon_msg "Force terminating and may include self (via KILLALL) $DESCRIPTION" - killall $PS -q >> /dev/null 2>&1 - log_end_msg $SCRIPT_OK - rc=0 - } - - pidof_daemon() { - PIDS=`pidof $PS` || true - - [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE` - - for i in $PIDS; do - if [ "$i" = "$PIDS2" ]; then - return 1 + rc=7 fi - done - - return 0 - } - - action="$1" - case "$1" in - start) - start - ;; - stop) - stop - ;; - restart|force-reload) - stop - # if [ $rc -ne 0 ]; then - # script_exit - # fi - sleep 1 - start - ;; - reload) - $1 - ;; - status) - status - ;; - configtest) - $1 - ;; - quietupgrade) - $1 - ;; - terminate) - $1 - ;; - destroy) - $1 - ;; - *) - FULLPATH=/etc/init.d/$PS - echo "Usage: $FULLPATH {start|stop|restart|force-reload|reload|status|configtest|quietupgrade|terminate|destroy}" - echo " The 'destroy' command should only be used as a last resort." - exit 3 - ;; - esac - - exit $rc - ``` -+ 根据自己环境,配置文件路径,下面修改为Openresty下的Nginx启动项(Nginx 安装在/opt/openresty/目录下) + + return + } + + terminate() { + log_daemon_msg "Force terminating (via KILL) $DESCRIPTION" + + PIDS=`pidof $PS` || true + + [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE` + + for i in $PIDS; do + if [ "$i" = "$PIDS2" ]; then + kill $i + wait_for_pid 'removed' $PIDSPATH/$PIDFILE + removePIDFile + fi + done + + log_end_msg $SCRIPT_OK + rc=0 + } + + destroy() { + log_daemon_msg "Force terminating and may include self (via KILLALL) $DESCRIPTION" + killall $PS -q >> /dev/null 2>&1 + log_end_msg $SCRIPT_OK + rc=0 + } + + pidof_daemon() { + PIDS=`pidof $PS` || true + + [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE` + + for i in $PIDS; do + if [ "$i" = "$PIDS2" ]; then + return 1 + fi + done + + return 0 + } + + action="$1" + case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|force-reload) + stop + # if [ $rc -ne 0 ]; then + # script_exit + # fi + sleep 1 + start + ;; + reload) + $1 + ;; + status) + status + ;; + configtest) + $1 + ;; + quietupgrade) + $1 + ;; + terminate) + $1 + ;; + destroy) + $1 + ;; + *) + FULLPATH=/etc/init.d/$PS + echo "Usage: $FULLPATH {start|stop|restart|force-reload|reload|status|configtest|quietupgrade|terminate|destroy}" + echo " The 'destroy' command should only be used as a last resort." + exit 3 + ;; + esac + + exit $rc + ``` ++ 根据自己环境,配置文件路径,下面修改为Openresty下的Nginx启动项(Nginx 安装在/usr/local/openresty/目录下) ```bash sudo vim /etc/init.d/nginx - NGINXPATH=${NGINXPATH:-/opt/openresty/nginx} + NGINXPATH=${NGINXPATH:-/usr/local/openresty/nginx} ``` + 开启服务 @@ -576,7 +579,7 @@ ``` ## Ubuntu 16.04.2 LTS 启动脚本 #### PHP-FPM -+ `php-fpm.sh`代码 同上 ++ `php-fpm.sh`脚本代码 同上 + 注意,需要重新加载服务: ``` @@ -587,7 +590,7 @@ ```bash www@TinywanAliYun:~/build$ sudo systemctl start php-fpm.service ``` -#### Nginx +#### Nginx 服务 + `nginx.sh`代码: ```javascript From ca2f9c34c2958dd81e8497e6e891028bfbd5cf5f Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Mon, 23 Oct 2017 16:39:27 +0800 Subject: [PATCH 008/106] Update nginx-start-script.md --- Nginx/nginx-start-script.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Nginx/nginx-start-script.md b/Nginx/nginx-start-script.md index 333c484..bc787bf 100644 --- a/Nginx/nginx-start-script.md +++ b/Nginx/nginx-start-script.md @@ -167,7 +167,7 @@ ``` ### Nginx 服务 -+ **第一种安装方式** ++ 第一种安装方式 + 查看当前nginx是否已经在开机启动项里面: ```bash @@ -578,7 +578,7 @@ * Starting Nginx Server... [ OK ] ``` ## Ubuntu 16.04.2 LTS 启动脚本 -#### PHP-FPM +### PHP-FPM 服务 + `php-fpm.sh`脚本代码 同上 + 注意,需要重新加载服务: @@ -590,7 +590,7 @@ ```bash www@TinywanAliYun:~/build$ sudo systemctl start php-fpm.service ``` -#### Nginx 服务 +### Nginx 服务 + `nginx.sh`代码: ```javascript From f3738f2862a7b010d012aa0efc4791404761a34f Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Mon, 23 Oct 2017 16:53:03 +0800 Subject: [PATCH 009/106] =?UTF-8?q?Update=20nginx-start-script.md=20add=20?= =?UTF-8?q?Nginx=20Ubuntu=2016.04.2=20LTS=20=E5=90=AF=E5=8A=A8=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Nginx/nginx-start-script.md | 79 ++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 10 deletions(-) diff --git a/Nginx/nginx-start-script.md b/Nginx/nginx-start-script.md index bc787bf..8dc1bb5 100644 --- a/Nginx/nginx-start-script.md +++ b/Nginx/nginx-start-script.md @@ -588,16 +588,46 @@ + 开启服务 ```bash - www@TinywanAliYun:~/build$ sudo systemctl start php-fpm.service - ``` + sudo systemctl start php-fpm.service + ``` ++ 停止服务 + + ```javascript + sudo systemctl stop php-fpm.service + ``` ++ 重启服务 + + ```javascript + sudo systemctl restart php-fpm.service + ``` ++ 服务状态 + + ```bash + sudo systemctl status php-fpm.service + ● php-fpm.service - LSB: starts php-fpm + Loaded: loaded (/etc/init.d/php-fpm; bad; vendor preset: enabled) + Active: active (running) since Sun 2017-10-22 11:16:06 CST; 1 day 5h ago + Docs: man:systemd-sysv-generator(8) + CGroup: /system.slice/php-fpm.service + ├─ 7670 php-fpm: pool www + ├─ 7711 php-fpm: pool www + ├─ 7752 php-fpm: pool www + └─18244 php-fpm: master process (/usr/local/php-7.1.8/etc/php-fpm.conf) + + Oct 22 11:16:06 TinywanAliYun php-fpm[18232]: Stopping PHP-FPM Server ... . [OK] + Oct 22 11:16:06 TinywanAliYun systemd[1]: Stopped LSB: starts php-fpm. + Oct 22 11:16:06 TinywanAliYun systemd[1]: Starting LSB: starts php-fpm... + Oct 22 11:16:06 TinywanAliYun php-fpm[18239]: Starting PHP-FPM Server ... [OK] + Oct 22 11:16:06 TinywanAliYun systemd[1]: Started LSB: starts php-fpm. + ``` ### Nginx 服务 + `nginx.sh`代码: ```javascript #!/bin/sh unalias stop - NGINX_CMD="/opt/nginx/sbin/nginx" - NGINX_CONF="/opt/nginx/conf/nginx.conf" + NGINX_CMD="/usr/local/openresty/nginx/sbin/nginx" + NGINX_CONF="/usr/local/openresty/nginx/conf/nginx.conf" RETVAL=0 start() { echo "Starting NGINX Web Server: \c" @@ -630,17 +660,17 @@ esac exit $RETVAL ``` -+ CP到默认开启的服务脚本: ++ CP到默认开启的服务脚本: ``` sudo cp nginx.sh /etc/init.d/nginx ``` -+ 给予权限: ++ 给予权限: ``` sudo chmod +x /etc/init.d/nginx ``` -+ 加载服务: ++ 重新加载服务: ``` sudo systemctl daemon-reload @@ -648,10 +678,39 @@ + 开启服务 ```javascript - sudo systemctl start nginx + sudo systemctl start nginx.service ``` -+ [辅助]`Ubuntu 16.04.2 LTS` 启动脚本`nginx_16.05.sh`,[Nginx官方参考](https://www.nginx.com/resources/wiki/start/topics/tutorials/solaris_11/#startup-script) -+ 参考文章: ++ 停止服务 + + ```javascript + sudo systemctl stop nginx.service + ``` ++ 重启服务 + + ```javascript + sudo systemctl restart nginx.service + ``` ++ 服务状态 + + ```bash + sudo systemctl status nginx.service + ● nginx.service + Loaded: loaded (/etc/init.d/nginx; bad; vendor preset: enabled) + Active: active (running) since Mon 2017-10-23 16:48:24 CST; 1min 28s ago + Docs: man:systemd-sysv-generator(8) + Process: 19089 ExecStop=/etc/init.d/nginx stop (code=exited, status=0/SUCCESS) + Process: 19138 ExecStart=/etc/init.d/nginx start (code=exited, status=0/SUCCESS) + CGroup: /system.slice/nginx.service + ├─19142 nginx: master process /usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.con + ├─19143 nginx: worker process + └─19144 nginx: cache manager process + + Oct 23 16:48:24 TinywanAliYun systemd[1]: Starting nginx.service... + Oct 23 16:48:24 TinywanAliYun nginx[19138]: Starting NGINX Web Server: ok + Oct 23 16:48:24 TinywanAliYun systemd[1]: Started nginx.service. + ``` ++ 参考文章: + + [Nginx官方参考](https://www.nginx.com/resources/wiki/start/topics/tutorials/solaris_11/#startup-script) + [linux wget 命令用法详解(附实例说明)](http://www.jb51.net/LINUXjishu/86326.html) + [理解Linux系统/etc/init.d目录和/etc/rc.local脚本](http://blog.csdn.net/acs713/article/details/7322082) + [Ubuntu启动项设置——之update-rc.d 命令使用](http://blog.csdn.net/typ2004/article/details/38712887) From 203d429a4df28f2a4f7ac1a1a9c57ad400d1f158 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Mon, 23 Oct 2017 16:55:39 +0800 Subject: [PATCH 010/106] Update sudo update-rc.d nginx defaults --- Nginx/nginx-start-script.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Nginx/nginx-start-script.md b/Nginx/nginx-start-script.md index 8dc1bb5..c8a996e 100644 --- a/Nginx/nginx-start-script.md +++ b/Nginx/nginx-start-script.md @@ -670,6 +670,11 @@ ``` sudo chmod +x /etc/init.d/nginx ``` ++ 设置为开机启动项: + + ``` + sudo update-rc.d nginx defaults + ``` + 重新加载服务: ``` From 2149e1440753280b4dced9ed21ccd4c44d4acc14 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Mon, 23 Oct 2017 16:59:30 +0800 Subject: [PATCH 011/106] =?UTF-8?q?Update=20nginx-start-script.md=20add=20?= =?UTF-8?q?Nginx=20Ubuntu=2016.04.2=20LTS=20=E5=90=AF=E5=8A=A8=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Nginx/nginx-start-script.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Nginx/nginx-start-script.md b/Nginx/nginx-start-script.md index c8a996e..728a60d 100644 --- a/Nginx/nginx-start-script.md +++ b/Nginx/nginx-start-script.md @@ -1,8 +1,12 @@ ## 服务启动、停止和重启脚本 -+ [PHP-FPM](#PHP-FPM) -+ [Nginx](#Nginx) -## Ubuntu 14.04.2 LTS 启动脚本 -### PHP-FPM 服务 ++ [Ubuntu 14.04.2 LTS 启动脚本](#Ubuntu14) + + PHP-FPM 服务 + + Nginx 服务 ++ [Ubuntu 16.04.2 LTS 启动脚本](#Ubuntu16) + + PHP-FPM 服务 + + Nginx 服务 +## Ubuntu 14.04.2 LTS 启动脚本 +### PHP-FPM 服务 + 下载文件[php-fpm.sh](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/PHP/PHP-FPM/php-fpm.sh) + 注意配置文件:`sudo vim /usr/local/php-7.2/etc/php-fpm.conf` > 务必开启配置文件的pid路径:`pid = run/php-fpm.pid` @@ -572,13 +576,13 @@ + 开启服务 ```bash - www@tinywan:~$ sudo service nginx restart + sudo service nginx restart [sudo] password for www: * Stopping Nginx Server... [ OK ] * Starting Nginx Server... [ OK ] ``` -## Ubuntu 16.04.2 LTS 启动脚本 -### PHP-FPM 服务 +## Ubuntu 16.04.2 LTS 启动脚本 +### PHP-FPM 服务 + `php-fpm.sh`脚本代码 同上 + 注意,需要重新加载服务: From 158ba52fea3fc528e0a73c747735bd6fbca18b6e Mon Sep 17 00:00:00 2001 From: ShaoBo Wan Date: Sat, 18 Nov 2017 23:39:40 +0800 Subject: [PATCH 012/106] =?UTF-8?q?Nginx=20Proxy=20Cache=20=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=9C=BA=E5=88=B6=20ngx=5Fhttp=5Fproxy=5Fmodule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Nginx/Nginx-Web/Nginx-8-proxy_cache.md | 147 +++++++++++++++++++++++++ Nginx/nginx-high-basic.md | 2 +- 2 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 Nginx/Nginx-Web/Nginx-8-proxy_cache.md diff --git a/Nginx/Nginx-Web/Nginx-8-proxy_cache.md b/Nginx/Nginx-Web/Nginx-8-proxy_cache.md new file mode 100644 index 0000000..27b8f9c --- /dev/null +++ b/Nginx/Nginx-Web/Nginx-8-proxy_cache.md @@ -0,0 +1,147 @@ +## 如何配置proxy_cache模块 ++ [官方:ngx_http_proxy_module](http://nginx.org/en/docs/http/ngx_http_proxy_module.html) ++ 主`Http`模块配置文件 +```bash +user www; +worker_processes 1; + +error_log logs/error.log error; + +pid /run/nginx.pid; + +worker_rlimit_nofile 204800; + +events { + worker_connections 65535; + multi_accept on; + use epoll; +} + +http { + lua_package_path '/usr/local/openresty/lualib/?.lua;/usr/local/openresty/nginx/conf/waf/?.lua;'; + lua_package_cpath '/usr/local/openresty/lualib/?.so;;'; + + init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua"; + access_by_lua_file "/usr/local/openresty/nginx/conf/waf/waf.lua"; + + include mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"' + '"$upstream_cache_status"'; # nginx cache命中率统计 + + charset UTF-8; + client_header_buffer_size 32k; + large_client_header_buffers 4 32k; + + client_header_timeout 100; + client_body_timeout 100; + client_max_body_size 800m; + client_body_buffer_size 512k; + reset_timedout_connection on; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + keepalive_timeout 75 20; + + proxy_connect_timeout 5; + proxy_send_timeout 5; + proxy_read_timeout 60; + # 是否启用或者关闭 proxy_buffer,默认为 on + proxy_buffering on; + # 设置缓存大小,默认4KB、8KB 保持与 proxy_buffers 指令中size变量相同或者更小 + proxy_buffer_size 16k; + # proxy_buffer个数和Buffer大小(一般设置为内存页大小) + proxy_buffers 4 64k; + # 限制处于 BUSY 状态的 proxy_buffer 的总大小 + proxy_busy_buffers_size 128k; + # 所有临时文件总体积大小,磁盘上的临时文件不能超过该配置 + proxy_max_temp_file_size 500MB; + # 配置同时写入临时文件的数据量的总大小 + proxy_temp_file_write_size 128k; + + gzip on; + gzip_min_length 1k; + gzip_buffers 4 64k; + gzip_http_version 1.1; + gzip_comp_level 6; + gzip_types text/plain application/x-javascript text/css application/javascript text/javascript image/jpeg image/gif image/png application/xml application/json; + gzip_vary on; + gzip_disable "MSIE [1-6].(?!.*SV1)"; + + # 文件路径,临时存放代理服务器的大体积响应数据 + proxy_temp_path /home/www/data/nginx/tmp-test; + # 设置WEB缓存区名称为 cache_one ,内存缓存空间大小为100M,一天清理一次,硬盘缓存空间大小为10G + proxy_cache_path /home/www/data/nginx/cache-test levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g; + + index index.php index.html index.htm; + include "/usr/local/openresty/nginx/conf/vhost/*.conf"; +} + +``` ++ 具体虚拟主机`Server`配置文件 + + ```bash + server { + listen 8087; + server_name localhost; + + location / { + # 如果后端的服务器返回500 502 503 504 执行超时等错误,将请求转发到另外一台服务器 + proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; + # 定义用于缓存的共享内存区域 + proxy_cache cache_one; + # 针对不同的HTTP状态码设置不同的缓存时间 + proxy_cache_valid 200 304 1h; + proxy_cache_valid 404 1m; + # WEB缓存的Key值域名、URI、参数组成 + proxy_cache_key $host$uri$is_args$args; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + # 显示缓存的状态 + add_header Nginx-Cache "$upstream_cache_status"; + # 可以禁用一个或多个响应头字段的处理 [Nginx不缓存,可以添加以下语句] + proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; + proxy_pass http://www.tinywan.com; + expires 1d; + } + } + ``` ++ `$upstream_cache_status` 包含以下几种状态 + + ```bash + ·MISS 未命中,请求被传送到后端 + ·HIT 缓存命中 + ·EXPIRED 缓存已经过期请求被传送到后端 + ·UPDATING 正在更新缓存,将使用旧的应答 + ·STALE 后端将得到过期的应答 + ``` + ++ `nginx cache`命中率统计 + + ```bash + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"' + '"$upstream_cache_status"'; + ``` + > 命中率统计方法:用HIT的数量除以日志总量得出缓存命中率 + > `awk '{if($NF==""HIT"") hit++} END {printf "%.2f%",hit/NR}' access.log` + ++ 通过crontab脚本将每天的命中率统计到一个日志中,以备查看 + + ```bash + #!/bin/bash + LOG_FILE='/usr/local/nginx/logs/access.log.1' + LAST_DAY=$(date +%F -d "-1 day") + awk '{if($NF==""HIT"") hit++} END {printf "'$LAST_DAY': %d %d %.2f%n", hit,NR,hit/NR}' $LOG_FILE + ``` ++ 帮助文档 + + [Nginx proxy_cache 缓存配置](http://blog.csdn.net/dengjiexian123/article/details/53386586) + + [Nginx Proxy Cache原理和最佳实践](http://www.jianshu.com/p/625c2b15dad5) + + [nginx缓存设置proxy_cache(PHP)](https://www.cnblogs.com/zlingh/p/5879988.html) \ No newline at end of file diff --git a/Nginx/nginx-high-basic.md b/Nginx/nginx-high-basic.md index 51d3c23..51025c3 100644 --- a/Nginx/nginx-high-basic.md +++ b/Nginx/nginx-high-basic.md @@ -270,7 +270,7 @@ ``` ## 第八章 缓存机制 -+ 测试一 ++ [Proxy Cache 缓存机制](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-8-proxy_cache.md) ## 第九章 Nginx初探1 + 测试一 ## 第十章 Nginx初探1 From c755d543ecbef133442844500ef7acb84d451f08 Mon Sep 17 00:00:00 2001 From: ShaoBo Wan Date: Sat, 18 Nov 2017 23:43:54 +0800 Subject: [PATCH 013/106] =?UTF-8?q?=E5=8F=8D=E5=90=91=E4=BB=A3=E7=90=86=20?= =?UTF-8?q?Nginx=20Proxy=20Cache=20=E7=BC=93=E5=AD=98=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Nginx/Nginx-Web/Nginx-8-proxy_cache.md | 171 ++++++++++++------------- 1 file changed, 85 insertions(+), 86 deletions(-) diff --git a/Nginx/Nginx-Web/Nginx-8-proxy_cache.md b/Nginx/Nginx-Web/Nginx-8-proxy_cache.md index 27b8f9c..aba0c32 100644 --- a/Nginx/Nginx-Web/Nginx-8-proxy_cache.md +++ b/Nginx/Nginx-Web/Nginx-8-proxy_cache.md @@ -1,89 +1,88 @@ ## 如何配置proxy_cache模块 + [官方:ngx_http_proxy_module](http://nginx.org/en/docs/http/ngx_http_proxy_module.html) -+ 主`Http`模块配置文件 -```bash -user www; -worker_processes 1; - -error_log logs/error.log error; - -pid /run/nginx.pid; - -worker_rlimit_nofile 204800; - -events { - worker_connections 65535; - multi_accept on; - use epoll; -} - -http { - lua_package_path '/usr/local/openresty/lualib/?.lua;/usr/local/openresty/nginx/conf/waf/?.lua;'; - lua_package_cpath '/usr/local/openresty/lualib/?.so;;'; - - init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua"; - access_by_lua_file "/usr/local/openresty/nginx/conf/waf/waf.lua"; - - include mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"' - '"$upstream_cache_status"'; # nginx cache命中率统计 - - charset UTF-8; - client_header_buffer_size 32k; - large_client_header_buffers 4 32k; - - client_header_timeout 100; - client_body_timeout 100; - client_max_body_size 800m; - client_body_buffer_size 512k; - reset_timedout_connection on; - - sendfile on; - tcp_nopush on; - tcp_nodelay on; - - keepalive_timeout 75 20; - - proxy_connect_timeout 5; - proxy_send_timeout 5; - proxy_read_timeout 60; - # 是否启用或者关闭 proxy_buffer,默认为 on - proxy_buffering on; - # 设置缓存大小,默认4KB、8KB 保持与 proxy_buffers 指令中size变量相同或者更小 - proxy_buffer_size 16k; - # proxy_buffer个数和Buffer大小(一般设置为内存页大小) - proxy_buffers 4 64k; - # 限制处于 BUSY 状态的 proxy_buffer 的总大小 - proxy_busy_buffers_size 128k; - # 所有临时文件总体积大小,磁盘上的临时文件不能超过该配置 - proxy_max_temp_file_size 500MB; - # 配置同时写入临时文件的数据量的总大小 - proxy_temp_file_write_size 128k; - - gzip on; - gzip_min_length 1k; - gzip_buffers 4 64k; - gzip_http_version 1.1; - gzip_comp_level 6; - gzip_types text/plain application/x-javascript text/css application/javascript text/javascript image/jpeg image/gif image/png application/xml application/json; - gzip_vary on; - gzip_disable "MSIE [1-6].(?!.*SV1)"; - - # 文件路径,临时存放代理服务器的大体积响应数据 - proxy_temp_path /home/www/data/nginx/tmp-test; - # 设置WEB缓存区名称为 cache_one ,内存缓存空间大小为100M,一天清理一次,硬盘缓存空间大小为10G - proxy_cache_path /home/www/data/nginx/cache-test levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g; - - index index.php index.html index.htm; - include "/usr/local/openresty/nginx/conf/vhost/*.conf"; -} - -``` -+ 具体虚拟主机`Server`配置文件 ++ `Http`配置文件 + ```bash + user www; + worker_processes 1; + + error_log logs/error.log error; + + pid /run/nginx.pid; + + worker_rlimit_nofile 204800; + + events { + worker_connections 65535; + multi_accept on; + use epoll; + } + + http { + lua_package_path '/usr/local/openresty/lualib/?.lua;/usr/local/openresty/nginx/conf/waf/?.lua;'; + lua_package_cpath '/usr/local/openresty/lualib/?.so;;'; + + init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua"; + access_by_lua_file "/usr/local/openresty/nginx/conf/waf/waf.lua"; + + include mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"' + '"$upstream_cache_status"'; # nginx cache命中率统计 + + charset UTF-8; + client_header_buffer_size 32k; + large_client_header_buffers 4 32k; + + client_header_timeout 100; + client_body_timeout 100; + client_max_body_size 800m; + client_body_buffer_size 512k; + reset_timedout_connection on; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + keepalive_timeout 75 20; + + proxy_connect_timeout 5; + proxy_send_timeout 5; + proxy_read_timeout 60; + # 是否启用或者关闭 proxy_buffer,默认为 on + proxy_buffering on; + # 设置缓存大小,默认4KB、8KB 保持与 proxy_buffers 指令中size变量相同或者更小 + proxy_buffer_size 16k; + # proxy_buffer个数和Buffer大小(一般设置为内存页大小) + proxy_buffers 4 64k; + # 限制处于 BUSY 状态的 proxy_buffer 的总大小 + proxy_busy_buffers_size 128k; + # 所有临时文件总体积大小,磁盘上的临时文件不能超过该配置 + proxy_max_temp_file_size 500MB; + # 配置同时写入临时文件的数据量的总大小 + proxy_temp_file_write_size 128k; + + gzip on; + gzip_min_length 1k; + gzip_buffers 4 64k; + gzip_http_version 1.1; + gzip_comp_level 6; + gzip_types text/plain application/x-javascript text/css application/javascript text/javascript image/jpeg image/gif image/png application/xml application/json; + gzip_vary on; + gzip_disable "MSIE [1-6].(?!.*SV1)"; + + # 文件路径,临时存放代理服务器的大体积响应数据 + proxy_temp_path /home/www/data/nginx/tmp-test; + # 设置WEB缓存区名称为 cache_one ,内存缓存空间大小为100M,一天清理一次,硬盘缓存空间大小为10G + proxy_cache_path /home/www/data/nginx/cache-test levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g; + + index index.php index.html index.htm; + include "/usr/local/openresty/nginx/conf/vhost/*.conf"; + } + ``` ++ `Server`配置文件 ```bash server { @@ -121,7 +120,6 @@ http { ·UPDATING 正在更新缓存,将使用旧的应答 ·STALE 后端将得到过期的应答 ``` - + `nginx cache`命中率统计 ```bash @@ -130,7 +128,8 @@ http { '"$http_user_agent" "$http_x_forwarded_for"' '"$upstream_cache_status"'; ``` - > 命中率统计方法:用HIT的数量除以日志总量得出缓存命中率 + > 命中率统计方法:用HIT的数量除以日志总量得出缓存命中率 + > `awk '{if($NF==""HIT"") hit++} END {printf "%.2f%",hit/NR}' access.log` + 通过crontab脚本将每天的命中率统计到一个日志中,以备查看 From 150f17b4bc5d09f6bd089576cd75b46d40a13f19 Mon Sep 17 00:00:00 2001 From: ShaoBo Wan Date: Sat, 18 Nov 2017 23:53:30 +0800 Subject: [PATCH 014/106] ngx_http_proxy_module --- Nginx/Nginx-Web/Nginx-8-proxy_cache.md | 41 ++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/Nginx/Nginx-Web/Nginx-8-proxy_cache.md b/Nginx/Nginx-Web/Nginx-8-proxy_cache.md index aba0c32..c106db4 100644 --- a/Nginx/Nginx-Web/Nginx-8-proxy_cache.md +++ b/Nginx/Nginx-Web/Nginx-8-proxy_cache.md @@ -111,6 +111,47 @@ } } ``` ++ 配置测试 + + 打印响应头 + ```bash + www@TinywanAliYun:$ curl -I http://127.0.0.1:8087/ + HTTP/1.1 200 OK + Server: openresty/1.11.2.5 + Date: Sat, 18 Nov 2017 15:46:55 GMT + Content-Type: text/html; charset=utf-8 + Connection: keep-alive + Keep-Alive: timeout=20 + Vary: Accept-Encoding + Expires: Sun, 19 Nov 2017 15:46:55 GMT + Cache-Control: max-age=86400 + Pragma: no-cache + Nginx-Cache: HIT + ``` + + 缓存目录 + ```bash + www@TinywanAliYun:~/data/nginx/cache-test$ tree -L 4 + . + ├── 0 + │   └── 49 + │   └── 51ab3cb31fd7929a0346796693d53490 + └── 9 + └── f4 + └── 3a020dc16513d3abee9ba74688d53f49 + + 4 directories, 2 files + www@TinywanAliYun:~/data/nginx/cache-test$ cat 0/49/51ab3cb31fd7929a0346796693d53490 + ³QZݵǘ£CZC°(±"58c8b5dd-423e" + KEY: 127.0.0.1/favicon.ico // 代理服务IP地址 + HTTP/1.1 200 OK + Server: nginx/1.6.0 // 被代理服务器信息 + Date: Sat, 18 Nov 2017 14:28:51 GMT + Content-Type: image/x-icon + Content-Length: 16958 + Last-Modified: Wed, 15 Mar 2017 03:32:45 GMT + Connection: close + ETag: "58c8b5dd-423e" + Accept-Ranges: bytes + ``` + `$upstream_cache_status` 包含以下几种状态 ```bash From 6f36952ee03ce42c128605478374812f7dc548d8 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Tue, 21 Nov 2017 13:35:33 +0800 Subject: [PATCH 015/106] Ubuntu 16.04.2 LTS --- Nginx/nginx-start-script.md | 89 ++++++++++++++++++++++++------------- 1 file changed, 58 insertions(+), 31 deletions(-) diff --git a/Nginx/nginx-start-script.md b/Nginx/nginx-start-script.md index 728a60d..fadfe79 100644 --- a/Nginx/nginx-start-script.md +++ b/Nginx/nginx-start-script.md @@ -629,40 +629,67 @@ ```javascript #!/bin/sh - unalias stop - NGINX_CMD="/usr/local/openresty/nginx/sbin/nginx" - NGINX_CONF="/usr/local/openresty/nginx/conf/nginx.conf" - RETVAL=0 - start() { - echo "Starting NGINX Web Server: \c" - $NGINX_CMD -c $NGINX_CONF & - RETVAL=$? - [ $RETVAL -eq 0 ] && echo "ok" || echo "failed" - return $RETVAL - } - stop() { - echo "Stopping NGINX Web Server: \c" - $NGINX_CMD -s quit - RETVAL=$? - [ $RETVAL -eq 0 ] && echo "ok" || echo "failed" - return $RETVAL - } + + ### BEGIN INIT INFO + # Provides: nginx + # Required-Start: $all + # Required-Stop: $all + # Default-Start: 2 3 4 5 + # Default-Stop: 0 1 6 + # Short-Description: starts the nginx web server + # Description: starts nginx using start-stop-daemon + ### END INIT INFO + + PATH=/opt/bin:/opt/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + DAEMON=/usr/local/openresty/nginx/sbin/nginx + NAME=nginx + DESC=nginx + + test -x $DAEMON || exit 0 + + # Include nginx defaults if available + if [ -f /etc/default/nginx ] ; then + . /etc/default/nginx + fi + + set -e + case "$1" in - start) - start - ;; - stop) - stop - ;; - restart) - stop - start + start) + echo -n "Starting $DESC: " + start-stop-daemon --start --quiet --pidfile /var/run/nginx.pid \ + --exec $DAEMON -- $DAEMON_OPTS + echo "$NAME." + ;; + stop) + echo -n "Stopping $DESC: " + start-stop-daemon --stop --quiet --pidfile /var/run/nginx.pid \ + --exec $DAEMON + echo "$NAME." + ;; + restart|force-reload) + echo -n "Restarting $DESC: " + start-stop-daemon --stop --quiet --pidfile \ + /var/run/nginx.pid --exec $DAEMON + sleep 1 + start-stop-daemon --start --quiet --pidfile \ + /var/run/nginx.pid --exec $DAEMON -- $DAEMON_OPTS + echo "$NAME." + ;; + reload) + echo -n "Reloading $DESC configuration: " + start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/nginx.pid \ + --exec $DAEMON + echo "$NAME." ;; - *) - echo "Usage: $0 {start|stop|restart}" - exit 1 + *) + N=/etc/init.d/$NAME + echo "Usage: $N {start|stop|restart|force-reload}" >&2 + exit 1 + ;; esac - exit $RETVAL + + exit 0 ``` + CP到默认开启的服务脚本: From d10dbb958a93b2e3d142f7c9e403c6e064cd910d Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Tue, 21 Nov 2017 13:35:49 +0800 Subject: [PATCH 016/106] Ubuntu 16.04.2 LTS Debian/Ubuntu Nginx init Script --- Nginx/nginx-start-script.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Nginx/nginx-start-script.md b/Nginx/nginx-start-script.md index fadfe79..0eafbd1 100644 --- a/Nginx/nginx-start-script.md +++ b/Nginx/nginx-start-script.md @@ -625,6 +625,7 @@ Oct 22 11:16:06 TinywanAliYun systemd[1]: Started LSB: starts php-fpm. ``` ### Nginx 服务 ++ [Debian/Ubuntu Nginx init Script](http://kbeezie.com/debian-ubuntu-nginx-init-script/) + `nginx.sh`代码: ```javascript From 1cc5fb28c22504e646eee9061d97a498f47f28ef Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Tue, 21 Nov 2017 13:38:40 +0800 Subject: [PATCH 017/106] Ubuntu 16.04.2 LTS Debian/Ubuntu Nginx init Script --- Nginx/nginx-start-script.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Nginx/nginx-start-script.md b/Nginx/nginx-start-script.md index 0eafbd1..d667548 100644 --- a/Nginx/nginx-start-script.md +++ b/Nginx/nginx-start-script.md @@ -625,7 +625,11 @@ Oct 22 11:16:06 TinywanAliYun systemd[1]: Started LSB: starts php-fpm. ``` ### Nginx 服务 -+ [Debian/Ubuntu Nginx init Script](http://kbeezie.com/debian-ubuntu-nginx-init-script/) ++ [Debian/Ubuntu Nginx init Script](http://kbeezie.com/debian-ubuntu-nginx-init-script/) + + > [1]通常情况下,如果你从存储库安装Nginx,这个初始化脚本已经包含在内。但是,如果您从源代码安装,或者没有使用标准路径,您可能需要这个。 + [2]如果发现停止/重新启动等不起作用,则您的pid文件位置可能不正确。您可以将其设置在nginx.conf中,也可以在此处更改init脚本以指向正确的pid位置 + + `nginx.sh`代码: ```javascript From e62cce539674cdaa6386ea68b0559049b51721a3 Mon Sep 17 00:00:00 2001 From: ShaoBo Wan Date: Thu, 23 Nov 2017 19:16:05 +0800 Subject: [PATCH 018/106] Third-party module --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a8725ce..e918a5b 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,21 @@ ## 目录 -+ Nginx 教程 ++ Nginx tutorial (Nginx 教程) + [Nginx编译安装](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-install.md) + [Nginx.conf详解和配置](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-base-config.md) + [Nginx基础知识](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-basic.md) + [Nginx高性能WEB服务器详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-high-basic.md) + [Nginx高并发系统内核优化和PHP7配置文件优化](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-parameter-config.md) + [Nginx和PHP-FPM启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-start-script.md) - + 项目案例 + + Project notes (项目案例) + [Nginx 同一个IP上配置多个HTTPS主机](https://github.com/Tinywan/lua-nginx-redis/blob/master/Nginx/more-domain-config.md) + + [如何配置一个安全的HTTPS网站服务器](http://www.cnblogs.com/tinywan/p/7542629.html) + + [Web 服务启用 HTTP/2](http://www.cnblogs.com/tinywan/p/7860774.html) + + Third-party module (扩展模块) + + [nginx-vod-module](http://www.cnblogs.com/tinywan/p/7879559.html) + + [nginx-module-vts](http://www.cnblogs.com/tinywan/p/7872366.html) + + [ngx_cache_purge](http://www.cnblogs.com/tinywan/p/7864935.html) + + [lua-nginx-module](http://www.cnblogs.com/tinywan/p/6538006.html) + + [nginx-rtmp-module](http://www.cnblogs.com/tinywan/p/6639360.html) + Lua 教程 + [Lua 基础语法](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Lua-Script/lua-basic.md) + [luajit 执行文件默认安装路径](#Nginx_base_knowledge) From 14df2cf23d897ba5bd9c4d28392b70bb0d0eb33d Mon Sep 17 00:00:00 2001 From: ShaoBo Wan Date: Thu, 23 Nov 2017 19:17:30 +0800 Subject: [PATCH 019/106] Project notes --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e918a5b..63b29a2 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ ## 目录 -+ Nginx tutorial (Nginx 教程) ++ Nginx 教程(Nginx tutorial) + [Nginx编译安装](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-install.md) + [Nginx.conf详解和配置](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-base-config.md) + [Nginx基础知识](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-basic.md) + [Nginx高性能WEB服务器详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-high-basic.md) + [Nginx高并发系统内核优化和PHP7配置文件优化](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-parameter-config.md) + [Nginx和PHP-FPM启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-start-script.md) - + Project notes (项目案例) + + 项目案例(Project notes) + [Nginx 同一个IP上配置多个HTTPS主机](https://github.com/Tinywan/lua-nginx-redis/blob/master/Nginx/more-domain-config.md) + [如何配置一个安全的HTTPS网站服务器](http://www.cnblogs.com/tinywan/p/7542629.html) + [Web 服务启用 HTTP/2](http://www.cnblogs.com/tinywan/p/7860774.html) - + Third-party module (扩展模块) + + 扩展模块(Third-party module) + [nginx-vod-module](http://www.cnblogs.com/tinywan/p/7879559.html) + [nginx-module-vts](http://www.cnblogs.com/tinywan/p/7872366.html) + [ngx_cache_purge](http://www.cnblogs.com/tinywan/p/7864935.html) From c9f0f0e15dbf3d08ee980333f46c8212d105f275 Mon Sep 17 00:00:00 2001 From: ShaoBo Wan Date: Thu, 23 Nov 2017 19:20:37 +0800 Subject: [PATCH 020/106] https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-8-proxy_cache.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 63b29a2..12a3c84 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ + 扩展模块(Third-party module) + [nginx-vod-module](http://www.cnblogs.com/tinywan/p/7879559.html) + [nginx-module-vts](http://www.cnblogs.com/tinywan/p/7872366.html) - + [ngx_cache_purge](http://www.cnblogs.com/tinywan/p/7864935.html) + + [ngx_cache_purge](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-8-proxy_cache.md) + [lua-nginx-module](http://www.cnblogs.com/tinywan/p/6538006.html) + [nginx-rtmp-module](http://www.cnblogs.com/tinywan/p/6639360.html) + Lua 教程 From 7d69f78a707b7a1a5157609f518a69638de37768 Mon Sep 17 00:00:00 2001 From: ShaoBo Wan Date: Thu, 23 Nov 2017 19:23:32 +0800 Subject: [PATCH 021/106] Third-party module --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 12a3c84..7f6c152 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ ## 目录 -+ Nginx 教程(Nginx tutorial) ++ Nginx 教程 (Nginx tutorial) + [Nginx编译安装](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-install.md) + [Nginx.conf详解和配置](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-base-config.md) + [Nginx基础知识](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-basic.md) + [Nginx高性能WEB服务器详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-high-basic.md) + [Nginx高并发系统内核优化和PHP7配置文件优化](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-parameter-config.md) + [Nginx和PHP-FPM启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-start-script.md) - + 项目案例(Project notes) + + 项目案例 (Project notes) + [Nginx 同一个IP上配置多个HTTPS主机](https://github.com/Tinywan/lua-nginx-redis/blob/master/Nginx/more-domain-config.md) - + [如何配置一个安全的HTTPS网站服务器](http://www.cnblogs.com/tinywan/p/7542629.html) - + [Web 服务启用 HTTP/2](http://www.cnblogs.com/tinywan/p/7860774.html) - + 扩展模块(Third-party module) + + [Nginx 如何配置一个安全的HTTPS网站服务器](http://www.cnblogs.com/tinywan/p/7542629.html) + + [Nginx 配置启用 HTTP/2](http://www.cnblogs.com/tinywan/p/7860774.html) + + 扩展模块 (Third-party module) + [nginx-vod-module](http://www.cnblogs.com/tinywan/p/7879559.html) + [nginx-module-vts](http://www.cnblogs.com/tinywan/p/7872366.html) + [ngx_cache_purge](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-8-proxy_cache.md) From 179c6a050428244ed217b1457d0628bff5ca3906 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 29 Nov 2017 10:27:01 +0800 Subject: [PATCH 022/106] wechat.png --- Images/alipay.png | Bin 0 -> 43635 bytes Images/wechat.png | Bin 0 -> 28168 bytes README.md | 71 ++++------------------------------------------ 3 files changed, 5 insertions(+), 66 deletions(-) create mode 100644 Images/alipay.png create mode 100644 Images/wechat.png diff --git a/Images/alipay.png b/Images/alipay.png new file mode 100644 index 0000000000000000000000000000000000000000..e26b227f3abf1602741f7cd5d3d1c0fe4d11c7c9 GIT binary patch literal 43635 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 S7eUlBX{qU`7OMRH^nU>?Seax1 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 7f6c152..b671bb4 100644 --- a/README.md +++ b/README.md @@ -50,73 +50,12 @@ + 流媒体教程 + [Nginx配置Rtmp支持Hls的直播和点播功能](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/HLS-live-vod.md) + [HLS视频直播和点播的Nginx的Location的配置信息(成功)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/HLS-live-vod-locatiuon-config.md) -## 开发过程记录 -## Visual Studio Code 向github提交代码不用输入帐号密码 -+ 在命令行输入以下命令 - ``` - git config --global credential.helper store - ``` - > 这一步会在用户目录下的.gitconfig文件最后添加: - ``` - [credential] - helper = store - ``` -+ push 代码 - > push你的代码 (git push), 这时会让你输入用户名和密码, 这一步输入的用户名密码会被记住, 下次再push代码时就不用输入用户名密码!这一步会在用户目录下生成文件.git-credential记录用户名密码的信息。 -+ Markdown 的超级链接技术 - > 【1】需要链接的地址: - ``` - [解决向github提交代码不用输入帐号密码](#githubpush) - ``` - > 【2】要链接到的地方: - ``` - 解决向github提交代码不用输入帐号密码 - ``` - > 通过【1】和【2】可以很完美的实现一个连接哦! -# 掘金爬虫 -![Markdown](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/github_good1.png) - -# Lua-Ngx +## Lua-Ngx ![Markdown](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/Nginx-Phase.png) -# Live demo - -Changes are automatically rendered as you type. - -* Follows the [CommonMark](http://commonmark.org/) spec -* Renders actual, "native" React DOM elements -* Allows you to escape or skip HTML (try toggling the checkboxes above) -* If you escape or skip the HTML, no `dangerouslySetInnerHTML` is used! Yay! - -## HTML block below - -

- This blockquote will change based on the HTML settings above. -
- -## How about some code? -```js -var React = require('react'); -var Markdown = require('react-markdown'); - -React.render( - , - document.getElementById('content') -); -``` - -Pretty neat, eh? - -## More info? - -Read usage information and more on [GitHub](//github.com/rexxars/react-markdown) - ---------------- - -A component by [VaffelNinja](http://vaffel.ninja) / Espen Hovlandsdal - -## Copyright and License -This module is licensed under the BSD license +## 随意打赏我 -Copyright (C) 2017, by Wanshaobo "Tinywan". \ No newline at end of file +|支付宝打赏|微信打赏| +|:----:|:----:| +|![image](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/alipay.png)|![image](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/wechat.png)| \ No newline at end of file From a74e46b9c04d98c1092051b7ab4d5afa8a0b2e84 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 29 Nov 2017 10:31:58 +0800 Subject: [PATCH 023/106] image --- Images/alipay.png | Bin 43635 -> 30568 bytes Images/wechat.png | Bin 28168 -> 13943 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Images/alipay.png b/Images/alipay.png index e26b227f3abf1602741f7cd5d3d1c0fe4d11c7c9..64b635b2b9f9f965d83d2ff615af4058c300ceee 100644 GIT binary patch literal 30568 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 wgg0=2j)^*GXMYp literal 43635 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 bzEdwCO`dqnB?254!+I+JT&@si8uWhv1AC!^ literal 28168 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 S7eUlBX{qU`7OMRH^nU>?Seax1 From 8ffec370f61ae1c2261661d0672019505c6837f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ShaoBo=20Wan=28=E6=97=A0=E6=9E=81=29?= Date: Thu, 30 Nov 2017 10:28:10 +0800 Subject: [PATCH 024/106] Set theme jekyll-theme-time-machine --- _config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 _config.yml diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..ddeb671 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-time-machine \ No newline at end of file From 97158fde32741ee28a5629a590255b5f0900e573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ShaoBo=20Wan=28=E6=97=A0=E6=9E=81=29?= Date: Thu, 30 Nov 2017 10:31:38 +0800 Subject: [PATCH 025/106] Set theme jekyll-theme-cayman --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index ddeb671..c419263 100644 --- a/_config.yml +++ b/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-time-machine \ No newline at end of file +theme: jekyll-theme-cayman \ No newline at end of file From 58a0cdccc44cf1283ef71e283b835820ba419e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ShaoBo=20Wan=28=E6=97=A0=E6=9E=81=29?= Date: Thu, 30 Nov 2017 10:36:33 +0800 Subject: [PATCH 026/106] Set theme jekyll-theme-merlot --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index c419263..c50ff38 100644 --- a/_config.yml +++ b/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-cayman \ No newline at end of file +theme: jekyll-theme-merlot \ No newline at end of file From 42967382cce280ca0baec91c01b1691dfcffa671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ShaoBo=20Wan=28=E6=97=A0=E6=9E=81=29?= Date: Thu, 30 Nov 2017 10:36:57 +0800 Subject: [PATCH 027/106] Set theme jekyll-theme-cayman --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index c50ff38..c419263 100644 --- a/_config.yml +++ b/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-merlot \ No newline at end of file +theme: jekyll-theme-cayman \ No newline at end of file From bfcc2d3e8178324e9ec80883e22f257108a46765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ShaoBo=20Wan=28=E6=97=A0=E6=9E=81=29?= Date: Thu, 30 Nov 2017 10:37:12 +0800 Subject: [PATCH 028/106] Set theme jekyll-theme-merlot --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index c419263..c50ff38 100644 --- a/_config.yml +++ b/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-cayman \ No newline at end of file +theme: jekyll-theme-merlot \ No newline at end of file From 305f42f4e459b3d55d8270db16c86abbfc8320fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ShaoBo=20Wan=28=E6=97=A0=E6=9E=81=29?= Date: Thu, 30 Nov 2017 10:37:49 +0800 Subject: [PATCH 029/106] Set theme jekyll-theme-cayman --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index c50ff38..c419263 100644 --- a/_config.yml +++ b/_config.yml @@ -1 +1 @@ -theme: jekyll-theme-merlot \ No newline at end of file +theme: jekyll-theme-cayman \ No newline at end of file From 660201457b57a2268d25982af09dfc82589823f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ShaoBo=20Wan=28=E6=97=A0=E6=9E=81=29?= Date: Thu, 30 Nov 2017 10:51:24 +0800 Subject: [PATCH 030/106] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..83dea21 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 ShaoBo Wan(无极) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 15c44311ad958e6c1f4dd1605749eacad0f1c750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ShaoBo=20Wan=28=E6=97=A0=E6=9E=81=29?= Date: Thu, 30 Nov 2017 16:32:25 +0800 Subject: [PATCH 031/106] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b671bb4..e859d97 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +![Author](https://img.shields.io/badge/Author-Tinywan-green.svg) +[![Conda](https://img.shields.io/conda/pn/conda-forge/python.svg)]() +[![GitHub license](https://img.shields.io/github/license/Tinywan/tinywan-react-app.svg)](https://github.com/Tinywan/tinywan-react-app/blob/master/LICENSE) ## 目录 + Nginx 教程 (Nginx tutorial) + [Nginx编译安装](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-install.md) @@ -58,4 +61,4 @@ |支付宝打赏|微信打赏| |:----:|:----:| -|![image](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/alipay.png)|![image](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/wechat.png)| \ No newline at end of file +|![image](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/alipay.png)|![image](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/wechat.png)| From b6d96afccf6c8c47b5da08210f9de13654713a1c Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 10:00:53 +0800 Subject: [PATCH 032/106] /Nginx/nginx-install.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e859d97..d39eebc 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![GitHub license](https://img.shields.io/github/license/Tinywan/tinywan-react-app.svg)](https://github.com/Tinywan/tinywan-react-app/blob/master/LICENSE) ## 目录 + Nginx 教程 (Nginx tutorial) - + [Nginx编译安装](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-install.md) + + [Nginx编译安装](/Nginx/nginx-install.md) + [Nginx.conf详解和配置](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-base-config.md) + [Nginx基础知识](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-basic.md) + [Nginx高性能WEB服务器详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-high-basic.md) From 8aa7bf5826069deeeb61013b6f691d5c01eabaf0 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 10:11:36 +0800 Subject: [PATCH 033/106] doc page --- doc/index.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 doc/index.md diff --git a/doc/index.md b/doc/index.md new file mode 100644 index 0000000..8dfe4ee --- /dev/null +++ b/doc/index.md @@ -0,0 +1,8 @@ ++ Nginx 教程 (Nginx tutorial) + + [Nginx编译安装](/Nginx/nginx-install.md) + + [Nginx.conf详解和配置](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-base-config.md) + + [Nginx基础知识](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-basic.md) + + [Nginx高性能WEB服务器详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-high-basic.md) + + [Nginx高并发系统内核优化和PHP7配置文件优化](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-parameter-config.md) + + [Nginx和PHP-FPM启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-start-script.md) + + 项目案例 (Project notes) \ No newline at end of file From 102013e6cdd1840fbe23926b1e0ff50b8088d9dc Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 10:12:39 +0800 Subject: [PATCH 034/106] docs filder page --- {doc => docs}/index.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {doc => docs}/index.md (100%) diff --git a/doc/index.md b/docs/index.md similarity index 100% rename from doc/index.md rename to docs/index.md From 868d5844d84448a3834a840b0cc2fe3e5a28bcac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ShaoBo=20Wan=28=E6=97=A0=E6=9E=81=29?= Date: Wed, 6 Dec 2017 10:12:55 +0800 Subject: [PATCH 035/106] Set theme jekyll-theme-cayman --- docs/_config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/_config.yml diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000..c419263 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file From 210eb2d7d6408afab4e5cd7ac87bbef270a829b6 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 10:16:23 +0800 Subject: [PATCH 036/106] docs folder path page --- docs/Nginx/Nginx-Web/Nginx-2-4-all-config.md | 75 ++ .../Nginx/Nginx-Web/Nginx-2-4-basic-config.md | 302 +++++++ docs/Nginx/Nginx-Web/Nginx-2-4-log-cut.md | 172 ++++ docs/Nginx/Nginx-Web/Nginx-2-Log.md | 49 ++ docs/Nginx/Nginx-Web/Nginx-6-ReWrite-1.md | 78 ++ docs/Nginx/Nginx-Web/Nginx-7-Proxy-1.md | 20 + docs/Nginx/Nginx-Web/Nginx-7-Proxy.md | 262 ++++++ docs/Nginx/Nginx-Web/Nginx-8-proxy_cache.md | 187 +++++ docs/Nginx/Nginx-Web/Nginx-8-tcp-Proxy.md | 20 + .../Nginx-Web/openresty-nginx-lua-Proxy.md | 345 ++++++++ docs/Nginx/more-domain-config.md | 147 ++++ docs/Nginx/nginx | 408 ++++++++++ docs/Nginx/nginx-1-config.md | 96 +++ docs/Nginx/nginx-2-config.md | 114 +++ docs/Nginx/nginx-base-config.md | 366 +++++++++ docs/Nginx/nginx-basic.md | 48 ++ docs/Nginx/nginx-high-basic.md | 277 +++++++ docs/Nginx/nginx-install.md | 212 +++++ docs/Nginx/nginx-parameter-config.md | 425 ++++++++++ docs/Nginx/nginx-phases.md | 155 ++++ docs/Nginx/nginx-start-script.md | 757 ++++++++++++++++++ docs/index.md | 12 +- 22 files changed, 4520 insertions(+), 7 deletions(-) create mode 100644 docs/Nginx/Nginx-Web/Nginx-2-4-all-config.md create mode 100644 docs/Nginx/Nginx-Web/Nginx-2-4-basic-config.md create mode 100644 docs/Nginx/Nginx-Web/Nginx-2-4-log-cut.md create mode 100644 docs/Nginx/Nginx-Web/Nginx-2-Log.md create mode 100644 docs/Nginx/Nginx-Web/Nginx-6-ReWrite-1.md create mode 100644 docs/Nginx/Nginx-Web/Nginx-7-Proxy-1.md create mode 100644 docs/Nginx/Nginx-Web/Nginx-7-Proxy.md create mode 100644 docs/Nginx/Nginx-Web/Nginx-8-proxy_cache.md create mode 100644 docs/Nginx/Nginx-Web/Nginx-8-tcp-Proxy.md create mode 100644 docs/Nginx/Nginx-Web/openresty-nginx-lua-Proxy.md create mode 100644 docs/Nginx/more-domain-config.md create mode 100644 docs/Nginx/nginx create mode 100644 docs/Nginx/nginx-1-config.md create mode 100644 docs/Nginx/nginx-2-config.md create mode 100644 docs/Nginx/nginx-base-config.md create mode 100644 docs/Nginx/nginx-basic.md create mode 100644 docs/Nginx/nginx-high-basic.md create mode 100644 docs/Nginx/nginx-install.md create mode 100644 docs/Nginx/nginx-parameter-config.md create mode 100644 docs/Nginx/nginx-phases.md create mode 100644 docs/Nginx/nginx-start-script.md diff --git a/docs/Nginx/Nginx-Web/Nginx-2-4-all-config.md b/docs/Nginx/Nginx-Web/Nginx-2-4-all-config.md new file mode 100644 index 0000000..6ed123e --- /dev/null +++ b/docs/Nginx/Nginx-Web/Nginx-2-4-all-config.md @@ -0,0 +1,75 @@ + +#### Nginx服务器基础配置命令 +--- ++ 基于域名的虚拟主机配置 + + 语法格式: + ``` + server_name name name2 name3 ... # 可以有一个或者多个名称并列,之间用空格隔开 + ``` + + 普通案例: + ``` + server_name www.tinywan.com www.redis.com # 第一个名称作为虚拟主机的主要名称 + ``` + + 通配符案例: + ``` + server_name *.tinywan.com www.redis.* # 通配符只能用在域名字符串名称的手段或尾端 + ``` + + 正则匹配案例: + ``` + server_name ~^www\d+\.tinywan.com$ + ``` + > 波浪号 ` ~ ` 作为正则表达式字符串的开始标记 + > 正则表达式含义: + >>` ^www ` 以 www 开头 + >>` \d+ ` ,`\d` 代表 0 ~ 9 的某一个数字,`+` 表示以前的字符出现一次或者多次 + >>`\.` ,由于`.`在正则表达式有特殊含义,因此需要转义字符`\`进行转义 + >> ` m$` 表示一个m结束 + + + 访问服务器域名 + > 可以访问 + ``` + www1.tinywan.com + ``` + + > 不可以访问 + ``` + www.tinywan.com + ``` ++ 基于IP的虚拟主机配置 + + 本机IP地址为: `192.168.127.129` + + 添加 IP 别名 (`192.168.127.131` 和 `192.168.127.141`) + ``` + sudo ifconfig ens33:0 192.168.127.131 netmask 255.255.255.0 up + + sudo ifconfig ens33:1 192.168.127.141 netmask 255.255.255.0 up + ``` + + 将以上两条命令添加到Linux 系统的启动脚本rc.local 中,系统重启后,ens33 的别名就自动设置好了(注意:sudo 权限) + ``` + echo "ifconfig ens33:1 192.168.127.131 netmask 255.255.255.0 up" >> /etc/rc.local + + echo "ifconfig ens33:1 192.168.127.131 netmask 255.255.255.0 up" >> /etc/rc.local + ``` + + /etc/rc.local 解释 + >在Linux启动的最后阶段,系统会执行存于rc.local中的命令 + + + 配置虚拟主机 + ``` + server { + listen 80; + server_name 192.168.127.131; + location / { + root /usr/local/nginx/html2; + } + } + + server { + listen 80; + server_name 192.168.127.141; + location / { + root /usr/local/nginx/html3; + } + } + ``` + + + diff --git a/docs/Nginx/Nginx-Web/Nginx-2-4-basic-config.md b/docs/Nginx/Nginx-Web/Nginx-2-4-basic-config.md new file mode 100644 index 0000000..d6dc13a --- /dev/null +++ b/docs/Nginx/Nginx-Web/Nginx-2-4-basic-config.md @@ -0,0 +1,302 @@ + +#### 基础配置文件 +--- ++ 完整基础配置nginx.conf +``` +user www www; ## Default: nobody +worker_processes 5; ## Default: 1 +error_log logs/error.log; +pid logs/nginx.pid; +worker_rlimit_nofile 8192; + +events { + worker_connections 4096; ## Default: 1024 +} + +http { + include conf/mime.types; + include /etc/nginx/proxy.conf; + include /etc/nginx/fastcgi.conf; + index index.html index.htm index.php; + + default_type application/octet-stream; + log_format main '$remote_addr - $remote_user [$time_local] $status ' + '"$request" $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + access_log logs/access.log main; + sendfile on; + tcp_nopush on; + server_names_hash_bucket_size 128; # this seems to be required for some vhosts + + server { # php/fastcgi + listen 80; + server_name domain1.com www.domain1.com; + access_log logs/domain1.access.log main; + root html; + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:1025; + } + } + + server { # simple reverse-proxy + listen 80; + server_name domain2.com www.domain2.com; + access_log logs/domain2.access.log main; + + # serve static files + location ~ ^/(images|javascript|js|css|flash|media|static)/ { + root /var/www/virtual/big.server.com/htdocs; + expires 30d; + } + + # pass requests for dynamic content to rails/turbogears/zope, et al + location / { + proxy_pass http://127.0.0.1:8080; + } + } + + upstream big_server_com { + server 127.0.0.3:8000 weight=5; + server 127.0.0.3:8001 weight=5; + server 192.168.0.1:8000; + server 192.168.0.1:8001; + } + + server { # simple load balancing + listen 80; + server_name big.server.com; + access_log logs/big.server.access.log main; + + location / { + proxy_pass http://big_server_com; + } + } +} +``` ++ proxy_conf 扩展参数 +``` +proxy_redirect off; +proxy_set_header Host $host; +proxy_set_header X-Real-IP $remote_addr; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +client_max_body_size 10m; +client_body_buffer_size 128k; +proxy_connect_timeout 90; +proxy_send_timeout 90; +proxy_read_timeout 90; +proxy_buffers 32 4k; +``` ++ fastcgi_conf 扩展参数 +``` +fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; +fastcgi_param QUERY_STRING $query_string; +fastcgi_param REQUEST_METHOD $request_method; +fastcgi_param CONTENT_TYPE $content_type; +fastcgi_param CONTENT_LENGTH $content_length; +fastcgi_param SCRIPT_NAME $fastcgi_script_name; +fastcgi_param REQUEST_URI $request_uri; +fastcgi_param DOCUMENT_URI $document_uri; +fastcgi_param DOCUMENT_ROOT $document_root; +fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param GATEWAY_INTERFACE CGI/1.1; +fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; +fastcgi_param REMOTE_ADDR $remote_addr; +fastcgi_param REMOTE_PORT $remote_port; +fastcgi_param SERVER_ADDR $server_addr; +fastcgi_param SERVER_PORT $server_port; +fastcgi_param SERVER_NAME $server_name; + +fastcgi_index index.php; + +fastcgi_param REDIRECT_STATUS 200; 32 4k; +``` ++ mime_types 扩展参数 +``` +types { + text/html html htm shtml; + text/css css; + text/xml xml rss; + image/gif gif; + image/jpeg jpeg jpg; + application/x-javascript js; + text/plain txt; + text/x-component htc; + text/mathml mml; + image/png png; + image/x-icon ico; + image/x-jng jng; + image/vnd.wap.wbmp wbmp; + application/java-archive jar war ear; + application/mac-binhex40 hqx; + application/pdf pdf; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/zip zip; + application/octet-stream deb; + application/octet-stream bin exe dll; + application/octet-stream dmg; + application/octet-stream eot; + application/octet-stream iso img; + application/octet-stream msi msp msm; + audio/mpeg mp3; + audio/x-realaudio ra; + video/mpeg mpeg mpg; + video/quicktime mov; + video/x-flv flv; + video/x-msvideo avi; + video/x-ms-wmv wmv; + video/x-ms-asf asx asf; + video/x-mng mng; +} +``` ++ 生产环境的完整配置nginx.conf +``` +user www www; +worker_processes 2; +pid /var/run/nginx.pid; + +# [ debug | info | notice | warn | error | crit ] +error_log /var/log/nginx.error_log info; + +events { + worker_connections 2000; + # use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] ; + use kqueue; +} + +http { + include conf/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] ' + '"$request" $status $bytes_sent ' + '"$http_referer" "$http_user_agent" ' + '"$gzip_ratio"'; + + log_format download '$remote_addr - $remote_user [$time_local] ' + '"$request" $status $bytes_sent ' + '"$http_referer" "$http_user_agent" ' + '"$http_range" "$sent_http_content_range"'; + + client_header_timeout 3m; + client_body_timeout 3m; + send_timeout 3m; + + client_header_buffer_size 1k; + large_client_header_buffers 4 4k; + + gzip on; + gzip_min_length 1100; + gzip_buffers 4 8k; + gzip_types text/plain; + + output_buffers 1 32k; + postpone_output 1460; + + sendfile on; + tcp_nopush on; + + tcp_nodelay on; + send_lowat 12000; + + keepalive_timeout 75 20; + + # lingering_time 30; + # lingering_timeout 10; + # reset_timedout_connection on; + + + server { + listen one.example.com; + server_name one.example.com www.one.example.com; + + access_log /var/log/nginx.access_log main; + + location / { + proxy_pass http://127.0.0.1/; + proxy_redirect off; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + client_max_body_size 10m; + client_body_buffer_size 128k; + + client_body_temp_path /var/nginx/client_body_temp; + + proxy_connect_timeout 90; + proxy_send_timeout 90; + proxy_read_timeout 90; + proxy_send_lowat 12000; + + proxy_buffer_size 4k; + proxy_buffers 4 32k; + proxy_busy_buffers_size 64k; + proxy_temp_file_write_size 64k; + + proxy_temp_path /var/nginx/proxy_temp; + + charset koi8-r; + } + + error_page 404 /404.html; + + location /404.html { + root /spool/www; + + charset on; + source_charset koi8-r; + } + + location /old_stuff/ { + rewrite ^/old_stuff/(.*)$ /new_stuff/$1 permanent; + } + + location /download/ { + valid_referers none blocked server_names *.example.com; + + if ($invalid_referer) { + #rewrite ^/ http://www.example.com/; + return 403; + } + + # rewrite_log on; + # rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3 + rewrite ^/(download/.*)/mp3/(.*)\..*$ /$1/mp3/$2.mp3 break; + + root /spool/www; + # autoindex on; + access_log /var/log/nginx-download.access_log download; + } + + location ~* ^.+\.(jpg|jpeg|gif)$ { + root /spool/www; + access_log off; + expires 30d; + } + + location ~ \.php$ { + fastcgi_pass unix:/var/run/php7.0.9-fpm.sock; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } + + } +} +``` + diff --git a/docs/Nginx/Nginx-Web/Nginx-2-4-log-cut.md b/docs/Nginx/Nginx-Web/Nginx-2-4-log-cut.md new file mode 100644 index 0000000..2450164 --- /dev/null +++ b/docs/Nginx/Nginx-Web/Nginx-2-4-log-cut.md @@ -0,0 +1,172 @@ +#### 脚本思路 ++ 第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件。 ++ 第二步向nginx主进程发送USR1信号。nginx主进程接到信号后会从配置文件中读取日志文件名称,重新打开日志文件(以配置文件中的日志名称命名),并以工作进程的用户作为日志文件的所有者。重新打开日志文件后,nginx主进程会关闭重名的日志文件并通知工作进程使用新打开的日志文件。工作进程立刻打开新的日志文件并关闭重名名的日志文件。 ++ 然后你就可以处理旧的日志文件了。 ++ [Nginx日志切割shell脚本](http://www.jb51.net/article/47884.htm) +#### 日志 +--- ++ 日志格式允许包含的变量注释 + ``` + $remote_addr, $http_x_forwarded_for(反向) --记录客户端IP地址 + $remote_user --记录客户端用户名称 + $request --记录请求的URL和HTTP协议 + $status --记录请求状态 + $body_bytes_sent --发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。 + $bytes_sent --发送给客户端的总字节数。 + $connection --连接的序列号。 + $connection_requests --当前通过一个连接获得的请求数量。 + $msec --日志写入时间。单位为秒,精度是毫秒。 + $pipe --如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。 + $http_referer --记录从哪个页面链接访问过来的 + $http_user_agent --记录客户端浏览器相关信息(注意:个别浏览器是空的) + $request_length --请求的长度(包括请求行,请求头和请求正文)。 + $request_time --请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。 + $time_iso8601 --ISO8601标准格式下的本地时间。 + $time_local --通用日志格式下的本地时间。 + ``` ++ Nginx位于负载均衡器,squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址 + + $remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录 客户端IP地址和客户端请求的服务器地址 ++ 日志文件的切割 + + 查看主进程号( master process ):`cat /var/run/nginx.pid` + + 停止 + + 配置了pid文件存放路径则,QUIT向NGINX主进程发送(优雅关机)信号的方法:`kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid )` + + 从容停止: `kill -QUIT 主进程号` + + 快速停止:`kill -TERM 主进程号` + + 强制停止:`kill -9 主进程号` + + 重启 + + 验证配置文件是否正确: `/usr/local/nginx/sbin/nginx -t` + + 重启方式一:`kill -HUP 主进程号` + >[1] 配置重新加载 + >[2] 使用新配置启动新的工作进程 + >[3] 正常关闭旧的工作进程 + + + 重启方式二:`/usr/local/nginx/sbin/nginx -s reload` + > `-s ` 参数包含四个命令分别是 `stop/quit/reopen/reload` (发送信号到主进程:停止,退出,重新打开,重新加载) + + + 发送 kill -USR1 信号给Nginx 主进程号,让Nginx 生成一个新的日志文件 `/usr/local/nginx/logs/access.log` + + 单日志备份Shell 脚本 `cut_nginx_log.sh` + ``` + #!/bin/bash + # ====================================================================================== + # chmod u+x /opt/nginx/cut_nginx_log.sh + # crontab -e + # 0 0 * * * /home/tinywan/bin/cut_nginx_log.sh > /home/tinywan/bin/cut_nginx_log.log 2>&1 + # ======================================================================================= + + LOGS_PATH="/usr/local/nginx/logs" + YEAR=$(date -d "yesterday" "+%Y") + MONTH=$(date -d "yesterday" "+%m") + # 获取昨天的日期 + DATE=$(date -d "yesterday" "+%Y%m%d_%H%M%S") + echo "YEAR : ${YEAR} MONTH : ${MONTH} DATE :${DATE}" + # Nginx的master 主进程号 + NGINX_PID="/var/run/nginx.pid" + # -r 检测文件是否可读,如果是,则返回 true + if [ -r ${NGINX_PID} ]; then + mkdir -p "${LOGS_PATH}/${YEAR}/${MONTH}" + mv "${LOGS_PATH}/access.log" "${LOGS_PATH}/${YEAR}/${MONTH}/access_${DATE}.log" + kill -USR1 $(cat "/var/run/nginx.pid") + sleep 1 + gzip "${LOGS_PATH}/${YEAR}/${MONTH}/access_${DATE}.log" + echo 'Nginx Cut Log Success' + else + echo "Nginx might be down" + fi + # ============================================================================== + # Clean up log files older than 100 days + # ============================================================================== + # Change HOUSEKEEPING=1 to enable clean up + HOUSEKEEPING=0 + KEEP_DAYS=100 + if [ $HOUSEKEEPING == 1 ]; then # 删除日志开关,开关为1的时候才会去根据设置的天数删除压缩日志文件 + if [ -d "${LOGS_PATH}" ]; then + find "${LOGS_PATH}" -type f -name "*.log.gz" -mtime +${KEEP_DAYS} -exec rm -f {} \; + fi + fi + ``` + + Nginx 报错误日志,由于php-fpm没有启动,就会报错以下错误信息error.log中 + ``` + 11 connect() to unix:/var/run/php7.0.9-fpm.sock failed (2: No such file or directory) while connecting to upstream + ``` + + 多日志备份Shell 脚本 `cut_ multiple_nginx_log.sh` + ``` + #!/bin/bash + # ====================================================================================== + # chmod u+x /opt/nginx/cut_multiple_nginx_log.sh + # crontab -e + # 0 0 * * * /home/tinywan/bin/cut_multiple_nginx_log.sh > /home/tinywan/bin/cut_nginx_log.log 2>&1 + # ======================================================================================= + + LOGS_PATH="/usr/local/nginx/logs" # 注意这里在路径末尾多个"/" + YEAR=$(date -d "yesterday" "+%Y") + MONTH=$(date -d "yesterday" "+%m") + # 获取昨天的日期 + DATE=$(date -d "yesterday" "+%Y%m%d_%H%M%S") + echo "YEAR : ${YEAR} MONTH : ${MONTH} DATE :${DATE}" + # Nginx的master 主进程号 + NGINX_PID="/var/run/nginx.pid" + # -r 检测文件是否可读,如果是,则返回 true + CUT_LOG(){ + if [ -r ${NGINX_PID} ]; then + mkdir -p "${LOGS_PATH}/${YEAR}/${MONTH}" + cd ${LOGS_PATH} + for i in $(ls *.log) # i = access.log/error.log/...等等 + do + FILE_NAME=$(echo ${i} | sed 's/\.log//') # FILE_NAME=access/error/...等等 + echo ${FILE_NAME} + mv "${LOGS_PATH}/${i}" "${LOGS_PATH}/${YEAR}/${MONTH}/${FILE_NAME}_${DATE}.log" + sleep 1 + gzip "${LOGS_PATH}/${YEAR}/${MONTH}/${FILE_NAME}_${DATE}.log" + done + kill -USR1 $(cat "/var/run/nginx.pid") + echo 'Nginx Cut Log Success' + else + echo "Nginx might be down" + exit 1 + fi + } + CUT_LOG + # ============================================================================== + # Clean up log files older than 100 days + # ============================================================================== + # Change HOUSEKEEPING=1 to enable clean up + HOUSEKEEPING=1 + KEEP_DAYS=100 + if [ $HOUSEKEEPING == 1 ]; then + if [ -d "${LOGS_PATH}" ]; then + find "${LOGS_PATH}" -type f -name "*.log.gz" -mtime +${KEEP_DAYS} -exec rm -f {} \; + fi + fi + ``` ++ Linux命令之 ` find ` 命令中的 `-mtime` 参数 + + mtime参数的理解应该如下: + + -mtime n 按照文件的更改时间来找文件,n为整数。 + + n表示文件更改时间距离为n天, -n表示文件更改时间距离在n天以内,+n表示文件更改时间距离在n天以前。 + + 例如: + > -mtime 0 表示文件修改时间距离当前为0天的文件,即距离当前时间不到1天(24小时)以内的文件。 + > -mtime 1 表示文件修改时间距离当前为1天的文件,即距离当前时间1天(24小时-48小时)的文件。 + > -mtime+1 表示文件修改时间为大于1天的文件,即距离当前时间2天(48小时)之外的文件 + > -mtime -1 表示文件修改时间为小于1天的文件,即距离当前时间1天(24小时)之内的文件 + + + ` find "/usr/local/nginx/logs" -type f -name "*.log.gz" -mtime 0 ` + > 查找距离当前时间不到1天(24小时)以内的文件的日志文件 + >> 查找结果: + ``` + root@tinywan:/usr/local/nginx/logs/2017/04# find "/usr/local/nginx/logs" -type f -name "*.log.gz" -mtime 0 + /usr/local/nginx/logs/2017/04/error_20170401_224602.log.gz + /usr/local/nginx/logs/2017/04/access_20170401_224602.log.gz + /usr/local/nginx/logs/2017/04/host.access_20170401_224602.log.gz + ``` + + + 为什么-mtime+1 表示文件修改时间为大于1天的文件,即距离当前时间48小时之外的文件,而不是24小时之外的呢? + + 因为n值只能是整数,即比1大的最近的整数是2,所有-mtime+1不是比当前时间大于1天(24小时),而是比当前时间大于2天(48小时)。 + + ` find . -name "*ab*" -exec rm -f {}\; ` + > 整句命令表示:在当前目录下查找以ab结尾的文件,并删除 + > ` -name “*ab” ` 表示查找以ab结尾的文件或文件名 + > `-exec` 表示执行什么命令。后面跟要执行的命令。此处是 `rm -f`,表示不确认删除 + > `{} \;` 表示把查找到的结果发送到此来 + + + + + diff --git a/docs/Nginx/Nginx-Web/Nginx-2-Log.md b/docs/Nginx/Nginx-Web/Nginx-2-Log.md new file mode 100644 index 0000000..b8a723c --- /dev/null +++ b/docs/Nginx/Nginx-Web/Nginx-2-Log.md @@ -0,0 +1,49 @@ + +#### Nginx日志服务 +--- + +* Nginx日志主要分为两种:访问日志和错误日志。日志开关在Nginx配置文件(/etc/nginx/nginx.conf)中设置,两种日志都可以选择性关闭,默认都是打开的 + +**一、访问日志** + +* 访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义。通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息。Nginx中访问日志相关指令主要有两条 + +> 1.log_format + +| 字段 | 作用 | 案例 | +| :------------ |:---------------:| -----:| +| $server_name | 虚拟主机名称 | 虚拟主机名称 | +| $remote_addr | 记录客户端IP地址 | 218.108.35.150 | +| $remote_user | 远程客户端用户名称 | 如登录百度的用户名scq2099yt,如果没有登录就是空白 | +| $time_local | 访问的时间与时区 | 16/Mar/2017:17:50:52 +0800 时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时 | +| $request | 请求的URI和HTTP协议| 这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求 | +| $status | 记录请求返回的http状态码 | 比如成功是200 | +| $uptream_status| upstream状态 | 比如成功是200 | +| $body_bytes_sent | 发送给客户端的文件主体内容的大小 | 比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量 | +| $http_referer | 记录从哪个页面链接访问过来的 | ... | +| $http_user_agent | 记录客户端浏览器信息 | ... | +| $http_x_forwarded_for | 客户端的真实ip| 通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。 | +| $ssl_protocol | SSL协议版本 | 比如TLSv1| +| $ssl_cipher | 交换数据中的算法 | 比如RC4-SHA| +| $upstream_addr | upstream的地址 | 即真正提供服务的主机地址| +| $request_time | 整个请求的总时间 | ...| +| $upstream_response_time | 请求过程中,upstream的响应时间 | 0.1s| + +> 2.access_log +>> 格式:`access_log path(存放路径) [format(自定义日志格式名称) [buffer=size | off]]` +>> 案例:`access_log logs/access.log main;` +>> 上下文:`http、server、location` +>> 注意要点:`Nginx进程设置的用户和组必须对日志路径有创建文件的权限,否则,会报错` + + +**二、错误日志** + +* 错误日志主要记录客户端访问Nginx出错时的日志,格式不支持自定义。通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。错误日志由指令error_log来指定` + +>> 格式:`error_log path(存放路径) level(日志等级)` +>> 日志等级:`[ debug | info | notice | warn | error | crit ]`,从左至右,日志详细程度逐级递减,即debug最详细,crit最少 +>> 案例:`error_log logs/error.log info;` +>> 上下文:`http、server、location` +>> 注意要点:`error_log off并不能关闭错误日志,而是会将错误日志记录到一个文件名为off的文件中` +>> 正确的关闭错误日志记录功能:`error_log /dev/null;`,上面表示将存储日志的路径设置为“垃圾桶” + diff --git a/docs/Nginx/Nginx-Web/Nginx-6-ReWrite-1.md b/docs/Nginx/Nginx-Web/Nginx-6-ReWrite-1.md new file mode 100644 index 0000000..03872a8 --- /dev/null +++ b/docs/Nginx/Nginx-Web/Nginx-6-ReWrite-1.md @@ -0,0 +1,78 @@ + +#### rewrite 重写 +--- + ++ 重写中用到的指令 + + if (条件) {} 设定条件,再进行重写 + + If 语法格式 + ``` + If 空格 (条件) { + 重写模式 + } + ``` + + 配置案例一:禁止某一个IP地址访问 + ``` + location / { + if ( $remote_addr = 192.168.127.129 ){ # 注意:这里的if和()之间是有个空格的 + return 403; + } + root html; + } + ``` + + 配置案例二:正则表达式的用法 + ``` + # 这个没有添加break 则会一直循环重定向,服务器会相应 500 + rewrite_log on; + if ($http_user_agent ~ Mozilla){ + rewrite ^.*$ /ie.html; + } + # nginx 日志记录():rewrite or internal redirection cycle while processing "/404.html", + # 这里要开启重写日志:rewrite_log on + + # 正确配置信息 ,服务器会输出ie.html 中的内容 + rewrite_log on; + if ($http_user_agent ~ Mozilla){ + rewrite ^.*$ /ie.html; + break; + } + ``` + + + set #设置变量 + + return #返回状态码 + + break #跳出rewrite + + rewrite #重写 + ++ Nginx 全局应用的变量文件路径:root@tinywan:/usr/local/nginx/conf# cat fastcgi.conf + ``` + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; -- 脚本文件请求的路径 + fastcgi_param QUERY_STRING $query_string; -- 请求的参数;如?app=123 + fastcgi_param REQUEST_METHOD $request_method; -- 请求的方法(GET,POST) + fastcgi_param CONTENT_TYPE $content_type; -- 请求头中的Content-Type字段 + fastcgi_param CONTENT_LENGTH $content_length; -- 请求头中的Content-length字段 + + fastcgi_param SCRIPT_NAME $fastcgi_script_name; -- 脚本名称 + fastcgi_param REQUEST_URI $request_uri; -- 请求的地址不带参数 + fastcgi_param DOCUMENT_URI $document_uri; -- 与$uri相同 + fastcgi_param DOCUMENT_ROOT $document_root; -- 网站的根目录。在server配置中root指令中指定的值 + fastcgi_param SERVER_PROTOCOL $server_protocol; -- 请求使用的协议,通常是HTTP/1.0或HTTP/1.1 + fastcgi_param REQUEST_SCHEME $scheme; -- + fastcgi_param HTTPS $https if_not_empty; -- + + fastcgi_param GATEWAY_INTERFACE CGI/1.1; + fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; + + fastcgi_param REMOTE_ADDR $remote_addr; -- 客户端IP + fastcgi_param REMOTE_PORT $remote_port; -- 客户端端口 + fastcgi_param SERVER_ADDR $server_addr; -- 服务器IP地址 + fastcgi_param SERVER_PORT $server_port; -- 服务器端口 + fastcgi_param SERVER_NAME $server_name; -- 服务器名,域名在server配置中指定的server_name + + PHP : fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + ``` + +**二、错误日志** + +* 错误日志主要记录客户端访问Nginx出错时的日志,格式不支持自定义。通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。错误日志由指令error_log来指定` + + + diff --git a/docs/Nginx/Nginx-Web/Nginx-7-Proxy-1.md b/docs/Nginx/Nginx-Web/Nginx-7-Proxy-1.md new file mode 100644 index 0000000..6099aee --- /dev/null +++ b/docs/Nginx/Nginx-Web/Nginx-7-Proxy-1.md @@ -0,0 +1,20 @@ + +#### 简单的负载平衡 +``` +http { +upstream myproject { + server 127.0.0.1:8000 weight=3; + server 127.0.0.1:8001; + server 127.0.0.1:8002; + server 127.0.0.1:8003; +} + +server { + listen 80; + server_name www.domain.com; + location / { + proxy_pass http://myproject; + } +} +} +``` diff --git a/docs/Nginx/Nginx-Web/Nginx-7-Proxy.md b/docs/Nginx/Nginx-Web/Nginx-7-Proxy.md new file mode 100644 index 0000000..69a0964 --- /dev/null +++ b/docs/Nginx/Nginx-Web/Nginx-7-Proxy.md @@ -0,0 +1,262 @@ + +#### Nginx服务器的HTTP代理服务 +--- ++ 网络初始化之listen常见配置 + ```Lua + listen 127.0.0.1:8000; + listen 127.0.0.1; + listen 8000; + listen *:8000; + listen localhost:8000; + listen [::]:8000; + listen [fe80::1]; + listen unix:/var/run/nginx.sock; + ``` +* **配置实例一:对所有请求实现一般轮询规则的负载均衡** + ``` + http { + + upstream live_node { # 配置后端服务器组 + #max_fails默认值为1,fail_timeout默认值为10s,max_fails=0表示不做检查 + server 127.0.0.1:8089 weight=1 max_fails=1 fail_timeout=10s; + server 127.0.0.1:8088; + keepalive 32; + hash $request_uri consistent; + } + + server { + listen 80; + server_name localhost; + location / { + proxy_pass http://live_node; # 注意:proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机 + proxy_set_header Host $host; # 保留客户端的真实信息 + proxy_set_header Host $host:$server_port; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Real-PORT $remote_port; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_redirect off; + proxy_buffer_size 128k; + proxy_buffers 32 32k; + proxy_busy_buffers_size 128k; + } + } + + server { # 配置虚拟服务器8088 + listen 8088; + server_name localhost; + location / { + root /usr/local/nginx/html2; + index index.html index.htm; + } + } + + server { # 配置虚拟服务器8089 + listen 8089; + server_name localhost; + location / { + root /usr/local/nginx/html3; + index index.html index.htm; + } + } + } + ``` + + Nginx-proxy 详解文章链接 + + 查看错误日志 + `upstream sent too big header while reading response header from upstream` + + [Nginx-proxy_buffer_size and fastcgi_buffer](http://blog.csdn.net/u010391029/article/details/50850210) + + [http://wiki.nginx.org/NginxHttpProxyModule](http://wiki.nginx.org/NginxHttpProxyModule) + + [http://blog.sina.com.cn/s/blog_5dc960cd0100i4mt.html](http://blog.sina.com.cn/s/blog_5dc960cd0100i4mt.html) + > 参数:`keepalive connections;` + >>补充:`由于短连接消耗前端代理服务器的资源现象严重,因此会将一部分连接定义为长连接以节省资源` + >>FUN:`#为每个worker进程保留的空闲的长连接数量` + >>FUN:`#定义nginx与后端服务器的保持连接的数量` + + > 参数:`hash $request_uri consistent;` + >>FUN:`#[consistent]; 使用一致性哈希算法, 建议开启此项` + >>FUN:`#基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者的组合;` + >>FUN:`#将请求分类,同一类请求将发往同一个upstream server;` + +* **配置实例二:对所有请求实现加权轮询规则负载均衡** + ``` + http { + + upstream live_node { # 配置后端服务器组 + server 127.0.0.1:8089 weight=5; # 这个处理客户端请求会多些 + server 127.0.0.1:8088 weight=1; # 默认 weight = 1 + } + + server { + listen 80; + server_name localhost; + location / { + #proxy_pass http://new_uri/; # 注意:proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri + proxy_pass http://live_node; + proxy_set_header Host $host; # 保留客户端的真实信息 + } + } + + server { # 配置虚拟服务器8088 + listen 8088; + server_name localhost; + location / { + root /usr/local/nginx/html2; + index index.html index.htm; + } + } + + server { # 配置虚拟服务器8089 + listen 8089; + server_name localhost; + location / { + root /usr/local/nginx/html3; + index index.html index.htm; + } + } + } + ``` + +* **配置实例三:对特定资源实现负载均衡** + ``` + http { + + upstream videobackend { # 配置后端服务器组视频代理 + server 127.0.0.1:8088; + server 127.0.0.1:8089; + } + + upstream filebackend { # 配置后端服务器组文件代理 + server 127.0.0.1:8888; + server 127.0.0.1:8889; + } + + server { + listen 80; + server_name localhost; + location /video/ { + proxy_pass http://videobackend; # 视频代理 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; # proxy_set_header field value; 设定发往后端主机的请求报文的请求首部的值 + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location /file/ { + proxy_pass http://filebackend; # 文件代理 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + } + + server { # 配置虚拟服务器8088 + listen 8088; + server_name localhost; + location /video { + alias /usr/local/nginx/html2; + } + } + + server { # 配置虚拟服务器8089 + listen 8089; + server_name localhost; + location /video { + alias /usr/local/nginx/html3; + } + } + + server { # 文件虚拟服务器1 + listen 8888; + server_name localhost; + location /file { + alias /usr/local/nginx/html4; + } + } + + server { # 文件虚拟服务器2 + listen 8889; + server_name localhost; + location /file { + alias /usr/local/nginx/html5; + } + } + } + ``` + > 访问方式:`http://127.0.0.1/video/demo.txt` + >>输出:`this is video HTML2 demo2 8088` + >>输出:`this is video HTML3 demo3 8089` + + > 访问方式:`http://127.0.0.1/file/demo.txt` + >>输出:`this is file HTML4 demo4 8888` + >>输出:`this is file HTML4 demo5 8889` + + >测数文件:`demo.txt` + >>`echo "this is video HTML2 demo2 8088" > ./html2/demo.txt` + +* **配置实例四:不同的域名实现负载均衡** + ``` + http { + + upstream frontend { # 配置后端服务器组视频代理 + server 127.0.0.1:8088; + server 127.0.0.1:8089; + } + + upstream backend { # 配置后端服务器组文件代理 + server 127.0.0.1:8888; + server 127.0.0.1:8889; + } + + server { + listen 80; + server_name www.frontend.com; + location /video/ { + proxy_pass http://frontend; # 前台域名代理 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + } + + server { + listen 8088; + server_name www.backend.com; + location /video/ { + proxy_pass http://backend; # 后台域名代理 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + } + + } + ``` +* **配置实例五:实现带有URL重写的负载均衡** + ``` + http { + + upstream backend { # 配置后端服务器组 + server 127.0.0.1:8888; + server 127.0.0.1:8889; + } + + server { + listen 80; + server_name www.backend.com; + index index.html index.htm; + location /file/ { + rewrite ^(/file/.*)/media/(.*)\.*$ $1/mp3/$2.mp3 last; + } + + location / { + proxy_pass http://frontend; # 前台域名代理 + proxy_set_header Host $host; + } + } + + } + ``` + + >客户端请求URL为:`http://www.backend.com/file/download/media/1.mp3` + >[1]:虚拟主机` location /file/ `块将该URL进行重写为:`http://www.backend.com/file/download/media/mp3/1.mp3` + >[2]:新的URL再有 ` location / `块转发转发到后端的backend服务器组中实现负载均衡 + >[3]: 这样就可以实现URL重写的负载均衡 diff --git a/docs/Nginx/Nginx-Web/Nginx-8-proxy_cache.md b/docs/Nginx/Nginx-Web/Nginx-8-proxy_cache.md new file mode 100644 index 0000000..c106db4 --- /dev/null +++ b/docs/Nginx/Nginx-Web/Nginx-8-proxy_cache.md @@ -0,0 +1,187 @@ +## 如何配置proxy_cache模块 ++ [官方:ngx_http_proxy_module](http://nginx.org/en/docs/http/ngx_http_proxy_module.html) ++ `Http`配置文件 + ```bash + user www; + worker_processes 1; + + error_log logs/error.log error; + + pid /run/nginx.pid; + + worker_rlimit_nofile 204800; + + events { + worker_connections 65535; + multi_accept on; + use epoll; + } + + http { + lua_package_path '/usr/local/openresty/lualib/?.lua;/usr/local/openresty/nginx/conf/waf/?.lua;'; + lua_package_cpath '/usr/local/openresty/lualib/?.so;;'; + + init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua"; + access_by_lua_file "/usr/local/openresty/nginx/conf/waf/waf.lua"; + + include mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"' + '"$upstream_cache_status"'; # nginx cache命中率统计 + + charset UTF-8; + client_header_buffer_size 32k; + large_client_header_buffers 4 32k; + + client_header_timeout 100; + client_body_timeout 100; + client_max_body_size 800m; + client_body_buffer_size 512k; + reset_timedout_connection on; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + + keepalive_timeout 75 20; + + proxy_connect_timeout 5; + proxy_send_timeout 5; + proxy_read_timeout 60; + # 是否启用或者关闭 proxy_buffer,默认为 on + proxy_buffering on; + # 设置缓存大小,默认4KB、8KB 保持与 proxy_buffers 指令中size变量相同或者更小 + proxy_buffer_size 16k; + # proxy_buffer个数和Buffer大小(一般设置为内存页大小) + proxy_buffers 4 64k; + # 限制处于 BUSY 状态的 proxy_buffer 的总大小 + proxy_busy_buffers_size 128k; + # 所有临时文件总体积大小,磁盘上的临时文件不能超过该配置 + proxy_max_temp_file_size 500MB; + # 配置同时写入临时文件的数据量的总大小 + proxy_temp_file_write_size 128k; + + gzip on; + gzip_min_length 1k; + gzip_buffers 4 64k; + gzip_http_version 1.1; + gzip_comp_level 6; + gzip_types text/plain application/x-javascript text/css application/javascript text/javascript image/jpeg image/gif image/png application/xml application/json; + gzip_vary on; + gzip_disable "MSIE [1-6].(?!.*SV1)"; + + # 文件路径,临时存放代理服务器的大体积响应数据 + proxy_temp_path /home/www/data/nginx/tmp-test; + # 设置WEB缓存区名称为 cache_one ,内存缓存空间大小为100M,一天清理一次,硬盘缓存空间大小为10G + proxy_cache_path /home/www/data/nginx/cache-test levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g; + + index index.php index.html index.htm; + include "/usr/local/openresty/nginx/conf/vhost/*.conf"; + } + ``` ++ `Server`配置文件 + + ```bash + server { + listen 8087; + server_name localhost; + + location / { + # 如果后端的服务器返回500 502 503 504 执行超时等错误,将请求转发到另外一台服务器 + proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; + # 定义用于缓存的共享内存区域 + proxy_cache cache_one; + # 针对不同的HTTP状态码设置不同的缓存时间 + proxy_cache_valid 200 304 1h; + proxy_cache_valid 404 1m; + # WEB缓存的Key值域名、URI、参数组成 + proxy_cache_key $host$uri$is_args$args; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + # 显示缓存的状态 + add_header Nginx-Cache "$upstream_cache_status"; + # 可以禁用一个或多个响应头字段的处理 [Nginx不缓存,可以添加以下语句] + proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; + proxy_pass http://www.tinywan.com; + expires 1d; + } + } + ``` ++ 配置测试 + + 打印响应头 + ```bash + www@TinywanAliYun:$ curl -I http://127.0.0.1:8087/ + HTTP/1.1 200 OK + Server: openresty/1.11.2.5 + Date: Sat, 18 Nov 2017 15:46:55 GMT + Content-Type: text/html; charset=utf-8 + Connection: keep-alive + Keep-Alive: timeout=20 + Vary: Accept-Encoding + Expires: Sun, 19 Nov 2017 15:46:55 GMT + Cache-Control: max-age=86400 + Pragma: no-cache + Nginx-Cache: HIT + ``` + + 缓存目录 + ```bash + www@TinywanAliYun:~/data/nginx/cache-test$ tree -L 4 + . + ├── 0 + │   └── 49 + │   └── 51ab3cb31fd7929a0346796693d53490 + └── 9 + └── f4 + └── 3a020dc16513d3abee9ba74688d53f49 + + 4 directories, 2 files + www@TinywanAliYun:~/data/nginx/cache-test$ cat 0/49/51ab3cb31fd7929a0346796693d53490 + ³QZݵǘ£CZC°(±"58c8b5dd-423e" + KEY: 127.0.0.1/favicon.ico // 代理服务IP地址 + HTTP/1.1 200 OK + Server: nginx/1.6.0 // 被代理服务器信息 + Date: Sat, 18 Nov 2017 14:28:51 GMT + Content-Type: image/x-icon + Content-Length: 16958 + Last-Modified: Wed, 15 Mar 2017 03:32:45 GMT + Connection: close + ETag: "58c8b5dd-423e" + Accept-Ranges: bytes + ``` ++ `$upstream_cache_status` 包含以下几种状态 + + ```bash + ·MISS 未命中,请求被传送到后端 + ·HIT 缓存命中 + ·EXPIRED 缓存已经过期请求被传送到后端 + ·UPDATING 正在更新缓存,将使用旧的应答 + ·STALE 后端将得到过期的应答 + ``` ++ `nginx cache`命中率统计 + + ```bash + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"' + '"$upstream_cache_status"'; + ``` + > 命中率统计方法:用HIT的数量除以日志总量得出缓存命中率 + + > `awk '{if($NF==""HIT"") hit++} END {printf "%.2f%",hit/NR}' access.log` + ++ 通过crontab脚本将每天的命中率统计到一个日志中,以备查看 + + ```bash + #!/bin/bash + LOG_FILE='/usr/local/nginx/logs/access.log.1' + LAST_DAY=$(date +%F -d "-1 day") + awk '{if($NF==""HIT"") hit++} END {printf "'$LAST_DAY': %d %d %.2f%n", hit,NR,hit/NR}' $LOG_FILE + ``` ++ 帮助文档 + + [Nginx proxy_cache 缓存配置](http://blog.csdn.net/dengjiexian123/article/details/53386586) + + [Nginx Proxy Cache原理和最佳实践](http://www.jianshu.com/p/625c2b15dad5) + + [nginx缓存设置proxy_cache(PHP)](https://www.cnblogs.com/zlingh/p/5879988.html) \ No newline at end of file diff --git a/docs/Nginx/Nginx-Web/Nginx-8-tcp-Proxy.md b/docs/Nginx/Nginx-Web/Nginx-8-tcp-Proxy.md new file mode 100644 index 0000000..7bffc9a --- /dev/null +++ b/docs/Nginx/Nginx-Web/Nginx-8-tcp-Proxy.md @@ -0,0 +1,20 @@ + +#### Nginx服务器TCP代理服务 +--- +* **Nginx 官方自带配置** + ``` + stream { + upstream rtmp { + server 127.0.0.1:8089; # 这里配置成要访问的地址 + server 127.0.0.2:1935; + server 127.0.0.3:1935; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935 + } + server { + listen 1935; # 需要监听的端口 + proxy_timeout 20s; + proxy_pass rtmp; + } + } + ``` ++ [参考博客地址](http://www.cnblogs.com/tinywan/p/6560889.html) + diff --git a/docs/Nginx/Nginx-Web/openresty-nginx-lua-Proxy.md b/docs/Nginx/Nginx-Web/openresty-nginx-lua-Proxy.md new file mode 100644 index 0000000..67fef7d --- /dev/null +++ b/docs/Nginx/Nginx-Web/openresty-nginx-lua-Proxy.md @@ -0,0 +1,345 @@ +### Openresty-Lua动态修改upstream后端服务 ++ nginx.conf 配置文件 + ``` + worker_processes 1; + pid logs/nginx.pid; + events { + worker_connections 1024; + } + + http { + include mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + sendfile on; + + keepalive_timeout 65; + + lua_shared_dict upstreams 1m; # 声明一个ngx多进程全局共享内存区域,_G 作为基于shm的Lua字典的存储空间ngx.shared. + upstream default_upstream { # 配置后端服务器组 + server 127.0.0.1:8081; + server 127.0.0.1:8082; + } + + upstream lua_upstream { # 配置后端服务器组 + server 127.0.0.1:8084; + server 127.0.0.1:8083; + } + + server { + listen 80; + server_name localhost; + + access_log logs/80.access.log main; + error_log logs/80.error.log error; + + location = /_switch_upstream { + content_by_lua_block{ + local ups = ngx.req.get_uri_args()["upstream"] + if ups == nil or ups == "" then + ngx.say("upstream is nil 1") + return nil + end + local host = ngx.var.http_host + local upstreams = ngx.shared.upstreams + local ups_src = upstreams:get(host) + ngx.say("Current upstream is :",ups_src) + ngx.log(ngx.WARN, host, " change upstream from ", ups_src, " to ", ups) + local succ, err, forcible = upstreams:set(host, ups) + ngx.say(host, " change upstream from ", ups_src, " to ", ups) + } + } + + location / { + set_by_lua_block $my_upstream { + local ups = ngx.shared.upstreams:get(ngx.var.http_host) + if ups ~= nil then + ngx.log(ngx.ERR, "get [", ups,"] from ngx.shared") + return ups + end + return "default_upstream" + } + + proxy_next_upstream off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_pass http://$my_upstream ; + } + } + + server { + listen 8081; + server_name localhost; + + location / { + root html81; + index index.html index.htm; + } + } + + server { + listen 8082; + server_name localhost; + + location / { + root html82; + index index.html index.htm; + } + } + + server { + listen 8083; + server_name localhost; + + location / { + root html83; + index index.html index.htm; + } + } + + server { + listen 8084; + server_name localhost; + + location / { + root html84; + index index.html index.htm; + } + } + } + ``` ++ 4个端口分别对应4个html 根目录 + + html81/index.html 内容 `server name 8081` + + html82/index.html 内容 `server name 8082` + + html83/index.html 内容 `server name 8083` + + html84/index.html 内容 `server name 8084` ++ 如何切换后端upstream + + `default_upstream` 切换到 `lua_upstream` + ``` + root@tinywan:# curl http://127.0.0.1/_switch_upstream?upstream=lua_upstream + 127.0.0.1 change upstream from default_upstream to lua_upstream + ``` + + `lua_upstream` 切换(还原`default_upstream`)到 `default_upstream` + ``` + root@tinywan:# curl http://127.0.0.1/_switch_upstream?upstream=default_upstream + 127.0.0.1 change upstream from lua_upstream to default_upstream + ``` ++ 一个收集upstream_response_time的平均数据的例子 + ``` + lua_shared_dict log_dict 5M # 声明一个ngx多进程全局共享内存区域 + + server{ + location / { + proxy_pass http;//mybackend # 代理模块 + log_by_lua ' + local log_dict = ngx.shared.log_dict + local upstream_time = tonumber(ngx.var.upstream_response_time) + local sum = log_dict:get("upstream_time-sum") or 0 + sum = sum + upstream_time + log_dict:set("upsteam_time-sum", sum) + local newval, err = log_dict:incr("upstream_time-nb", 1) + if not newval and err == "not found" then + log_dict:add("upstream_time-nb", 0) + log_dict:incr("upstream_time-nb", 1) + end + ' + } + location = /status { + content_by_lua ' + local log_dict = ngx.shared.log_dict + local sum = log_dict:get("upstream_time-sum") + local nb = log_dict:get("upstream_time-nb") + + if nb and sum then + ngx.say("average upstream response time: ", sum/nb, " (", nb, " reqs)") + else + ngx.say("no data yet") + end + ' + } + } + ``` ++ 动态修改upstream后端服务和upstream_response_time的平均数据 合并后的代码 + ``` + #user nobody; + worker_processes 1; + pid logs/nginx.pid; + events { + worker_connections 1024; + } + + http { + include mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + sendfile on; + + keepalive_timeout 65; + + lua_shared_dict upstreams 1m; # ngx多进程全局共享内存,保存upstream值 + upstream default_upstream { # 配置后端服务器组 + server 127.0.0.1:8081; + server 127.0.0.1:8082; + } + + upstream lua_upstream { # 配置后端服务器组 + server 127.0.0.1:8084; + server 127.0.0.1:8083; + } + + + server { + listen 80; + server_name localhost; + + access_log logs/80.access.log main; + error_log logs/80.error.log error; + + location = /_switch_upstream { + default_type 'text/html'; + content_by_lua_block{ + local ups = ngx.req.get_uri_args()["upstream"] + if ups == nil or ups == "" then + ngx.say("upstream is nil 1") + return nil + end + local host = ngx.var.http_host + local upstreams = ngx.shared.upstreams + local ups_src = upstreams:get(host) + ngx.say("Current upstream is :",ups_src) + ngx.log(ngx.WARN, host, " change upstream from ", ups_src, " to ", ups) + local succ, err, forcible = upstreams:set(host, ups) + ngx.say(host, " change upstream from ", ups_src, " to ", ups) + } + } + + #location ~ (^/api/|^/p/|^/m/|^/oauthapi/) { + location / { + set_by_lua_block $my_upstream { + local ups = ngx.shared.upstreams:get(ngx.var.http_host) + if ups ~= nil then + ngx.log(ngx.ERR, "get [", ups,"] from ngx.shared") + return ups + end + return "default_upstream" + } + + proxy_next_upstream off; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_pass http://$my_upstream ; + + log_by_lua_block { + local log_dict = ngx.shared.upstreams + local upstream_time = tonumber(ngx.var.upstream_response_time) + + local sum = log_dict:get("upstream_time-sum") or 0 + sum = sum + upstream_time + log_dict:set("upstream_time-sum", sum) + + local newval, err = log_dict:incr("upstream_time-nb", 1) + if not newval and err == "not found" then + log_dict:add("upstream_time-nb", 0) + log_dict:incr("upstream_time-nb", 1) + end + } + } + + location = /status { + default_type 'text/html'; -- 通过浏览器可访问 + content_by_lua_block { + local log_dict = ngx.shared.upstreams + local sum = log_dict:get("upstream_time-sum") + local nb = log_dict:get("upstream_time-nb") + + if nb and sum then + ngx.say("average upstream response time: ", sum / nb, + " (", nb, " reqs)") + else + ngx.say("no data yet") + end + } + } + + } + + server { + listen 8099; + server_name localhost; + + #charset koi8-r; + + access_log logs/80.access.log main; + error_log logs/80.error.log error; + location / { + #proxy_pass http://live_node; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + } + + server { + listen 8081; + server_name localhost; + + location / { + root html81; + index index.html index.htm; + } + } + + server { + listen 8082; + server_name localhost; + + location / { + root html82; + index index.html index.htm; + } + } + + server { + listen 8083; + server_name localhost; + + location / { + root html83; + index index.html index.htm; + } + } + + server { + listen 8084; + server_name localhost; + + location / { + root html84; + index index.html index.htm; + } + } + } + ``` ++ 测试结果: + ``` + root@tinywan:/opt/openresty/nginx/conf# curl http://127.0.0.1/status + average upstream response time: 0.0003953488372093 (129 reqs) + ``` ++ 浏览器测试,记得加上这个`default_type 'text/html';`,在浏览器地址栏直接输入即可访问 + `http://127.0.0.1/_switch_upstream?upstream=default_upstream` + ++ HELP:[http://chattool.sinaapp.com/?p=2372](http://chattool.sinaapp.com/?p=2372) \ No newline at end of file diff --git a/docs/Nginx/more-domain-config.md b/docs/Nginx/more-domain-config.md new file mode 100644 index 0000000..670bdca --- /dev/null +++ b/docs/Nginx/more-domain-config.md @@ -0,0 +1,147 @@ +## Nginx 同一个IP上配置多个HTTPS主机 ++ [Nginx 同一个IP上配置多个HTTPS主机](http://www.ttlsa.com/web/multiple-https-host-nginx-with-a-ip-configuration/) ++ 域名列表 + + | 序号 | 名称 | 域名 | HTTPS主机 | + | :--: |:--: |:---------------:| :-----| + | 1 | 官方域名 | www.tinywan.com | https://www.tinywan.com/ | + | 2 | 直播域名 | live.tinywan.com | https://live.tinywan.com/ | + | 3 | 点播域名 | vod.tinywan.com | https://vod.tinywan.com/ | + | 4 | 文档域名 | doc.tinywan.com | https://doc.tinywan.com/ | + ++ Openresty 编译 + + ```bash + www@TinywanAliYun:~/DEMO/openresty-1.11.2.5$ + ./configure --prefix=/usr/local/openresty --with-luajit \ + --with-http_ssl_module --with-openssl=/usr/local/openssl \ + --with-openssl-opt="enable-tlsext" --without-http_redis2_module \ + --with-http_iconv_module --with-http_stub_status_module \ + --with-http_xslt_module --add-dynamic-module=/home/www/DEMO/nginx-ts-module \ + --add-dynamic-module=/home/www/DEMO/nginx-rtmp-module + ... + make + sudo make install + ``` + > 注意添加配置:`--with-openssl-opt="enable-tlsext" `,默认情况下是`TLS SNI support disabled` ++ `Nginx.conf`配置文件: + + 配置文件列表 + + ```bash + www@TinywanAliYun:/usr/local/openresty/nginx/conf/vhost$ ls + doc.tinywan.com.conf live_rtmp_hls.conf live.tinywan.com.conf + main.conf vod.tinywan.com.conf www.tinywan.com.conf + ``` + + `nginx.conf` + + ```bash + http { + ... + index index.php index.html index.htm; + include "/usr/local/openresty/nginx/conf/vhost/*.conf"; + } + ``` + + `main.conf` + + ```bash + # 配置HTTP请求重定向 + server { + listen 80; + server_name www.tinywan.com; #live.tinywan.com vod.tinywan.com; + rewrite ^ https://$http_host$request_uri? permanent; + } + ``` + + `www.tinywan.com.conf` + + ```bash + server { + #listen 80; + listen 443 ssl; + server_name www.tinywan.com; + set $root_path /home/www/web/go-study-line/public; + root $root_path; + + ssl on; + ssl_certificate /etc/letsencrypt/live/www.tinywan.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/www.tinywan.com//privkey.pem; + server_tokens off; + + location / { + #access_by_lua_file /usr/local/openresty/nginx/conf/lua_script/resty-limit-req.lua; + if (!-e $request_filename) { + rewrite ^(.*)$ /index.php?s=/$1 last; + break; + } + } + + location = /favicon.ico { + log_not_found off; + } + + location ~ \.php$ { + #access_by_lua_file /usr/local/openresty/nginx/conf/lua_script/resty-limit-req.lua; + fastcgi_pass unix:/var/run/php7.1.8-fpm.sock; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + fastcgi_buffer_size 128k; + fastcgi_buffers 4 256k; + fastcgi_busy_buffers_size 256k; + fastcgi_connect_timeout 300; + fastcgi_send_timeout 300; + fastcgi_read_timeout 300; + } + } + ``` + + `live.tinywan.com.conf` + + ```bash + # live.tinywan.com + server{ + listen 443 ssl; + server_name live.tinywan.com; + + root /home/www/web/live.tinywan.com; + + ssl on; + ssl_certificate /etc/letsencrypt/live/www.tinywan.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/www.tinywan.com//privkey.pem; + server_tokens off; + + } + ``` + + `vod.tinywan.com.conf` + + ```bash + # vod.tinywan.com + server{ + listen 443 ssl; + server_name vod.tinywan.com; + + root /home/www/web/vod.tinywan.com; + + ssl on; + ssl_certificate /etc/letsencrypt/live/www.tinywan.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/www.tinywan.com//privkey.pem; + server_tokens off; + + } + ``` + + `doc.tinywan.com.conf` + + ```bash + # doc.tinywan.com + server{ + listen 443 ssl; + server_name doc.tinywan.com; + + root /home/www/web/doc.tinywan.com; + + ssl on; + ssl_certificate /etc/letsencrypt/live/www.tinywan.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/www.tinywan.com//privkey.pem; + server_tokens off; + + } + ``` + \ No newline at end of file diff --git a/docs/Nginx/nginx b/docs/Nginx/nginx new file mode 100644 index 0000000..42ea15a --- /dev/null +++ b/docs/Nginx/nginx @@ -0,0 +1,408 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: nginx +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: nginx init.d dash script for Ubuntu or other *nix. +# Description: nginx init.d dash script for Ubuntu or other *nix. +### END INIT INFO +#------------------------------------------------------------------------------ +# nginx - this Debian Almquist shell (dash) script, starts and stops the nginx +# daemon for Ubuntu and other *nix releases. +# +# description: Nginx is an HTTP(S) server, HTTP(S) reverse \ +# proxy and IMAP/POP3 proxy server. This \ +# script will manage the initiation of the \ +# server and it's process state. +# +# processname: nginx +# config: /usr/local/nginx/conf/nginx.conf +# pidfile: /usr/local/nginx/logs/nginx.pid +# Provides: nginx +# +# Author: Jason Giedymin +# . +# +# Version: 3.9.0 12-MAY-2015 jason.giedymin AT gmail.com +# Notes: nginx init.d dash script for Ubuntu. +# Tested with: Ubuntu 14.10, nginx-1.7.9 +# +# This script's project home is: +# http://github.com/JasonGiedymin/nginx-init-ubuntu +# +#------------------------------------------------------------------------------ +# MIT X11 License +#------------------------------------------------------------------------------ +# +# Copyright (c) 2008-2013 Jason Giedymin, http://jasongiedymin.com +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Functions +#------------------------------------------------------------------------------ +LSB_FUNC=/lib/lsb/init-functions + +# Test that init functions exists +test -r $LSB_FUNC || { + echo "$0: Cannot find $LSB_FUNC! Script exiting." 1>&2 + exit 5 +} + +. $LSB_FUNC + +#------------------------------------------------------------------------------ +# Consts +#------------------------------------------------------------------------------ +# Include nginx defaults if available +if [ -f /etc/default/nginx ]; then + . /etc/default/nginx +fi + +# Minimize path +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + +PS=${PS:-"nginx"} # process name +DESCRIPTION=${DESCRIPTION:-"Nginx Server..."} # process description +NGINXPATH=${NGINXPATH:-/opt/openresty/nginx} # root path where installed +DAEMON=${DAEMON:-$NGINXPATH/sbin/nginx} # path to daemon binary +NGINX_CONF_FILE=${NGINX_CONF_FILE:-$NGINXPATH/conf/nginx.conf} # config file path + +PIDNAME=${PIDNAME:-"nginx"} # lets you do $PS-slave +PIDFILE=${PIDFILE:-$PIDNAME.pid} # pid file +PIDSPATH=${PIDSPATH:-$NGINXPATH/logs} # default pid location, you should change it +RUNAS=${RUNAS:-root} # user to run as + +SCRIPT_OK=0 # ala error codes +SCRIPT_ERROR=1 # ala error codes +TRUE=1 # boolean +FALSE=0 # boolean + +#------------------------------------------------------------------------------ +# Simple Tests +#------------------------------------------------------------------------------ + +# Test if nginx is a file and executable +test -x $DAEMON || { + echo "$0: You don't have permissions to execute nginx." 1>&2 + exit 4 +} + +# You can also set your conditions like so: +# set exit condition +# set -e + +#------------------------------------------------------------------------------ +# Functions +#------------------------------------------------------------------------------ + +setFilePerms(){ + if [ -f $PIDSPATH/$PIDFILE ]; then + chmod 400 $PIDSPATH/$PIDFILE + fi +} + +configtest() { + $DAEMON -t -c $NGINX_CONF_FILE +} + +getPSCount() { + return `pgrep -f $PS | wc -l` +} + +isRunning() { + if [ $1 ]; then + pidof_daemon $1 + PID=$? + + if [ $PID -gt 0 ]; then + return 1 + else + return 0 + fi + else + pidof_daemon + PID=$? + + if [ $PID -gt 0 ]; then + return 1 + else + return 0 + fi + fi +} + +#courtesy of php-fpm +wait_for_pid () { + try=0 + + while test $try -lt 35 ; do + case "$1" in + 'created') + if [ -f "$2" ]; then + try='' + break + fi + ;; + + 'removed') + if [ ! -f "$2" ]; then + try='' + break + fi + ;; + esac + + try=`expr $try + 1` + sleep 1 + done +} + +status(){ + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + log_warning_msg "$DESCRIPTION found running with processes: `pidof $PS`" + rc=0 + else + log_warning_msg "$DESCRIPTION is NOT running." + rc=3 + fi + + return +} + +removePIDFile(){ + if [ $1 ]; then + if [ -f $1 ]; then + rm -f $1 + fi + else + #Do default removal + if [ -f $PIDSPATH/$PIDFILE ]; then + rm -f $PIDSPATH/$PIDFILE + fi + fi +} + +start() { + log_daemon_msg "Starting $DESCRIPTION" + + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + log_end_msg $SCRIPT_ERROR + rc=0 + else + start-stop-daemon --start --quiet --chuid \ + $RUNAS --pidfile $PIDSPATH/$PIDFILE --exec $DAEMON \ + -- -c $NGINX_CONF_FILE + status=$? + setFilePerms + + if [ "${status}" -eq 0 ]; then + log_end_msg $SCRIPT_OK + rc=0 + else + log_end_msg $SCRIPT_ERROR + rc=7 + fi + fi + + return +} + +stop() { + log_daemon_msg "Stopping $DESCRIPTION" + + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + start-stop-daemon --stop --quiet --pidfile $PIDSPATH/$PIDFILE + + wait_for_pid 'removed' $PIDSPATH/$PIDFILE + + if [ -n "$try" ]; then + log_end_msg $SCRIPT_ERROR + rc=0 # lsb states 1, but under status it is 2 (which is more prescriptive). Deferring to standard. + else + removePIDFile + log_end_msg $SCRIPT_OK + rc=0 + fi + else + log_end_msg $SCRIPT_ERROR + rc=7 + fi + + return +} + +reload() { + configtest || return $? + + log_daemon_msg "Reloading (via HUP) $DESCRIPTION" + + isRunning + + if [ $? -eq $TRUE ]; then + kill -HUP `cat $PIDSPATH/$PIDFILE` + log_end_msg $SCRIPT_OK + rc=0 + else + log_end_msg $SCRIPT_ERROR + rc=7 + fi + + return +} + +quietupgrade() { + log_daemon_msg "Peforming Quiet Upgrade $DESCRIPTION" + + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + kill -USR2 `cat $PIDSPATH/$PIDFILE` + kill -WINCH `cat $PIDSPATH/$PIDFILE.oldbin` + + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin` + wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin + removePIDFile $PIDSPATH/$PIDFILE.oldbin + + log_end_msg $SCRIPT_OK + rc=0 + else + log_end_msg $SCRIPT_ERROR + + log_daemon_msg "ERROR! Reverting back to original $DESCRIPTION" + + kill -HUP `cat $PIDSPATH/$PIDFILE` + kill -TERM `cat $PIDSPATH/$PIDFILE.oldbin` + kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin` + + wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin + removePIDFile $PIDSPATH/$PIDFILE.oldbin + + log_end_msg $SCRIPT_OK + rc=0 + fi + else + log_end_msg $SCRIPT_ERROR + rc=7 + fi + + return +} + +terminate() { + log_daemon_msg "Force terminating (via KILL) $DESCRIPTION" + + PIDS=`pidof $PS` || true + + [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE` + + for i in $PIDS; do + if [ "$i" = "$PIDS2" ]; then + kill $i + wait_for_pid 'removed' $PIDSPATH/$PIDFILE + removePIDFile + fi + done + + log_end_msg $SCRIPT_OK + rc=0 +} + +destroy() { + log_daemon_msg "Force terminating and may include self (via KILLALL) $DESCRIPTION" + killall $PS -q >> /dev/null 2>&1 + log_end_msg $SCRIPT_OK + rc=0 +} + +pidof_daemon() { + PIDS=`pidof $PS` || true + + [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE` + + for i in $PIDS; do + if [ "$i" = "$PIDS2" ]; then + return 1 + fi + done + + return 0 +} + +action="$1" +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|force-reload) + stop + # if [ $rc -ne 0 ]; then + # script_exit + # fi + sleep 1 + start + ;; + reload) + $1 + ;; + status) + status + ;; + configtest) + $1 + ;; + quietupgrade) + $1 + ;; + terminate) + $1 + ;; + destroy) + $1 + ;; + *) + FULLPATH=/etc/init.d/$PS + echo "Usage: $FULLPATH {start|stop|restart|force-reload|reload|status|configtest|quietupgrade|terminate|destroy}" + echo " The 'destroy' command should only be used as a last resort." + exit 3 + ;; +esac + +exit $rc diff --git a/docs/Nginx/nginx-1-config.md b/docs/Nginx/nginx-1-config.md new file mode 100644 index 0000000..9ed040b --- /dev/null +++ b/docs/Nginx/nginx-1-config.md @@ -0,0 +1,96 @@ + +## Nginx 陷阱和常见错误(以下为正确或者推荐配置) +--- +* 把 root 放在 location 区块外 + ``` + server { + server_name www.example.com; + root /var/www/Nginx -default/; + location / { + # [...] + } + location /foo { + # [...] + } + location /bar { + # [...] + } + } + ``` +* 简单的使用“ index ”指令一次就够了。只需要把它放到 http {} 区块里面,下面的就会继承这个配置 + + ``` + http { + index index.php index.htm index.html; + server { + server_name www.example.com; + location / { + # [...] + } + } + server { + server_name example.com; + location / { + # [...] + } + location /foo { + # [...] + } + } + } + ``` +* 不要使用 if 判断 Server Name + > 不推荐 + + ``` + server { + server_name example.com *.example.com; + if ($host ~* ^www\.(.+)) { + set $raw_domain $1; + rewrite ^/(.*)$ $raw_domain/$1 permanent; + } + # [...] + } + } + ``` + > 推荐配置 + + ``` + server { + server_name www.example.com; + return 301 $scheme://example.com$request_uri; + } + server { + server_name example.com; + # [...] + } + ``` +* 使用主机名来解析地址 + + > 不推荐配置 + + ``` + upstream { + server http://someserver; + } + + server { + listen myhostname:80; + # [...] + } + ``` + + > 推荐配置 + + ``` + upstream { + server http://10.48.41.12; + } + + server { + listen 127.0.0.16:80; + # [...] + } + ``` +* [更多信息](https://moonbingbing.gitbooks.io/openresty-best-practices/content/ngx/pitfalls_and_common_mistakes.html) + diff --git a/docs/Nginx/nginx-2-config.md b/docs/Nginx/nginx-2-config.md new file mode 100644 index 0000000..93a3621 --- /dev/null +++ b/docs/Nginx/nginx-2-config.md @@ -0,0 +1,114 @@ + +## Nginx 编译安装以及参数详解 +#### Nginx安装 +``` +# wget http://nginx.org/download/nginx-1.10.2.tar.gz +# tar xvf nginx-1.10.2.tar.gz -C /usr/local/src +# yum groupinstall "Development too +# yum -y install gcc wget gcc-c++ automake autoconf \ +-- libtool libxml2-devel libxslt-devel perl-devel \ +--perl-ExtUtils-Embed pcre-devel openssl-devel +# cd /usr/local/src/nginx-1.10.2 +# ./configure \ +--prefix=/usr/local/nginx \ 指向安装目录 +--sbin-path=/usr/sbin/nginx \ 指向(执行)程序文件(nginx) +--conf-path=/etc/nginx/nginx.conf \ 指向配置文件(nginx.conf) +--error-log-path=/var/log/nginx/error.log \ 指向错误日志目录 +--http-log-path=/var/log/nginx/access.log \ +--pid-path=/var/run/nginx.pid \ 指向pid文件(nginx.pid) +--lock-path=/var/run/nginx.lock \ 指向lock文件(nginx.lock)(安装文件锁定,防止安装文件被别人利用,或自己误操作。) +--http-client-body-temp-path=/var/tmp/nginx/client \ +--http-proxy-temp-path=/var/tmp/nginx/proxy \ +--http-fastcgi-temp-path=/var/tmp/nginx/fcgi \ +--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ +--http-scgi-temp-path=/var/tmp/nginx/scgi \ +--user=nginx \ 指定程序运行时的非特权用户 +--group=nginx \ 指定程序运行时的非特权用户组 +--with-pcre \ 启用pcre库 +--with-http_v2_module \ +--with-http_ssl_module \ 启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl) +--with-http_realip_module \ 启用ngx_http_realip_module支持(这个模块允许从请求标头更改客户端的IP地址值,默认为关) +--with-http_addition_module \ +--with-http_sub_module \ 启用ngx_http_sub_module支持(允许用一些其他文本替换nginx响应中的一些文本) +--with-http_dav_module \ 启用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默认情况下为关闭,需编译开启 +--with-http_flv_module \ 启用ngx_http_flv_module支持(提供寻求内存使用基于时间的偏移量文件) +--with-http_mp4_module \ +--with-http_gunzip_module \ 禁用ngx_http_gzip_module支持(该模块同-with-http_gzip_static_module功能一样) +--with-http_gzip_static_module \ 启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流) +--with-http_random_index_module \ 启用ngx_http_random_index_module支持(从目录中随机挑选一个目录索引) +--with-http_secure_link_module \ 启用ngx_http_secure_link_module支持(计算和检查要求所需的安全链接网址) +--with-http_stub_status_module \ 启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态) +--with-http_auth_request_module \ 禁用ngx_http_auth_basic_module(该模块是可以使用用户名和密码基于http基本认证方法来保护你的站点或其部分内容) +-–without-http_access_module 禁用ngx_http_access_module支持(该模块提供了一个简单的基于主机的访问控制。允许/拒绝基于ip地址) +–-without-http_autoindex_module 禁用disable ngx_http_autoindex_module支持(该模块用于自动生成目录列表,只在ngx_http_index_module模块未找到索引文件时发出请求。) +–-without-http_geo_module 禁用ngx_http_geo_module支持(创建一些变量,其值依赖于客户端的IP地址 +-–without-http_map_module 禁用ngx_http_map_module支持(使用任意的键/值对设置配置变量) +–-without-http_split_clients_module 禁用ngx_http_split_clients_module支持(该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等等) +–-without-http_referer_module 禁用disable ngx_http_referer_module支持(该模块用来过滤请求,拒绝报头中Referer值不正确的请求) +–-without-http_rewrite_module 禁用ngx_http_rewrite_module支持(该模块允许使用正则表达式改变URI,并且根据变量来转向以及选择配置 +–-without-http_proxy_module 禁用ngx_http_proxy_module支持(有关代理服务器) +-–without-http_fastcgi_module 禁用ngx_http_fastcgi_module支持(该模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。 )FastCGI一个常驻型的公共网关接口。 +–-without-http_upstream_ip_hash_module 禁用ngx_http_upstream_ip_hash_module支持(该模块用于简单的负载均衡) +-–with-http_perl_module 启用ngx_http_perl_module支持(该模块使nginx可以直接使用perl或通过ssi调用perl) +–-with-perl_modules_path= 设定perl模块路径 +-–with-perl= 设定perl库文件路径 +-–http-log-path= 设定access log路径 +-–http-client-body-temp-path= 设定http客户端请求临时文件路径 +-–http-proxy-temp-path= 设定http代理临时文件路径 +-–http-fastcgi-temp-path= 设定http fastcgi临时文件路径 +-–http-uwsgi-temp-path= 设定http uwsgi临时文件路径 +–-http-scgi-temp-path= 设定http scgi临时文件路径 +--without-http 禁用http server功能 +-–without-http-cache 禁用http cache功能 +-–with-mail 启用POP3/IMAP4/SMTP代理模块支持 +-–with-mail_ssl_module 启用ngx_mail_ssl_module支持 +-–without-mail_pop3_module 禁用pop3协议 +--with-file-aio \ +--with-ipv6 \ 启用ipv6支持 +--with-http_v2_module \ +--with-threads \ +--with-stream \ +-–with-libatomic= 指向libatomic_ops安装目录 +-–with-openssl= 指向openssl安装目录 +-–with-openssl-opt 在编译时为openssl设置附加参数 +--with-debug 启用debug日志 +--with-stream_ssl_module +--add-module=/home/tinywan/nchan-1.1.3/ +# make && make install +# mkdir -pv /var/tmp/nginx/client +``` + +#### 启动关闭重置Nginx +* 启动:直接执行以下命令,nginx就启动了,不需要改任何配置文件 +``` +/usr/local/nginx -1.5.1/sbin/nginx +``` +* 关闭 +``` +/usr/local/nginx -1.5.1/sbin/nginx -s stop +``` +* 重启 +``` +/usr/local/nginx -1.5.1/sbin/nginx -s reload +``` +C:\Program Files\Git\bin + +#### nginx root&alias文件路径配置 +nginx指定文件路径有两种方式root和alias,这两者的用法区别,使用方法总结了下,方便大家在应用过程中,快速响应。root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。 + +``` +location /abc/ { + alias /home/html/def/; +} +``` +alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。如果一个请求的URI是/abc/a.ttlsa.com/favicon.jgp时,web服务器将会返回服务器上的/home/html/def/a.ttlsa.com/favicon.jgp的文件。 + +###### alias注意要点 + +> 1.使用alias时,目录名后面一定要加”/”`。 + +> 2.alias可以指定任何名称。 + +> 3.alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。 + +> 4.alias只能位于location块中 \ No newline at end of file diff --git a/docs/Nginx/nginx-base-config.md b/docs/Nginx/nginx-base-config.md new file mode 100644 index 0000000..5700a2a --- /dev/null +++ b/docs/Nginx/nginx-base-config.md @@ -0,0 +1,366 @@ +#### [参考地址](https://mp.weixin.qq.com/s/Crj2Xo8-EJpbq40kXronug) +#### Nginx 配置文件 nginx.conf 详解 + +```javascript +#定义Nginx运行的用户和用户组 +user www www; + +#nginx进程数,建议设置为等于CPU总核心数。 +worker_processes 8; + +#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] +error_log /var/log/nginx/error.log info; + +#进程文件 +pid /var/run/nginx.pid; + +#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。 +worker_rlimit_nofile 65535; + +#工作模式与连接数上限 +events +{ +#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。 +use epoll; +#单个进程最大连接数(最大连接数=连接数*进程数) +worker_connections 65535; +} + +#设定http服务器 +http +{ +include mime.types; #文件扩展名与文件类型映射表 +default_type application/octet-stream; #默认文件类型 +#charset utf-8; #默认编码 +server_names_hash_bucket_size 128; #服务器名字的hash表大小 +client_header_buffer_size 32k; #上传文件大小限制 +large_client_header_buffers 4 64k; #设定请求缓 +client_max_body_size 8m; #设定请求缓 +sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。 +autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。 +tcp_nopush on; #防止网络阻塞 +tcp_nodelay on; #防止网络阻塞 +keepalive_timeout 120; #长连接超时时间,单位是秒 + +#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。 +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模块设置 +gzip on; #开启gzip压缩输出 +gzip_min_length 1k; #最小压缩文件大小 +gzip_buffers 4 16k; #压缩缓冲区 +gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议) +gzip_comp_level 2; #推荐6压缩级别(级别越高,压的越小,越浪费CPU计算资源) +gzip_types text/plain application/x-javascript text/css application/xml; +#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 +gzip_vary on; # 是否传输gzip压缩标志 +#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用 + +upstream blog.ha97.com { +#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 +server 192.168.80.121:80 weight=3; +server 192.168.80.122:80 weight=2; +server 192.168.80.123:80 weight=3; +} + +#虚拟主机的配置 +server +{ + #监听端口 + listen 80; + #域名可以有多个,用空格隔开 + server_name www.ha97.com ha97.com; + index index.html index.htm index.php; + root /data/www/ha97; + location ~ .*\.(php|php5)?$ + { + fastcgi_pass 127.0.0.1:9000; + fastcgi_index index.php; + include fastcgi.conf; + } + #图片缓存时间设置 + location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ + { + expires 10d; + } + #JS和CSS缓存时间设置 + location ~ .*\.(js|css)?$ + { + expires 1h; + } + #日志格式设定 + log_format access '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" $http_x_forwarded_for'; + #定义本虚拟主机的访问日志 + access_log /var/log/nginx/ha97access.log access; + + #对 "/" 启用反向代理 + location / { + proxy_pass http://127.0.0.1:88; + proxy_redirect off; + proxy_set_header X-Real-IP $remote_addr; + #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + #以下是一些反向代理的配置,可选。 + proxy_set_header Host $host; + client_max_body_size 10m; #允许客户端请求的最大单文件字节数 + client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, + proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) + proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) + proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) + proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 + proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置 + proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) + proxy_temp_file_write_size 64k; + #设定缓存文件夹大小,大于这个值,将从upstream服务器传 + } + + #设定查看Nginx状态的地址 + location /NginxStatus { + stub_status on; + access_log on; + auth_basic "NginxStatus"; + auth_basic_user_file conf/htpasswd; + #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。 + } + + #本地动静分离反向代理配置 + #所有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; + } + #所有静态文件由nginx直接读取不经过tomcat或resin + location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ + { expires 15d; } + location ~ .*.(js|css)?$ + { expires 1h; } +} +} + +``` +#### 常用配置案例 + +```html +user nginx nginx; +worker_processes 1; + +error_log /var/log/nginx/error.log; +#error_log logs/error.log notice; +#error_log logs/error.log info; + +pid /var/run/nginx/nginx.pid; + +events { + worker_connections 1024; +} + + +http { + include mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + #keepalive_timeout 0; + keepalive_timeout 65; + + #隐藏Nginx版本信息,禁止网站目录浏览 + server_tokens off; + autoindex off; + #当FastCGI后端服务器处理请求给出http响应码为4xx和5xx时,就转发给nginx + fastcgi_intercept_errors on; + + #关于fastcgi的配置 + 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压缩 + gzip on; + gzip_min_length 1k; + gzip_buffers 16 64k; + gzip_http_version 1.1; + gzip_comp_level 6; + gzip_types text/plain application/x-javascript text/css application/javascript text/javascript image/jpeg image/gif image/png application/xml application/json; + gzip_vary on; + gzip_disable "MSIE [1-6].(?!.*SV1)"; + + # + # 重定向所有带www请求到非www的请求 + # + server { + listen *:80; + listen *:443 ssl spdy; + server_name www.typecodes.com; + # ssl证书配置见文章 https://typecodes.com/web/lnmppositivessl.html + ssl_certificate /etc/nginx/ssl/typecodes.crt; + # ssl密钥文件见文章 https://typecodes.com/web/lnmppositivessl.html + ssl_certificate_key /etc/nginx/ssl/typecodes.key; + # 不产生日志 + access_log off; + + # 访问favicon.ico和robots.txt不跳转(把这两个文件存放在上级目录html中) + location ~* ^/(favicon.ico|robots.txt)$ { + root html; + expires max; + log_not_found off; + break; + } + + location / { + return 301 https://typecodes.com$request_uri; + } + } + + # + # 将所有http请求重定向到https + # + server { + listen *:80; + server_name typecodes.com; + # 不产生日志 + access_log off; + + # 访问favicon.ico和robots.txt不跳转(把这两个文件存放在上级目录html中) + location ~* ^/(favicon.ico|robots.txt)$ { + root html; + expires max; + log_not_found off; + break; + } + + location / { + return 301 https://typecodes.com$request_uri; + } + } + + # + # HTTPS server + # + server { + listen *:443 ssl spdy; + server_name typecodes.com; + + # ssl证书配置见文章 https://typecodes.com/web/lnmppositivessl.html + ssl_certificate /etc/nginx/ssl/typecodes.crt; + # ssl密钥文件见文章 https://typecodes.com/web/lnmppositivessl.html + ssl_certificate_key /etc/nginx/ssl/typecodes.key; + ssl_session_cache shared:SSL:20m; + ssl_session_timeout 10m; + ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!CAMELLIA; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #enables TLSv1, but not SSLv2, SSLv3 which is weak and should no longer be used. + ssl_prefer_server_ciphers on; + # 开启spdy功能 + add_header Alternate-Protocol 443:npn-spdy/3.1; + # 严格的https访问 + add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;"; + + #设置网站根目录 + root /usr/share/nginx/html/typecodes; + index index.php index.html; + + charset utf-8; + + #access_log /var/log/nginx/log/host.access.log main; + + #设置css/javascript/图片等静态资源的缓存时间 + location ~ .*\.(css|js|ico|png|gif|jpg|json|mp3|mp4|flv|swf)(.*) { + expires 60d; + } + + # include /etc/nginx/default.d/*.conf; + # 设置typecho博客的config文章不被访问,保证安全 + location = /config.inc.php{ + deny all; + } + + # keep the uploads directory safe by excluding php, php5, html file accessing. Applying to wordpress and typecho. + # location ~ .*/uploads/.*\.(php|php5|html)$ { + # deny all; + # } + + # 设置wordpress和typecho博客中,插件目录无法直接访问php或者html文件 + location ~ .*/plugins/.*\.(php|php5|html)$ { + deny all; + } + + #Rewrite的伪静态(针对wordpress/typecho),url地址去掉index.php + location / { + if (-f $request_filename/index.html){ + rewrite (.*) $1/index.html break; + } + if (-f $request_filename/index.php){ + rewrite (.*) $1/index.php; + } + if (!-f $request_filename){ + rewrite (.*) /index.php; + } + } + + #访问favicon.ico时不产生日志 + location = /favicon.ico { + access_log off; + } + + #设置40系列错误的应答文件为40x.html + error_page 400 401 402 403 404 /40x.html; + location = /40x.html { + root html; + index index.html index.htm; + } + + #设置50系列错误的应答文件为50x.html + # + error_page 500 501 502 503 504 /50x.html; + location = /50x.html { + root html; + index index.html index.htm; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # 设置Nginx和php通信机制为tcp的socket模式,而不是直接监听9000端口 + location ~ .*\.php(\/.*)*$ { + fastcgi_split_path_info ^(.+\.php)(/.+)$; + #fastcgi_pass 127.0.0.1:9000; + # the better form of fastcgi_pass than before + fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + } + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } +} +``` \ No newline at end of file diff --git a/docs/Nginx/nginx-basic.md b/docs/Nginx/nginx-basic.md new file mode 100644 index 0000000..b23d86a --- /dev/null +++ b/docs/Nginx/nginx-basic.md @@ -0,0 +1,48 @@ + +## Nginx 基础知识 +--- ++ [NGINX 所有 Modules](https://www.nginx.com/resources/wiki/modules/) +#### agentzh的Nginx教程(版本2016.07.21) ++ [agentzh的Nginx教程地址](https://openresty.org/download/agentzh-nginx-tutorials-zhcn.html) ++ Nginx 变量漫谈(一) + + Nginx 变量的值只有一种类型,那就是字符串 + + Nginx “变量插值” + ```bash + location /test { + set $first "hello "; + echo "${first}world"; + } + ``` + + set 指令(以及前面提到的 geo 指令)不仅有赋值的功能,它还有创建 Nginx 变量的副作用,即当作为赋值对象的变量尚不存在时 + + Nginx 变量一旦创建,其变量名的可见范围就是整个 Nginx 配置,甚至可以跨越不同虚拟主机的 server 配置块 + + Nginx 变量的生命期是不可能跨越请求边界的 ++ Nginx 变量漫谈(二) + + 跳转 + + 内部跳转:就是在处理请求的过程中,于服务器内部,从一个 location 跳转到另一个 location 的过程。 + + 外部跳转: HTTP 状态码 301 和 302 所进行的“外部跳转” + + 标准 ngx_rewrite 模块的 rewrite 配置指令其实也可以发起“内部跳转” + + Nginx 核心和各个 Nginx 模块提供的“预定义变量” + + Nginx 会在匹配参数名之前,自动把原始请求中的参数名调整为全部小写的形式 + + 如果你尝试改写另外一些只读的内建变量,比如 $arg_XXX 变量,在某些 Nginx 的版本中甚至可能导致进程崩溃。 ++ Nginx 变量漫谈(四) + + map 指令:用于定义两个 Nginx 变量之间的映射关系,或者说是函数关系 + + map 指令只能在 http 块中使用 + + map 配置指令的工作原理是为用户变量注册 “取处理程序”,并且实际的映射计算是在“取处理程序”中完成的,而“取处理程序”只有在该用户变量被实际读取时才会执行(当然,因为缓存的存在,只在请求生命期中的第一次读取中才被执行),所以对于那些根本没有用到相关变量的请求来说,就根本不会执行任何的无用计算。 ++ Nginx 变量漫谈(四) ++ [Nginx的11个Phases](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-phases.md) ++ [Nginx 陷阱和常见错误](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-1-config.md) ++ [Nginx 高并发系统内核优化](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-parameter-config.md) ++ [nginx 并发数问题思考:worker_connections,worker_processes与 max clients](http://liuqunying.blog.51cto.com/3984207/1420556?utm_source=tuicool) + + 从用户的角度,http 1.1协议下,由于浏览器默认使用两个并发连接,因此计算方法: + 1. nginx作为http服务器的时候: + `max_clients = worker_processes * worker_connections/2` + 1. nginx作为反向代理服务器的时候: + `max_clients = worker_processes * worker_connections/4` + + 从一般建立连接的角度,客户并发连接为1: + 1. nginx作为http服务器的时候: + `max_clients = worker_processes * worker_connections` + 1. nginx作为反向代理服务器的时候: + `max_clients = worker_processes * worker_connections/2` + + nginx做反向代理时,和客户端之间保持一个连接,和后端服务器保持一个连接 + + clients与用户数 + 同一时间的clients(客户端数)和用户数还是有区别的,当一个用户请求发送一个连接时这两个是相等的,但是当一个用户默认发送多个连接请求的时候,clients数就是用户数*默认发送的连接并发数了。 diff --git a/docs/Nginx/nginx-high-basic.md b/docs/Nginx/nginx-high-basic.md new file mode 100644 index 0000000..51025c3 --- /dev/null +++ b/docs/Nginx/nginx-high-basic.md @@ -0,0 +1,277 @@ +## Nginx高性能WEB服务器详解 +#### 第一章 初探 ++ [Nginx 编译安装以及参数详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-2-config.md) ++ NGINX变量详解 + - [x] [nginx变量使用方法详解笔记(1)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Develop/notes-1.md) + - [x] [nginx变量使用方法详解笔记(2)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Develop/notes-2.md) + - [x] [nginx变量使用方法详解笔记(3)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-2-config.md) ++ Nginx指令执行顺序 + - [x] [Nginx指令执行命令(01)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Develop/command-order-01.md) +#### 第二章 安装部署 ++ 启动错误:`Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)`,执行:`sudo fuser -k 80/tcp` ++ [基于域名、IP的虚拟主机配置](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-2-4-all-config.md) ++ [完整、标准配置实际示列](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-2-4-basic-config.md) ++ [日志文件配置与切割](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-2-4-log-cut.md) ++ alias 和 root 在location 下的应用 + - 通过alias 实现别名功能 + ``` + location /live { + alias /home/tinywan/HLS/; + } + ``` + - curl 请求结果 + ``` + tinywan@tinywan:~/HLS$ cat index.html + alias /home/tinywan/HLS/index.html + tinywan@tinywan:~/HLS$ curl http://127.0.0.1/live/index.html + alias /home/tinywan/HLS/index.html + ``` + - 结论: + 1. cul 请求 `/live/index.html`,那么Nginx将会在服务器上查找`/home/tinywan/HLS/index.html` 文件 + 1. 请求的`url` 中的`location`后面的部分会被追加到`alias `指定的目录后面,而`location`后面的`/live`路径将会别自动抛弃 + - 类似案例[2]: + - config配置信息 + ``` + location ~ ^/live/(.*)$ { + alias /home/tinywan/HLS/$1; + } + ``` + - curl 请求结果 + ``` + tinywan@tinywan:~/HLS$ pwd + /home/tinywan/HLS + tinywan@tinywan:~/HLS$ cat txt.txt + txt file + tinywan@tinywan:~/HLS$ curl http://127.0.0.1/live/txt.txt + txt file + ``` + - 如果url请求`/live/txt.txt`那么Nginx将会在服务器上查找`/home/tinywan/HLS/txt.txt` 文件 + - **与root 功能的差别**: + - config配置信息,注意:一下的`alias` 换成 `root ` + ``` + location ~ ^/live/(.*)$ { + root /home/tinywan/HLS/$1; + } + ``` + - curl 请求结果 + ``` + tinywan@tinywan:~/HLS$ curl http://127.0.0.1/live/txt.txt + + 404 Not Found + +

404 Not Found

+
openresty/1.11.2.1
+ + + ``` + - 日志文件信息(打开Nginx的rewrite日志:rewrite_log on;): + ``` + /home/tinywan/HLS/txt.txt/live/txt.txt + ``` + - **二者的区别** + 1. `alias` 指定的目录是当前目录 + 1. `root` 指定的是根目录 + 1. 一般建议的`location /`中通过`root`命令配置目录,其他目录匹配的位置使用`alias`命令 + - 案例[3]: + - config配置信息 + ``` + location ~ ^/live/(\w+)/(.*) { + alias /home/tinywan/HLS/live/$1/$2; + } + ``` + - curl 请求结果 + ``` + tinywan@tinywan:~/HLS/live/stream123$ pwd + /home/tinywan/HLS/live/stream123 + tinywan@tinywan:~/HLS/live/stream123$ cat index.m3u8 + 12312312312 + tinywan@tinywan:~/HLS/live/stream123$ curl "http://127.0.0.1/live/stream123/index.m3u8?token=1234&api=009132" + 12312312312 + ``` +####
第三章 架构初探 +- [ ] 测试一 +#### 第四章 高级配置 ++ 基本语法:location [=|~|~*|^~] /uri/ { … } + 1. `= `:严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。 + 2. `~ `:为区分大小写匹配(可用正则表达式) + 3. `!~ `:为区分大小写不匹配 + 4. `!~*`:为不区分大小写不匹配 + 5. ` ^~ `:如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式 ++ [Perl 正则表达式参考](http://www.runoob.com/perl/perl-regular-expressions.html) ++ 正则中需要转义的特殊字符小结 + - [1] ` $` 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n' 或 ‘\r'。要匹配 $ 字符本身,请使用 \$。 + - [2] ` ( )` 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 和。 + - [3] ` * ` 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 + - [4] ` +` 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。 + - [5] ` . ` 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。 + - [6] ` [ ]` 标记一个中括号表达式的开始。要匹配 [,请使用 \[。 + - [7] ` ? ` 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。 + - [8] ` \ ` 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n' 匹配字符 ‘n'。'\n' 匹配换行符。序列 ‘\\' 匹配 “\”,而 ‘\(' 则匹配 “(”。 + - [9] ` ^ ` 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。 + - [10] ` { }` 标记限定符表达式的开始。要匹配 {,请使用 \{。 + - [11] ` | ` 指明两项之间的一个选择。要匹配 |,请使用 \|。 + ++ 正则表达式 (Regular expression) 匹配location + - [1] `location ~* \.(gif|jpg|jpeg)$ { }`:匹配所有以 gif,jpg或jpeg 结尾的请求 + - [2] `location ~ /documents/Abc { }`:匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 + - [3] **目录匹配:** + 1. 可以匹配静态文件目录`(static/lib)` + 2. HLS直播目录`(/home/HLS/stream123/index.m3u8)` + 3. HLS/MP4/FLV点播视频目录`(/home/HLS/stream123.m3u8)` + 4. 匹配URL地址:`http://127.0.0.1/live/stream123/index.m3u8` + 5. nginx.conf 配置信息 + ``` + # 匹配任何以/live/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试 + location ^~ /live/ { + root /home/tinywan/HLS/; + } + # 以上匹配成功后的组合:/home/tinywan/HLS/live/.... + ``` ++ 后缀匹配 + 1. 匹配任何后缀文件名`gif|jpg|jpeg|png|css|js|ico|m3u8|ts` 结尾的请求 + 2. TS 文件匹配`http://127.0.0.1/live/stream123/11.ts` + 3. M3U8 文件匹配`http://127.0.0.1/live/stream123/index.m3u8` + 4. 匹配URL地址:`http://127.0.0.1/hls/123.m3u8` + 5. nginx.conf 配置信息 + ``` + location ~* \.(gif|jpg|jpeg|png|css|js|ico|m3u8|ts)$ { + root /home/tinywan/HLS/; + } + ``` ++ HSL直播目录匹配实际案例(请测试上线) + 1. 可以后缀文件名:`http://127.0.0.1/live/stream123/index.m3u8` + ``` + location ^~ /live/ { + root /home/tinywan/HLS/; + } + ``` + ++ [nginx配置location总结及rewrite规则写法](http://seanlook.com/2015/05/17/nginx-location-rewrite/) +#### 第五章 Gzip压缩 ++ 测试一 +#### 第六章 Rewrite 功能 ++ Rewrite 常用全局变量 + + 请求案例: `curl -G -d "name=Tinywan&age=24" http://127.0.0.1/rewrite_var/1192/index.m3u8` + + 接受结果: + + | 变量 | 值 |描述 | + | --------- | ----------- |----------- | + | $args | name=Tinywan&age=24 |存放URL 请求的指令 | + | $content_length | 0 | 请求头中的Content-length字段| + | $content_type | 0 |请求头中的Content-Type字段 | + | $document_root | /opt/openresty/nginx/html | 当前请求在root指令中指定的值 | + | $document_uri | /rewrite_var/1192/index.m3u8 | 与$uri相同 | + | $host | 127.0.0.1 |请求主机头字段,否则为服务器名称 | + | $http_user_agent | curl/7.47.0 | 客户端agent信息| + | $http_cookie | 0 | COOKIE变量的值| + | $limit_rate | 0 | 限制连接速率| + | $request_body_file | null | 客户端请求主体信息的临时文件名| + | $request_method | GET | 客户端请求的动作,通常为GET或POST | + | $remote_addr | 127.0.0.1 |客户端的IP地址 | + | $remote_port | 33516 |客户端端口| + | $remote_user | 0 | 已经经过Auth Basic Module验证的用户名| + | $request_filename | /opt/openresty/nginx/html/rewrite_var/1192/index.m3u8 |当前请求的文件路径 | + | $request_uri | /rewrite_var/1192/index.m3u8?name=Tinywan&age=24 |包含请求参数的原始URI,不包含主机名 | + | $query_string | name=Tinywan&age=24 | 与$args相同| + | $scheme | http |HTTP方法(如http,https | + | $server_protocol | HTTP/1.1 |请求使用的协议,通常是HTTP/1.0或HTTP/1.1 | + | $server_addr | 127.0.0.1 |服务器地址 | + | $server_name | localhost | 服务器名称| + | $server_port | 80 |请求到达服务器的端口号 | + | $uri | /rewrite_var/1192/index.m3u8 | 不带请求参数的当前URI| + | $binary_remote_addr | 乱码 | 二进制格式的客户端地址| + + + uri 介绍 **(Nginx中的URI是相对的URI)** + + URL:`https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/config.md` + + 绝对URI:`https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/config.md` + + 相对URI:`/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/config.md` + ![Markdown](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/URI-URL-Image.jpg) + ++ Rewrite 正则匹配` uri `参数接收 + 1. 请求案例:`curl http://192.168.18.143/live/tinywan123/index.m3u8` + 2. Nginx.conf配置文件 + ```Lua + location ~* ^/live/(\w+)/(\D+)\.(m3u8|ts)$ { + set $num $2; + set $arg1 $1; + echo "args === ${arg1}"; + echo "1==$1 2==$2 3==$3"; + echo "Total_numbser :: $num"; + echo "URI $uri"; + } + + ``` + 3. 输出结果 + ``` + args === tinywan123 + $1==tinywan123 $2==index $3==m3u8 + Total_numbser :: index + URI /live/tinywan123/index.m3u8 + Total_numbser :: + ``` + 4. $1为正则匹配多个英文字母或数字的字符串 `(\w+)` + $2 为正则匹配多个非数字 `(\D+)` + $3 为正则匹配的第一个值 `(m3u8|ts)` + `.` 需要用转义字符转义`\.` +## 第七章 代理服务 ++ [正向代理和反向代理的概念](#title) ++ [正向代理服务](#title) ++ [反向代理的服务](#title) ++ [Nginx日志服务](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-2-Log.md) ++ 负载均衡 ++ HTTP负载均衡 + - [x] [简单的负载平衡](http://nginx.org/en/docs/http/ngx_http_core_module.html?&_ga=1.179030369.49817296.1480411319#http) + - [x] [简单的负载平衡](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-7-Proxy-1.md) + - [x] [负载均衡五个配置实例](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-7-Proxy.md) + - [x] [Openresty-Lua动态修改upstream后端服务](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/openresty-nginx-lua-Proxy.md) ++ TCP负载均衡 + - [x] [Module ngx_stream_core_module](http://nginx.org/en/docs/stream/ngx_stream_core_module.html#stream) + - [x] [负载均衡](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-8-tcp-Proxy.md) ++ proxy_pass 代理的URL总结 + + 在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。 + + 将url中以/wap/开头的请求转发到后台对应的某台server上,注意最后的?$args,表明把原始url最后的get参数也给代理到后台 + ```bash + location ~* /wap/(\d+)/(.+) + { + proxy_pass http://mx$1.test.com:6601/$2?$args; + } + ``` + + 第一种配置,访问:`http://127.0.0.1/proxy/index.html` 会被代理到:`http://127.0.0.1:8000/index.html` + ```bash + location /proxy/ { + proxy_pass http://127.0.0.1:8000/; + } + ``` + + 第二种配置,访问:`http://127.0.0.1/proxy/index.html` 会被代理到:`http://127.0.0.1:8000/proxy/index.html` + ```bash + location /proxy/ { + proxy_pass http://127.0.0.1:8000; + } + ``` + + 第三种配置,访问:`http://127.0.0.1/proxy/index.html` 会被代理到:`http://127.0.0.1:8000/video/index.html` + ```bash + location /proxy/ { + proxy_pass http://127.0.0.1:8000/video/; + } + ``` + + 第四种配置,访问:`http://127.0.0.1/proxy/index.html` 会被代理到:`http://127.0.0.1:8000/videoindex.html` + ```bash + location /proxy/ { + proxy_pass http://127.0.0.1:8000/video; + } + ``` ++ location 直接访问: + + 以下配置,当访问:`http://127.0.0.1:8000/proxy/index.html` 会被匹配到:`/usr/local/nginx/html/proxy/index.html` + ```bash + location /proxy/ { + root /usr/local/nginx/html; + index index.html index.htm; + } + ``` + +## 第八章 缓存机制 ++ [Proxy Cache 缓存机制](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-8-proxy_cache.md) +## 第九章 Nginx初探1 ++ 测试一 +## 第十章 Nginx初探1 ++ 测试一 diff --git a/docs/Nginx/nginx-install.md b/docs/Nginx/nginx-install.md new file mode 100644 index 0000000..ca11e66 --- /dev/null +++ b/docs/Nginx/nginx-install.md @@ -0,0 +1,212 @@ +## 在Ubuntu 16.04中如何从源代码编译Nginx ++ NGINX可用作HTTP / HTTPS服务器,反向代理服务器,邮件代理服务器,负载均衡器,TLS终结器或缓存服务器。它是相当模块化的设计。它具有由社区创建的本机模块和第三方模块。以C编程语言编写,它是一个非常快速和轻便的软件。 +#### 从源头构建NGINX的要求,强制性要求: ++ OpenSSL库版本介于1.0.2 - 1.1.0之间 ++ Zlib库版本介于1.1.3 - 1.2.11之间 ++ PCRE库版本在4.4 - 8.40之间 ++ GCC编译器 +#### 可选要求: ++ PERL ++ LIBATOMIC_OPS ++ LibFD ++ MaxMind GeoIP ++ libxml2的 ++ libxslt +#### 开始之前 ++ 创建普通用户`sudo`访问。 ++ 切换到新用户:`su - ` ++ 更新系统:`sudo apt update && sudo apt upgrade -y` +#### 从源代码构建NGINX ++ 1、NGINX是用C编写的程序,所以我们需要安装C编译器(GCC)。 + + sudo apt install build-essential -y + ++ 2、下载最新版本的NGINX源代码并解压缩: + + wget https://nginx.org/download/nginx-1.13.1.tar.gz && tar zxvf nginx-1.13.1.tar.gz + ++ 3、下载NGINX依赖项的源代码并解压缩 + > NGINX依赖于3个库:PCRE,zlib和OpenSSL: + + # PCRE version 4.4 - 8.40 + wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz && tar xzvf pcre-8.40.tar.gz + + # zlib version 1.1.3 - 1.2.11 + wget http://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz + + # OpenSSL version 1.0.2 - 1.1.0 + wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz && tar xzvf openssl-1.1.0f.tar.gz + ++ 4、删除所有.tar.gz文件。我们不再需要了 + + wget https://nginx.org/download/nginx-1.13.1.tar.gz && tar zxvf nginx-1.13.1.tar.gz + ++ 5、转到NGINX源目录:`` + + cd ~/nginx-1.13.1 + ++ 6、有关帮助,您可以通过运行以下列出可用的配置开关 + + ./configure --help + ++ 7、配置,编译和安装NGINX: + + ./configure --prefix=/usr/share/nginx \ + --sbin-path=/usr/sbin/nginx \ + --modules-path=/usr/lib/nginx/modules \ + --conf-path=/etc/nginx/nginx.conf \ + --error-log-path=/var/log/nginx/error.log \ + --http-log-path=/var/log/nginx/access.log \ + --pid-path=/run/nginx.pid \ + --lock-path=/var/lock/nginx.lock \ + --user=www-data \ + --group=www-data \ + --build=Ubuntu \ + --http-client-body-temp-path=/var/lib/nginx/body \ + --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \ + --http-proxy-temp-path=/var/lib/nginx/proxy \ + --http-scgi-temp-path=/var/lib/nginx/scgi \ + --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \ + --with-openssl=../openssl-1.1.0f \ + --with-openssl-opt=enable-ec_nistp_64_gcc_128 \ + --with-openssl-opt=no-nextprotoneg \ + --with-openssl-opt=no-weak-ssl-ciphers \ + --with-openssl-opt=no-ssl3 \ + --with-pcre=../pcre-8.40 \ + --with-pcre-jit \ + --with-zlib=../zlib-1.2.11 \ + --with-compat \ + --with-file-aio \ + --with-threads \ + --with-http_addition_module \ + --with-http_auth_request_module \ + --with-http_dav_module \ + --with-http_flv_module \ + --with-http_gunzip_module \ + --with-http_gzip_static_module \ + --with-http_mp4_module \ + --with-http_random_index_module \ + --with-http_realip_module \ + --with-http_slice_module \ + --with-http_ssl_module \ + --with-http_sub_module \ + --with-http_stub_status_module \ + --with-http_v2_module \ + --with-http_secure_link_module \ + --with-mail \ + --with-mail_ssl_module \ + --with-stream \ + --with-stream_realip_module \ + --with-stream_ssl_module \ + --with-stream_ssl_preread_module \ + --with-debug \ + --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security + -Wdate-time -D_FORTIFY_SOURCE=2' \ + --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' + make + sudo make install + ++ 8、从主目录中删除所有下载的文件,在这种情况下/home/username: + + cd ~ + rm -r nginx-1.13.1/ openssl-1.1.0f/ pcre-8.40/ zlib-1.2.11/ + ++ 9、检查NGINX版本和编译时间选项: + + sudo nginx -v && sudo nginx -V + + # nginx version: nginx/1.13.0 (Ubuntu) + # built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) + # built with OpenSSL 1.1.0f 25 May 2017 + # TLS SNI support enabled + # configure arguments: --prefix=/etc/nginx . . . + # . . . + # . . . + ++ 10、检查语法和潜在错误: + + sudo nginx -t + # Will throw this error nginx: [emerg] mkdir() "/var/lib/nginx/body" failed (2: No such file or directory) + # Just create directory + mkdir -p /var/lib/nginx && sudo nginx -t + ++ 11、为NGINX创建systemd单元文件: + + sudo vim /etc/systemd/system/nginx.service + ++ 12、复制/粘贴以下内容: + > 注意:根据NGINX的编译方式,PID文件和NGINX二进制文件的位置可能不同。 + + [Unit] + Description=A high performance web server and a reverse proxy server + After=network.target + + [Service] + Type=forking + PIDFile=/run/nginx.pid + ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;' + ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;' + ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload + ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid + TimeoutStopSec=5 + KillMode=mixed + + [Install] + WantedBy=multi-user.target + ++ 13、启动并启用NGINX服务: + + sudo systemctl start nginx.service && sudo systemctl enable nginx.service + ++ 14、检查NGINX是否在重启后启动: + + sudo systemctl is-enabled nginx.service + # enabled + ++ 15、检查NGINX是否正在运行: + + sudo systemctl status nginx.service + ps aux | grep nginx + curl -I 127.0.0.1 + ++ 16、重新启动Ubuntu VPS以验证NGINX是否自动启动: + + sudo shutdown -r now + ++ 17、创建UFW NGINX应用程序配置文件: + + sudo vim /etc/ufw/applications.d/nginx + ++ 18、复制/粘贴以下内容: + + [Nginx HTTP] + title=Web Server (Nginx, HTTP) + description=Small, but very powerful and efficient web server + ports=80/tcp + + [Nginx HTTPS] + title=Web Server (Nginx, HTTPS) + description=Small, but very powerful and efficient web server + ports=443/tcp + + [Nginx Full] + title=Web Server (Nginx, HTTP + HTTPS) + description=Small, but very powerful and efficient web server + ports=80,443/tcp + ++ 19、现在,验证UFW应用配置文件是否被创建和识别: + sudo ufw app list + + # Available applications: + # Nginx Full + # Nginx HTTP + # Nginx HTTPS + # OpenSSH + +### Build + +cd to NGINX source directory & run this: + + ./configure --add-module=/path/to/nginx-rtmp-module + make + make install diff --git a/docs/Nginx/nginx-parameter-config.md b/docs/Nginx/nginx-parameter-config.md new file mode 100644 index 0000000..b21b75d --- /dev/null +++ b/docs/Nginx/nginx-parameter-config.md @@ -0,0 +1,425 @@ +## 高并发系统内核优化 ++ [Socket优化](#Socket) + + Nginx + + 系统内核 ++ [文件优化](#file) + + Nginx + + 系统内核 ++ [配置文件优化](#config-file) + + Nginx配置文件 + + 内核配置文件 + + PHP7配置文件 + + PHP-FPM配置文件 +### Socket优化 +#### Nginx ++ 子进程允许打开的连接数:`worker_connections` +#### 系统内核 ++ [内核参数的优化](http://blog.csdn.net/moxiaomomo/article/details/19442737) ++ 实践优化配置 + + 编辑: `vim /etc/sysctl.conf` + + 配置结果 + + ```bash + net.ipv4.tcp_max_tw_buckets = 6000 + net.ipv4.ip_local_port_range = 1024 65000 + net.ipv4.tcp_tw_recycle = 1 + net.ipv4.tcp_tw_reuse = 1 + net.ipv4.tcp_syncookies = 1 + net.core.somaxconn = 262144 + net.core.netdev_max_backlog = 262144 + net.ipv4.tcp_max_orphans = 262144 + net.ipv4.tcp_max_syn_backlog = 262144 + net.ipv4.tcp_syn_retries = 1 + net.ipv4.tcp_fin_timeout = 1 + net.ipv4.tcp_keepalive_time = 30 + ``` + + 执行命令使之生效:`/sbin/sysctl -p` +### 文件优化 +#### Nginx ++ 指当一个nginx进程打开的最多文件描述符数目:`worker_rlimit_nofile 100000;` +#### 系统内核 ++ 系统限制其最大进程数:`ulimit -n` ++ 编辑文件:`/etc/security/limits.conf` + + ```conf + # End of file + root soft nofile 65535 + root hard nofile 65535 + * soft nofile 65535 + * hard nofile 65535 + ``` +### 配置文件优化 ++ Nginx配置文件 + + ```lua + user www www; + worker_processes 8; + worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000; + error_log /www/log/nginx_error.log crit; + pid /usr/local/nginx/nginx.pid; + worker_rlimit_nofile 204800; + + events + { + use epoll; + worker_connections 204800; + } + + http + { + include mime.types; + default_type application/octet-stream; + + charset utf-8; + + server_names_hash_bucket_size 128; + client_header_buffer_size 2k; + large_client_header_buffers 4 4k; + client_max_body_size 8m; + + sendfile on; + tcp_nopush on; + + keepalive_timeout 60; + + fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 + keys_zone=TEST:10m + inactive=5m; + fastcgi_connect_timeout 300; + fastcgi_send_timeout 300; + fastcgi_read_timeout 300; + fastcgi_buffer_size 64k; + fastcgi_buffers 8 64k; + fastcgi_busy_buffers_size 128k; + fastcgi_temp_file_write_size 128k; + fastcgi_cache TEST; + fastcgi_cache_valid 200 302 1h; + fastcgi_cache_valid 301 1d; + fastcgi_cache_valid any 1m; + fastcgi_cache_min_uses 1; + fastcgi_cache_use_stale error timeout invalid_header http_500; + + open_file_cache max=204800 inactive=20s; + open_file_cache_min_uses 1; + open_file_cache_valid 30s; + tcp_nodelay on; + + #gzip on; + gzip on; + gzip_min_length 1k; + gzip_buffes 16 64k; + gzip_http_version 1.1; + gzip_comp_level 6; + gzip_types text/plain application/x-javascript text/css application/javascript text/javascript image/jpeg image/gif image/png application/xml application/json; + gzip_vary on; + gzip_disable "MSIE [1-6].(?!.*SV1)"; + + index index.php index.html index.htm; + + server + { + listen 8080; + server_name backup.aiju.com; + root /www/html/; #这里的位置很重要,不要写在其它指令里面,我曾经就调试了好久才发现这个问题的 + + location /status + { + stub_status on; + } + + location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { + #root /home/www/sansan-web/public; + expires 3d; + } + + location ~ ^/(status|ping)$ + { + include fastcgi_params; + fastcgi_pass unix:/var/run/php7.0.22-fpm.sock; + fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; + } + + location = /favicon.ico { + access_log off; + } + + error_page 400 401 402 403 404 /40x.html; + #location = /40x.html { + # root html; + #} + + error_page 500 501 502 503 504 /50x.html; + location = /50x.html { + root html; + } + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + location ~ \.php$ { + fastcgi_pass unix:/var/run/php7.0.22-fpm.sock; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + fastcgi_buffer_size 128k; + fastcgi_buffers 4 256k; + fastcgi_busy_buffers_size 256k; + fastcgi_connect_timeout 300; + fastcgi_send_timeout 300; + fastcgi_read_timeout 300; + } + + location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ + { + expires 30d; + } + + log_format access '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" $http_x_forwarded_for'; + access_log /www/log/access.log access; + } + } + ``` ++ 完整的内核优化配置 + + ```lua + net.ipv4.ip_forward = 0 + net.ipv4.conf.default.rp_filter = 1 + net.ipv4.conf.default.accept_source_route = 0 + kernel.sysrq = 0 + kernel.core_uses_pid = 1 + net.ipv4.tcp_syncookies = 1 + kernel.msgmnb = 65536 + kernel.msgmax = 65536 + kernel.shmmax = 68719476736 + kernel.shmall = 4294967296 + net.ipv4.tcp_max_tw_buckets = 6000 + net.ipv4.tcp_sack = 1 + net.ipv4.tcp_window_scaling = 1 + net.ipv4.tcp_rmem = 4096 87380 4194304 + net.ipv4.tcp_wmem = 4096 16384 4194304 + net.core.wmem_default = 8388608 + net.core.rmem_default = 8388608 + net.core.rmem_max = 16777216 + net.core.wmem_max = 16777216 + net.core.netdev_max_backlog = 262144 + net.core.somaxconn = 262144 + net.ipv4.tcp_max_orphans = 3276800 + net.ipv4.tcp_max_syn_backlog = 262144 + net.ipv4.tcp_timestamps = 0 + net.ipv4.tcp_synack_retries = 1 + net.ipv4.tcp_syn_retries = 1 + net.ipv4.tcp_tw_recycle = 1 + net.ipv4.tcp_tw_reuse = 1 + net.ipv4.tcp_mem = 94500000 915000000 927000000 + net.ipv4.tcp_fin_timeout = 1 + net.ipv4.tcp_keepalive_time = 30 + net.ipv4.ip_local_port_range = 1024 65000 + ``` +#### PHP.ini配置文件优化(PHP7) ++ 启用Zend Opcache,php.ini配置文件中加入 + + ```bash + opcache.enable=1 + zend_extension=opcache.so + opcache.memory_consumption=128 + opcache.interned_strings_buffer=8 + opcache.max_accelerated_files=4000 + opcache.revalidate_freq=60 + opcache.fast_shutdown=1 + opcache.enable_cli=1 + opcache.huge_code_pages=1 + opcache.file_cache=/tmp + ``` ++ 缓存文件记录 + + ```bash + www@TinywanAliYun:/tmp$ tree -L 6 + . + ├── 8fc9c56d14b6542c6ff7147207730f6b + │   └── home + │   └── www + │   └── web + │   └── go-study-line + │   ├── application + │   ├── config + │   ├── public + │   ├── runtime + │   ├── thinkphp + │   └── vendor + ``` ++ 使用新的编译器,使用新一点的编译器, 推荐GCC 4.8以上, 因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升 ++ 开启HugePages,然后开启Opcache的huge_code_pages + + 系统中开启HugePages + + ```bash + sudo sysctl vm.nr_hugepages=512 + ``` + + 分配512个预留的大页内存 + + ```bash + $ cat /proc/meminfo | grep Huge + AnonHugePages: 106496 kB + HugePages_Total: 512 + HugePages_Free: 504 + HugePages_Rsvd: 27 + HugePages_Surp: 0 + Hugepagesize: 2048 kB + ``` + + 然后在php.ini中加入,`opcache.huge_code_pages=1` ++ 开启Opcache File Cache,`opcache.file_cache=/tmp` ++ 启用Zend Opcache +#### PHP-FPM优化 ++ 结构 + + ```bash + +---> php.ini PHP配置文件 + | + PHP-->|---> php-fpm 服务控制脚本 + +---> php-fpm.conf 进程服务主配置文件 + | + +---> www.conf 进程服务扩展配置文件 + ``` ++ `php.ini` + + ```php + # 设置错误日志的路径 + error_log = /var/log/php-fpm/error.log + + # 引入www.conf文件中的配置 + include=/usr/local/php7/etc/php-fpm.d/*.conf + + # 设置主进程打开的最大文件数 + rlimit_files = 102400 + ``` + ++ `php-fpm.conf` 进程服务主配置文件 + + ```php + pid = run/php-fpm.pid + # 设置错误日志的路径 + error_log = /var/log/php-fpm/error.log + + # 引入www.conf文件中的配置 + include=/usr/local/php7/etc/php-fpm.d/*.conf + + # 设置主进程打开的最大文件数 + rlimit_files = 65535 + ``` + ++ `www.conf` 进程服务扩展配置文件 + + ```php + # 设置启动进程的帐户和组 + user = www + group = www + + # 设置php监听方式,注意这里要设置PHP套接字文件的权限,默认是root,Nginx无法访问 + # listen = 127.0.0.1:9000 + listen = /var/run/php-fpm/php-fpm.sock + + #backlog数,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:http://www.3gyou.cc/?p=41 + + listen.allowed_clients = 127.0.0.1 + # 允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程, + # listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. + # 如果没有设置或者为空,则允许任何服务器请求连接 + + #backlog数,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:http://www.3gyou.cc/?p=41 + listen.backlog = 4096 + + # unix socket设置选项,如果使用tcp方式访问,这里注释即可。 + listen.owner = www + listen.group = www + listen.mode = 0660 + + # 开启慢日志 + slowlog = /var/log/php-fpm/php-slow.log + request_slowlog_timeout = 10s + request_terminate_timeout = 30 + + #对于专用服务器,pm可以设置为static。 + pm = dynamic + + # 设置工作进程数(根据实际情况设置) + pm.max_children = 50 + + # pm.start_servers不能小于pm.min_spare_servers,推荐为最大的pm.max_children的%10 + pm.start_servers = 8 + pm.min_spare_servers = 5 + pm.max_spare_servers = 10 + pm.max_requests = 10240 + + # cat /usr/local/php-5.5.10/etc/php-fpm.conf | grep status_path + pm.status_path = /status + + # 设置扩展配置主进程打开的最大文件数 + rlimit_files = 65535 + + # 设置php的session目录(所属用户和用户组都是www) + php_value[session.save_handler] = files + php_value[session.save_path] = /var/tmp/php/session + ``` + ++ 调整PHP-FPM(Nginx)的子进程 + + 日志中出现以下警告消息,这意味着没有足够的PHP-FPM进程 + + ```php + [19-Aug-2017 01:02:20] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers) + [19-Aug-2017 01:02:21] WARNING: [pool www] server reached pm.max_children setting (256), consider raising it + ``` + + + 根据系统内存量来计算和更改这些值,` /etc/php-fpm.d/www.conf` + + ```php + pm.max_children = 50 + pm.start_servers = 5 + pm.min_spare_servers = 5 + pm.max_spare_servers = 35 + ``` + + + 以下命令将帮助我们确定每个(PHP-FPM)子进程使用的内存: + > RSS列显示PHP-FPM进程的未交换的物理内存使用量,单位为千字节 + > 平均每个PHP-FPM进程在我的机器上占用大约75MB的RAM + + ```php + ps -ylC php-fpm --sort:rss + ``` + + + pm.max_children的适当值可以计算为: + + ```php + pm.max_children = Total RAM dedicated to the web server / Max child process size + ``` + + + 在我的情况下是56MB,服务器有16GB的RAM,所以: + >我留下了一些记忆,让系统呼吸。在计算内存使用情况时,您需要考虑计算机上运行的任何其他服务。 + + ```php + pm.max_children = 15806MB / 56MB = 282 + # Tinywan 计算方式(实战) + # pm.max_children = (15806MB - 1024MB) / 57MB = 259 + ``` + + + 已经改变了如下设置 + >请注意,非常高的价值并不意味着任何好处 + + ```php + pm.max_children = 256 + pm.start_servers = 32 + pm.min_spare_servers = 32 + pm.max_spare_servers = 128 + pm.max_requests = 65535 + ``` + + + 您可以使用此方便的命令检查单个PHP-FPM进程的平均内存使用情况 + + ```php + ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }' + ``` + ++ HELP + + [php-fpm - 启动参数及重要配置详解](http://www.4wei.cn/archives/1002061) + + [php-fpm backlog参数潜在问题](http://blog.csdn.net/willas/article/details/11634825) + + [Adjusting child processes for PHP-FPM (Nginx)](https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/) + + [Nginx的worker_processes优化](http://blog.chinaunix.net/uid-26000296-id-3987521.html) + diff --git a/docs/Nginx/nginx-phases.md b/docs/Nginx/nginx-phases.md new file mode 100644 index 0000000..9ccc952 --- /dev/null +++ b/docs/Nginx/nginx-phases.md @@ -0,0 +1,155 @@ +## nginx的11个phases ++ 一个请求经过nginx处理的过程中,会经过一系列的阶段(phases),下面这个表格列出了nginx的所有phases,每个阶段可选的退出方式,包含的模块和对应的指令 + + | Phases | modules / directives | description | + | :------------ |:---------------:| -----:| + | NGX_HTTP_POST_READ_PHASE | HttpRealIpModule | 读取请求内容阶段 | + | NGX_HTTP_SERVER_REWRITE_PHASE
Location ( server rewrite ) | HttpRewriteModule
rewrite | 请求地址重写阶段| + | NGX_HTTP_FIND_CONFIG_PHASE
Location ( location selection ) | HttpCoreModule
location |配置查找阶段| + | NGX_HTTP_REWRITE_PHASE
Location ( location rewrite ) | HttpLuaModule
set_by_lua、rewrite_by_lua |请求地址重写阶段| + | NGX_HTTP_POST_REWRITE_PHASE | 不注册其他模块 |请求地址重写提交阶段| + | NGX_HTTP_PREACCESS_PHASE
( location selection ) | degradation
NginxHttpLimitZoneModule / limit_zone
HttpLimitReqModule / limit req |访问权限检查准备阶段| + | NGX_HTTP_ACCESS_PHASE | HttpAccessModule
allow, deny
NginxHttpAuthBasicModule
HttpLuaModule
access_by_lua |访问权限检查阶段| + | NGX_HTTP_POST_ACCESS_PHASE | 该指令可以用于控制access阶段的指令彼此之间的协作方式 |访问权限检查提交阶段| + | NGX_HTTP_TRY_FILES_PHASE | HttpCoreModule
try_files |配置项try_files处理阶段| + | NGX_HTTP_CONTENT_PHASE | HttpProxyModule / proxy
HttpLuaModule / content_by_lua
HttpCoreModule / proxy_pass
HttpFcgiModule / FastCGI |内容产生阶段| + | NGX_HTTP_TRY_FILES_PHASE | HttpLogModuel / access_log |日志模块处理阶段| + ++ 各个phase说明 + + (1) post read phase + > `post-read ` 属于 `rewrite`阶段 + + > `post-read` 支持Nginx模块的钩子 + + > 内置模块 `ngx_realip` 把它的处理程序`post-read`分阶段挂起,强制重写请求的原始地址作为特定请求头的值 + + ``` + server { + listen 8080; + + set_real_ip_from 127.0.0.1; + real_ip_header X-My-IP; + + location /test { + set $addr $remote_addr; + echo "from: $addr"; + } + } + ``` + + > 该配置告诉Nginx强制将每个请求的原始地址重写127.0.0.1为请求头的值X-My-IP。同时它使用内置变量 `$remote_addr`来输出请求的原始地址 + + ``` + $ curl -H 'X-My-IP: 1.2.3.4' localhost:8080/test + from: 1.2.3.4 + ``` + > curl 参数 -H :自定义头信息传递给服务器 + + > 该选项X-My-IP: 1.2.3.4在请求中包含一个额外的HTTP头 + + > 测试结果 + ``` + $ curl localhost:8080/test + from: 127.0.0.1 + + $ curl -H 'X-My-IP: abc' localhost:8080/test + from: 127.0.0.1 + `` + + + server_rewrite phase + + > 这个阶段主要进行初始化全局变量,或者server级别的重写。如果把重写指令放到 server 中,那么就进入了server rewrite 阶段。(重写指令见rewrite phase) + + > ( 1 ) `server-rewrite ` 阶段运行时间早于 `rewrite` 阶段 + + ``` + location /tinywan { + set $bbb "$aaa, world"; + echo $bbb; + } + set $aaa "HELLO"; + ``` + + > `set $a hello` 声明被放在`server`指令中,所以它运行在`server-rewrite`阶段 + + > 因此 `set $b "$a, world'" `,在location指令中执行 `set ` 指令后,它将获得正确的`$a`值 + + > 执行结果 + + ``` + # curl http://127.0.0.2:8008/tinywan + HELLO, world + ``` + > ( 2 ) `post-read` 阶段阶段运行时间早于 `server-rewrite` 阶段执行 + + ``` + server { + listen 8080; + + set $addr $remote_addr; + + set_real_ip_from 127.0.0.1; + real_ip_header X-Real-IP; + + location /test { + echo "from: $addr"; + } + } + ``` + + > ( 3 ) `ngx_realip` 阶段阶段运行时间早于 `server 的 set 指令` 阶段执行 + + ``` + $ curl -H 'X-Real-IP: 1.2.3.4' localhost:8080/test + from: 1.2.3.4 + ``` + + > 服务器指令中的命令集始终比模块ngx_realip晚, + + > ( 4 ) `server-rewrite` 阶段阶段运行时间早于 `find-config` 阶段执行 + + + find config phase + > ( 5 ) `find-config` 阶段阶段运行时间早于 `rewrite` 阶段执行 + + > 这个阶段使用重写之后的uri来查找对应的location,值得注意的是该阶段可能会被执行多次,因为也可能有location级别的重写指令。这个阶段并不支持 Nginx 模块注册处理程序,而是由 Nginx 核心来完成当前请求与 location 配置块之间的配对工作 + + + rewrite phase: + > 如果把重写指令放到 location中,那么就进入了rewrite phase,这个阶段是location级别的uri重写阶段,重写指令也可能会被执行多次 + + > 有`HttpRewriteModule` 的set指令、rewrite指令 + + > HttpLuaModule的 set_by_lua指令, + + > ngx_set_misc模块的set_unescape_uri指令 + + > 另外HttpRewriteModule的几乎所有指令都属于rewrite阶段。 ++ 结论:作用域为同一个phase的不同modules的指令,如果modules之间做了特殊的兼容,则它们按照指令在配置文件中出现的顺序依次执行下来 ++ HttpLuaModule 模块指令 + + init_by_lua + > 在nginx重新加载配置文件时,运行里面lua脚本,常用于全局变量的申请。例如lua_shared_dict共享内存的申请,只有当nginx重起后,共享内存数据才清空,这常用于统计。 + + + set_by_lua + > 设置一个变量,常用与计算一个逻辑,然后返回结果,该阶段不能运行Output API、Control API、Subrequest API、Cosocket API + + + rewrite_by_lua + > 在access阶段前运行,主要用于rewrite + + + access_by_lua + > 主要用于访问控制,能收集到大部分变量,类似status需要在log阶段才有。这条指令运行于nginx access阶段的末尾,因此总是在 allow 和 deny 这样的指令之后运行,虽然它们同属 access 阶段。 + + + content_by_lua + > 阶段是所有请求处理阶段中最为重要的一个,运行在这个阶段的配置指令一般都肩负着生成内容(content)并输出HTTP响应。 + + + header_filter_by_lua + > 一般只用于设置Cookie和Headers等,该阶段不能运行Output API、Control API、Subrequest API、Cosocket API + + + body_filter_by_lua + > 一般会在一次请求中被调用多次, 因为这是实现基于 HTTP 1.1 chunked 编码的所谓“流式输出”的,该阶段不能运行Output API、Control API、Subrequest API、Cosocket API + + + log_by_lua + > 该阶段总是运行在请求结束的时候,用于请求的后续操作,如在共享内存中进行统计数据,如果要高精确的数据统计,应该使用body_filter_by_lua + ++ --with-http_realip_module 模块 + + set_real_ip_from   192.168.1.0/24;     指定接收来自哪个前端发送的 IP head 可以是单个IP或者IP段 + + set_real_ip_from 192.168.2.1; + + real_ip_header X-Real-IP; IP head 的对应参数,默认即可。 \ No newline at end of file diff --git a/docs/Nginx/nginx-start-script.md b/docs/Nginx/nginx-start-script.md new file mode 100644 index 0000000..d667548 --- /dev/null +++ b/docs/Nginx/nginx-start-script.md @@ -0,0 +1,757 @@ +## 服务启动、停止和重启脚本 ++ [Ubuntu 14.04.2 LTS 启动脚本](#Ubuntu14) + + PHP-FPM 服务 + + Nginx 服务 ++ [Ubuntu 16.04.2 LTS 启动脚本](#Ubuntu16) + + PHP-FPM 服务 + + Nginx 服务 +##
Ubuntu 14.04.2 LTS 启动脚本 +### PHP-FPM 服务 ++ 下载文件[php-fpm.sh](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/PHP/PHP-FPM/php-fpm.sh) ++ 注意配置文件:`sudo vim /usr/local/php-7.2/etc/php-fpm.conf` + > 务必开启配置文件的pid路径:`pid = run/php-fpm.pid` +   否则会报错:`no pid file found - php-fpm is not running ?`  ++ CP到默认开启的服务脚本: + + ``` + sudo cp php-fpm.sh /etc/init.d/php-fpm + ``` ++ 给予权限: + + ``` + sudo chmod +x /etc/init.d/php-fpm + ``` ++ 使用`sysv-rc-conf`安装,[如何安装sysv-rc-conf管理服务](http://blog.csdn.net/gatieme/article/details/45251389) + + ![Markdown](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/nginx_start_script.png) ++ `php-fpm.sh`代码 + + ``` + #! /bin/sh + ### BEGIN INIT INFO + # Provides: php-fpm + # Required-Start: $remote_fs $network + # Required-Stop: $remote_fs $network + # Default-Start: 2 3 4 5 + # Default-Stop: 0 1 6 + # Short-Description: starts php-fpm + # Description: starts the PHP FastCGI Process Manager daemon + ### END INIT INFO + + prefix=/opt/php-7.0.9 # 只需要修改这里就可以里,这里是编译路径 + exec_prefix=${prefix} + + php_fpm_BIN=${exec_prefix}/sbin/php-fpm + php_fpm_CONF=${prefix}/etc/php-fpm.conf + php_fpm_PID=${prefix}/var/run/php-fpm.pid + + php_opts="--fpm-config $php_fpm_CONF --pid $php_fpm_PID" + + wait_for_pid () { + try=0 + + while test $try -lt 35 ; do + + case "$1" in + 'created') + if [ -f "$2" ] ; then + try='' + break + fi + ;; + + 'removed') + if [ ! -f "$2" ] ; then + try='' + break + fi + ;; + esac + + echo -n . + try=`expr $try + 1` + sleep 1 + + done + + } + case "$1" in + start) + echo -n "Starting PHP-FPM Server ... " + + $php_fpm_BIN --daemonize $php_opts + + if [ "$?" != 0 ] ; then + echo " failed" + exit 1 + fi + + wait_for_pid created $php_fpm_PID + + if [ -n "$try" ] ; then + echo " failed" + exit 1 + else + echo "[OK]" + fi + ;; + + stop) + echo -n "Stopping PHP-FPM Server ... " + + if [ ! -r $php_fpm_PID ] ; then + echo "warning, no pid file found - php-fpm is not running ?" + exit 1 + fi + + kill -QUIT `cat $php_fpm_PID` + + wait_for_pid removed $php_fpm_PID + + if [ -n "$try" ] ; then + echo " failed. Use force-quit" + exit 1 + else + echo " [OK]" + fi + ;; + + force-quit) + echo -n "Terminating PHP-FPM " + + if [ ! -r $php_fpm_PID ] ; then + echo "warning, no pid file found - php-fpm is not running ?" + exit 1 + fi + + kill -TERM `cat $php_fpm_PID` + + wait_for_pid removed $php_fpm_PID + + if [ -n "$try" ] ; then + echo " failed" + exit 1 + else + echo " [OK]" + fi + ;; + + restart) + $0 stop + $0 start + ;; + + reload) + + echo -n "Reload service php-fpm " + + if [ ! -r $php_fpm_PID ] ; then + echo "warning, no pid file found - php-fpm is not running ?" + exit 1 + fi + + kill -USR2 `cat $php_fpm_PID` + + echo "[OK]" + ;; + + *) + echo "Usage: $0 {start|stop|force-quit|restart|reload}" + exit 1 + ;; + + esac + ``` ++ 运行效果 + + ```bash + www@tinywan:~$ sudo service php-fpm restart + Stopping PHP-FPM Server ... [OK] + Starting PHP-FPM Server ... [OK] + ``` +### Nginx 服务 + ++ 第一种安装方式 + + 查看当前nginx是否已经在开机启动项里面: + + ```bash + ls /etc/rc* + ``` + + 如何安装 + + ```bash + #使用wget -O 下载并以不同的文件名保存 + sudo wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx + # 给与权限 + sudo chmod +x /etc/init.d/nginx + # 设置为启动项 + sudo update-rc.d nginx defaults + ``` + +   需要修改的地方: + +   1、`NGINXPATH=${NGINXPATH:-/opt/openresty/nginx}` 修改为自己的路径 + +   2、`PIDSPATH=${PIDSPATH:-$NGINXPATH/logs}` pid文件路径 + > 如果在配置文件修改为:`pid /run/nginx.pid;` +         PIDSPATH=${PIDSPATH:-$NGINXPATH/logs}修改为:PIDSPATH="/run" ++   第二种安装方式 + + 和PHP-FPM一样,`nginx.sh`代码 + + ```bash + #! /bin/sh + ### BEGIN INIT INFO + # Provides: nginx + # Required-Start: $remote_fs $syslog + # Required-Stop: $remote_fs $syslog + # Default-Start: 2 3 4 5 + # Default-Stop: 0 1 6 + # Short-Description: nginx init.d dash script for Ubuntu or other *nix. + # Description: nginx init.d dash script for Ubuntu or other *nix. + ### END INIT INFO + #------------------------------------------------------------------------------ + # nginx - this Debian Almquist shell (dash) script, starts and stops the nginx + # daemon for Ubuntu and other *nix releases. + # + # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ + # proxy and IMAP/POP3 proxy server. This \ + # script will manage the initiation of the \ + # server and it's process state. + # + # processname: nginx + # config: /usr/local/nginx/conf/nginx.conf + # pidfile: /usr/local/nginx/logs/nginx.pid + # Provides: nginx + + #------------------------------------------------------------------------------ + # Functions + #------------------------------------------------------------------------------ + LSB_FUNC=/lib/lsb/init-functions + + # Test that init functions exists + test -r $LSB_FUNC || { + echo "$0: Cannot find $LSB_FUNC! Script exiting." 1>&2 + exit 5 + } + + . $LSB_FUNC + + #------------------------------------------------------------------------------ + # Consts + #------------------------------------------------------------------------------ + # Include nginx defaults if available + if [ -f /etc/default/nginx ]; then + . /etc/default/nginx + fi + + # Minimize path + PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + + PS=${PS:-"nginx"} # process name + DESCRIPTION=${DESCRIPTION:-"Nginx Server..."} # process description + NGINXPATH=${NGINXPATH:-/opt/openresty/nginx} # root path where installed + DAEMON=${DAEMON:-$NGINXPATH/sbin/nginx} # path to daemon binary + NGINX_CONF_FILE=${NGINX_CONF_FILE:-$NGINXPATH/conf/nginx.conf} # config file path + PIDNAME=${PIDNAME:-"nginx"} # lets you do $PS-slave + PIDFILE=${PIDFILE:-$PIDNAME.pid} # pid file + PIDSPATH=${PIDSPATH:-$NGINXPATH/logs} # default pid location, you should change it + RUNAS=${RUNAS:-root} # user to run as + SCRIPT_OK=0 # ala error codes + SCRIPT_ERROR=1 # ala error codes + TRUE=1 # boolean + FALSE=0 # boolean + + #------------------------------------------------------------------------------ + # Simple Tests + #------------------------------------------------------------------------------ + + # Test if nginx is a file and executable + test -x $DAEMON || { + echo "$0: You don't have permissions to execute nginx." 1>&2 + exit 4 + } + + # You can also set your conditions like so: + # set exit condition + # set -e + + #------------------------------------------------------------------------------ + # Functions + #------------------------------------------------------------------------------ + + setFilePerms(){ + if [ -f $PIDSPATH/$PIDFILE ]; then + chmod 400 $PIDSPATH/$PIDFILE + fi + } + + configtest() { + $DAEMON -t -c $NGINX_CONF_FILE + } + + getPSCount() { + return `pgrep -f $PS | wc -l` + } + + isRunning() { + if [ $1 ]; then + pidof_daemon $1 + PID=$? + + if [ $PID -gt 0 ]; then + return 1 + else + return 0 + fi + else + pidof_daemon + PID=$? + + if [ $PID -gt 0 ]; then + return 1 + else + return 0 + fi + fi + } + + #courtesy of php-fpm + wait_for_pid () { + try=0 + + while test $try -lt 35 ; do + case "$1" in + 'created') + if [ -f "$2" ]; then + try='' + break + fi + ;; + + 'removed') + if [ ! -f "$2" ]; then + try='' + break + fi + ;; + esac + + try=`expr $try + 1` + sleep 1 + done + } + + status(){ + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + log_warning_msg "$DESCRIPTION found running with processes: `pidof $PS`" + rc=0 + else + log_warning_msg "$DESCRIPTION is NOT running." + rc=3 + fi + + return + } + + removePIDFile(){ + if [ $1 ]; then + if [ -f $1 ]; then + rm -f $1 + fi + else + #Do default removal + if [ -f $PIDSPATH/$PIDFILE ]; then + rm -f $PIDSPATH/$PIDFILE + fi + fi + } + + start() { + log_daemon_msg "Starting $DESCRIPTION" + + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + log_end_msg $SCRIPT_ERROR + rc=0 + else + start-stop-daemon --start --quiet --chuid \ + $RUNAS --pidfile $PIDSPATH/$PIDFILE --exec $DAEMON \ + -- -c $NGINX_CONF_FILE + status=$? + setFilePerms + + if [ "${status}" -eq 0 ]; then + log_end_msg $SCRIPT_OK + rc=0 + else + log_end_msg $SCRIPT_ERROR + rc=7 + fi + fi + + return + } + + stop() { + log_daemon_msg "Stopping $DESCRIPTION" + + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + start-stop-daemon --stop --quiet --pidfile $PIDSPATH/$PIDFILE + + wait_for_pid 'removed' $PIDSPATH/$PIDFILE + + if [ -n "$try" ]; then + log_end_msg $SCRIPT_ERROR + rc=0 # lsb states 1, but under status it is 2 (which is more prescriptive). Deferring to standard. + else + removePIDFile + log_end_msg $SCRIPT_OK + rc=0 + fi + else + log_end_msg $SCRIPT_ERROR + rc=7 + fi + + return + } + + reload() { + configtest || return $? + + log_daemon_msg "Reloading (via HUP) $DESCRIPTION" + + isRunning + + if [ $? -eq $TRUE ]; then + kill -HUP `cat $PIDSPATH/$PIDFILE` + log_end_msg $SCRIPT_OK + rc=0 + else + log_end_msg $SCRIPT_ERROR + rc=7 + fi + + return + } + + quietupgrade() { + log_daemon_msg "Peforming Quiet Upgrade $DESCRIPTION" + + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + kill -USR2 `cat $PIDSPATH/$PIDFILE` + kill -WINCH `cat $PIDSPATH/$PIDFILE.oldbin` + + isRunning + isAlive=$? + + if [ "${isAlive}" -eq $TRUE ]; then + kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin` + wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin + removePIDFile $PIDSPATH/$PIDFILE.oldbin + + log_end_msg $SCRIPT_OK + rc=0 + else + log_end_msg $SCRIPT_ERROR + + log_daemon_msg "ERROR! Reverting back to original $DESCRIPTION" + + kill -HUP `cat $PIDSPATH/$PIDFILE` + kill -TERM `cat $PIDSPATH/$PIDFILE.oldbin` + kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin` + + wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin + removePIDFile $PIDSPATH/$PIDFILE.oldbin + + log_end_msg $SCRIPT_OK + rc=0 + fi + else + log_end_msg $SCRIPT_ERROR + rc=7 + fi + + return + } + + terminate() { + log_daemon_msg "Force terminating (via KILL) $DESCRIPTION" + + PIDS=`pidof $PS` || true + + [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE` + + for i in $PIDS; do + if [ "$i" = "$PIDS2" ]; then + kill $i + wait_for_pid 'removed' $PIDSPATH/$PIDFILE + removePIDFile + fi + done + + log_end_msg $SCRIPT_OK + rc=0 + } + + destroy() { + log_daemon_msg "Force terminating and may include self (via KILLALL) $DESCRIPTION" + killall $PS -q >> /dev/null 2>&1 + log_end_msg $SCRIPT_OK + rc=0 + } + + pidof_daemon() { + PIDS=`pidof $PS` || true + + [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE` + + for i in $PIDS; do + if [ "$i" = "$PIDS2" ]; then + return 1 + fi + done + + return 0 + } + + action="$1" + case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|force-reload) + stop + # if [ $rc -ne 0 ]; then + # script_exit + # fi + sleep 1 + start + ;; + reload) + $1 + ;; + status) + status + ;; + configtest) + $1 + ;; + quietupgrade) + $1 + ;; + terminate) + $1 + ;; + destroy) + $1 + ;; + *) + FULLPATH=/etc/init.d/$PS + echo "Usage: $FULLPATH {start|stop|restart|force-reload|reload|status|configtest|quietupgrade|terminate|destroy}" + echo " The 'destroy' command should only be used as a last resort." + exit 3 + ;; + esac + + exit $rc + ``` ++ 根据自己环境,配置文件路径,下面修改为Openresty下的Nginx启动项(Nginx 安装在/usr/local/openresty/目录下) + + ```bash + sudo vim /etc/init.d/nginx + NGINXPATH=${NGINXPATH:-/usr/local/openresty/nginx} + ``` ++ 开启服务 + + ```bash + sudo service nginx restart + [sudo] password for www: + * Stopping Nginx Server... [ OK ] + * Starting Nginx Server... [ OK ] + ``` +## Ubuntu 16.04.2 LTS 启动脚本 +### PHP-FPM 服务 ++ `php-fpm.sh`脚本代码 同上 ++ 注意,需要重新加载服务: + + ``` + sudo systemctl daemon-reload + ``` ++ 开启服务 + + ```bash + sudo systemctl start php-fpm.service + ``` ++ 停止服务 + + ```javascript + sudo systemctl stop php-fpm.service + ``` ++ 重启服务 + + ```javascript + sudo systemctl restart php-fpm.service + ``` ++ 服务状态 + + ```bash + sudo systemctl status php-fpm.service + ● php-fpm.service - LSB: starts php-fpm + Loaded: loaded (/etc/init.d/php-fpm; bad; vendor preset: enabled) + Active: active (running) since Sun 2017-10-22 11:16:06 CST; 1 day 5h ago + Docs: man:systemd-sysv-generator(8) + CGroup: /system.slice/php-fpm.service + ├─ 7670 php-fpm: pool www + ├─ 7711 php-fpm: pool www + ├─ 7752 php-fpm: pool www + └─18244 php-fpm: master process (/usr/local/php-7.1.8/etc/php-fpm.conf) + + Oct 22 11:16:06 TinywanAliYun php-fpm[18232]: Stopping PHP-FPM Server ... . [OK] + Oct 22 11:16:06 TinywanAliYun systemd[1]: Stopped LSB: starts php-fpm. + Oct 22 11:16:06 TinywanAliYun systemd[1]: Starting LSB: starts php-fpm... + Oct 22 11:16:06 TinywanAliYun php-fpm[18239]: Starting PHP-FPM Server ... [OK] + Oct 22 11:16:06 TinywanAliYun systemd[1]: Started LSB: starts php-fpm. + ``` +### Nginx 服务 ++ [Debian/Ubuntu Nginx init Script](http://kbeezie.com/debian-ubuntu-nginx-init-script/) + + > [1]通常情况下,如果你从存储库安装Nginx,这个初始化脚本已经包含在内。但是,如果您从源代码安装,或者没有使用标准路径,您可能需要这个。 + [2]如果发现停止/重新启动等不起作用,则您的pid文件位置可能不正确。您可以将其设置在nginx.conf中,也可以在此处更改init脚本以指向正确的pid位置 + ++ `nginx.sh`代码: + + ```javascript + #!/bin/sh + + ### BEGIN INIT INFO + # Provides: nginx + # Required-Start: $all + # Required-Stop: $all + # Default-Start: 2 3 4 5 + # Default-Stop: 0 1 6 + # Short-Description: starts the nginx web server + # Description: starts nginx using start-stop-daemon + ### END INIT INFO + + PATH=/opt/bin:/opt/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + DAEMON=/usr/local/openresty/nginx/sbin/nginx + NAME=nginx + DESC=nginx + + test -x $DAEMON || exit 0 + + # Include nginx defaults if available + if [ -f /etc/default/nginx ] ; then + . /etc/default/nginx + fi + + set -e + + case "$1" in + start) + echo -n "Starting $DESC: " + start-stop-daemon --start --quiet --pidfile /var/run/nginx.pid \ + --exec $DAEMON -- $DAEMON_OPTS + echo "$NAME." + ;; + stop) + echo -n "Stopping $DESC: " + start-stop-daemon --stop --quiet --pidfile /var/run/nginx.pid \ + --exec $DAEMON + echo "$NAME." + ;; + restart|force-reload) + echo -n "Restarting $DESC: " + start-stop-daemon --stop --quiet --pidfile \ + /var/run/nginx.pid --exec $DAEMON + sleep 1 + start-stop-daemon --start --quiet --pidfile \ + /var/run/nginx.pid --exec $DAEMON -- $DAEMON_OPTS + echo "$NAME." + ;; + reload) + echo -n "Reloading $DESC configuration: " + start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/nginx.pid \ + --exec $DAEMON + echo "$NAME." + ;; + *) + N=/etc/init.d/$NAME + echo "Usage: $N {start|stop|restart|force-reload}" >&2 + exit 1 + ;; + esac + + exit 0 + ``` ++ CP到默认开启的服务脚本: + + ``` + sudo cp nginx.sh /etc/init.d/nginx + ``` ++ 给予权限: + + ``` + sudo chmod +x /etc/init.d/nginx + ``` ++ 设置为开机启动项: + + ``` + sudo update-rc.d nginx defaults + ``` ++ 重新加载服务: + + ``` + sudo systemctl daemon-reload + ``` ++ 开启服务 + + ```javascript + sudo systemctl start nginx.service + ``` ++ 停止服务 + + ```javascript + sudo systemctl stop nginx.service + ``` ++ 重启服务 + + ```javascript + sudo systemctl restart nginx.service + ``` ++ 服务状态 + + ```bash + sudo systemctl status nginx.service + ● nginx.service + Loaded: loaded (/etc/init.d/nginx; bad; vendor preset: enabled) + Active: active (running) since Mon 2017-10-23 16:48:24 CST; 1min 28s ago + Docs: man:systemd-sysv-generator(8) + Process: 19089 ExecStop=/etc/init.d/nginx stop (code=exited, status=0/SUCCESS) + Process: 19138 ExecStart=/etc/init.d/nginx start (code=exited, status=0/SUCCESS) + CGroup: /system.slice/nginx.service + ├─19142 nginx: master process /usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.con + ├─19143 nginx: worker process + └─19144 nginx: cache manager process + + Oct 23 16:48:24 TinywanAliYun systemd[1]: Starting nginx.service... + Oct 23 16:48:24 TinywanAliYun nginx[19138]: Starting NGINX Web Server: ok + Oct 23 16:48:24 TinywanAliYun systemd[1]: Started nginx.service. + ``` ++ 参考文章: + + [Nginx官方参考](https://www.nginx.com/resources/wiki/start/topics/tutorials/solaris_11/#startup-script) + + [linux wget 命令用法详解(附实例说明)](http://www.jb51.net/LINUXjishu/86326.html) + + [理解Linux系统/etc/init.d目录和/etc/rc.local脚本](http://blog.csdn.net/acs713/article/details/7322082) + + [Ubuntu启动项设置——之update-rc.d 命令使用](http://blog.csdn.net/typ2004/article/details/38712887) diff --git a/docs/index.md b/docs/index.md index 8dfe4ee..1f6e1ff 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,8 +1,6 @@ + Nginx 教程 (Nginx tutorial) - + [Nginx编译安装](/Nginx/nginx-install.md) - + [Nginx.conf详解和配置](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-base-config.md) - + [Nginx基础知识](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-basic.md) - + [Nginx高性能WEB服务器详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-high-basic.md) - + [Nginx高并发系统内核优化和PHP7配置文件优化](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-parameter-config.md) - + [Nginx和PHP-FPM启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-start-script.md) - + 项目案例 (Project notes) \ No newline at end of file ++ [Nginx编译安装](/Nginx/nginx-install.md) ++ [Nginx编译安装 nginx-1-config.md](/Nginx/nginx-1-config.md) ++ [Nginx 基础知识](/Nginx/nginx-basic.md) ++ [Nginx编译安装](/Nginx/nginx-install.md) + From cde7d328bf774376ed1447770953a7a9d57b92f5 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 10:24:11 +0800 Subject: [PATCH 037/106] update Readme --- docs/Nginx/nginx-base-config.md | 153 +++++++++++++++++--------------- docs/Nginx/nginx-install.md | 32 ++++--- docs/index.md | 66 +++++++++++++- 3 files changed, 162 insertions(+), 89 deletions(-) diff --git a/docs/Nginx/nginx-base-config.md b/docs/Nginx/nginx-base-config.md index 5700a2a..ce0b955 100644 --- a/docs/Nginx/nginx-base-config.md +++ b/docs/Nginx/nginx-base-config.md @@ -29,44 +29,44 @@ worker_connections 65535; #设定http服务器 http { -include mime.types; #文件扩展名与文件类型映射表 -default_type application/octet-stream; #默认文件类型 -#charset utf-8; #默认编码 -server_names_hash_bucket_size 128; #服务器名字的hash表大小 -client_header_buffer_size 32k; #上传文件大小限制 -large_client_header_buffers 4 64k; #设定请求缓 -client_max_body_size 8m; #设定请求缓 -sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。 -autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。 -tcp_nopush on; #防止网络阻塞 -tcp_nodelay on; #防止网络阻塞 -keepalive_timeout 120; #长连接超时时间,单位是秒 - -#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。 -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模块设置 -gzip on; #开启gzip压缩输出 -gzip_min_length 1k; #最小压缩文件大小 -gzip_buffers 4 16k; #压缩缓冲区 -gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议) -gzip_comp_level 2; #推荐6压缩级别(级别越高,压的越小,越浪费CPU计算资源) -gzip_types text/plain application/x-javascript text/css application/xml; -#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 -gzip_vary on; # 是否传输gzip压缩标志 -#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用 - -upstream blog.ha97.com { -#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 -server 192.168.80.121:80 weight=3; -server 192.168.80.122:80 weight=2; -server 192.168.80.123:80 weight=3; + include mime.types; #文件扩展名与文件类型映射表 + default_type application/octet-stream; #默认文件类型 + #charset utf-8; #默认编码 + server_names_hash_bucket_size 128; #服务器名字的hash表大小 + client_header_buffer_size 32k; #上传文件大小限制 + large_client_header_buffers 4 64k; #设定请求缓 + client_max_body_size 8m; #设定请求缓 + sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。 + autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。 + tcp_nopush on; #防止网络阻塞 + tcp_nodelay on; #防止网络阻塞 + keepalive_timeout 120; #长连接超时时间,单位是秒 + + #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。 + 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模块设置 + gzip on; #开启gzip压缩输出 + gzip_min_length 1k; #最小压缩文件大小 + gzip_buffers 4 16k; #压缩缓冲区 + gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议) + gzip_comp_level 2; #推荐6压缩级别(级别越高,压的越小,越浪费CPU计算资源) + gzip_types text/plain application/x-javascript text/css application/xml; + #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 + gzip_vary on; # 是否传输gzip压缩标志 + #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用 + + upstream blog.ha97.com { + #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 + server 192.168.80.121:80 weight=3; + server 192.168.80.122:80 weight=2; + server 192.168.80.123:80 weight=3; } #虚拟主机的配置 @@ -78,22 +78,26 @@ server server_name www.ha97.com ha97.com; index index.html index.htm index.php; root /data/www/ha97; + location ~ .*\.(php|php5)?$ { - fastcgi_pass 127.0.0.1:9000; - fastcgi_index index.php; - include fastcgi.conf; + fastcgi_pass 127.0.0.1:9000; + fastcgi_index index.php; + include fastcgi.conf; } + #图片缓存时间设置 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { - expires 10d; + expires 10d; } + #JS和CSS缓存时间设置 location ~ .*\.(js|css)?$ { - expires 1h; + expires 1h; } + #日志格式设定 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' @@ -103,48 +107,53 @@ server #对 "/" 启用反向代理 location / { - proxy_pass http://127.0.0.1:88; - proxy_redirect off; - proxy_set_header X-Real-IP $remote_addr; - #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - #以下是一些反向代理的配置,可选。 - proxy_set_header Host $host; - client_max_body_size 10m; #允许客户端请求的最大单文件字节数 - client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, - proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) - proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) - proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) - proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 - proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置 - proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) - proxy_temp_file_write_size 64k; - #设定缓存文件夹大小,大于这个值,将从upstream服务器传 + proxy_pass http://127.0.0.1:88; + proxy_redirect off; + proxy_set_header X-Real-IP $remote_addr; + #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + #以下是一些反向代理的配置,可选。 + proxy_set_header Host $host; + client_max_body_size 10m; #允许客户端请求的最大单文件字节数 + client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, + proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) + proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) + proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) + proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 + proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置 + proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) + proxy_temp_file_write_size 64k; + #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } #设定查看Nginx状态的地址 location /NginxStatus { - stub_status on; - access_log on; - auth_basic "NginxStatus"; - auth_basic_user_file conf/htpasswd; - #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。 + stub_status on; + access_log on; + auth_basic "NginxStatus"; + auth_basic_user_file conf/htpasswd; + #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。 } #本地动静分离反向代理配置 #所有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; + 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; } + #所有静态文件由nginx直接读取不经过tomcat或resin location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ - { expires 15d; } + { + expires 15d; + } location ~ .*.(js|css)?$ - { expires 1h; } -} + { + expires 1h; + } + } } ``` diff --git a/docs/Nginx/nginx-install.md b/docs/Nginx/nginx-install.md index ca11e66..01bef3f 100644 --- a/docs/Nginx/nginx-install.md +++ b/docs/Nginx/nginx-install.md @@ -19,27 +19,33 @@ #### 从源代码构建NGINX + 1、NGINX是用C编写的程序,所以我们需要安装C编译器(GCC)。 - sudo apt install build-essential -y - + ```bash + sudo apt install build-essential -y + ``` + 2、下载最新版本的NGINX源代码并解压缩: - wget https://nginx.org/download/nginx-1.13.1.tar.gz && tar zxvf nginx-1.13.1.tar.gz - + ```bash + wget https://nginx.org/download/nginx-1.13.1.tar.gz && tar zxvf nginx-1.13.1.tar.gz + ``` + 3、下载NGINX依赖项的源代码并解压缩 > NGINX依赖于3个库:PCRE,zlib和OpenSSL: - # PCRE version 4.4 - 8.40 - wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz && tar xzvf pcre-8.40.tar.gz - - # zlib version 1.1.3 - 1.2.11 - wget http://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz - - # OpenSSL version 1.0.2 - 1.1.0 - wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz && tar xzvf openssl-1.1.0f.tar.gz + ```bash + # PCRE version 4.4 - 8.40 + wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz && tar xzvf pcre-8.40.tar.gz + + # zlib version 1.1.3 - 1.2.11 + wget http://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz + + # OpenSSL version 1.0.2 - 1.1.0 + wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz && tar xzvf openssl-1.1.0f.tar.gz + ``` + 4、删除所有.tar.gz文件。我们不再需要了 - wget https://nginx.org/download/nginx-1.13.1.tar.gz && tar zxvf nginx-1.13.1.tar.gz + ```bash + wget https://nginx.org/download/nginx-1.13.1.tar.gz && tar zxvf nginx-1.13.1.tar.gz + ``` + 5、转到NGINX源目录:`` diff --git a/docs/index.md b/docs/index.md index 1f6e1ff..ab275e7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,64 @@ +![Author](https://img.shields.io/badge/Author-Tinywan-green.svg) +[![Conda](https://img.shields.io/conda/pn/conda-forge/python.svg)]() +[![GitHub license](https://img.shields.io/github/license/Tinywan/tinywan-react-app.svg)](https://github.com/Tinywan/tinywan-react-app/blob/master/LICENSE) +## 目录 + Nginx 教程 (Nginx tutorial) -+ [Nginx编译安装](/Nginx/nginx-install.md) -+ [Nginx编译安装 nginx-1-config.md](/Nginx/nginx-1-config.md) -+ [Nginx 基础知识](/Nginx/nginx-basic.md) -+ [Nginx编译安装](/Nginx/nginx-install.md) + + [Nginx编译安装](/Nginx/nginx-install.md) + + [Nginx.conf详解和配置](/Nginx/nginx-base-config.md) + + [Nginx基础知识](/Nginx/nginx-basic.md) + + [Nginx高性能WEB服务器详解](/Nginx/nginx-high-basic.md) + + [Nginx高并发系统内核优化和PHP7配置文件优化](/Nginx/nginx-parameter-config.md) + + [Nginx和PHP-FPM启动脚本](/Nginx/nginx-start-script.md) + + 项目案例 (Project notes) + + [Nginx 同一个IP上配置多个HTTPS主机](/Nginx/more-domain-config.md) + + [Nginx 如何配置一个安全的HTTPS网站服务器](http://www.cnblogs.com/tinywan/p/7542629.html) + + [Nginx 配置启用 HTTP/2](http://www.cnblogs.com/tinywan/p/7860774.html) + + 扩展模块 (Third-party module) + + [nginx-vod-module](http://www.cnblogs.com/tinywan/p/7879559.html) + + [nginx-module-vts](http://www.cnblogs.com/tinywan/p/7872366.html) + + [ngx_cache_purge](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-8-proxy_cache.md) + + [lua-nginx-module](http://www.cnblogs.com/tinywan/p/6538006.html) + + [nginx-rtmp-module](http://www.cnblogs.com/tinywan/p/6639360.html) ++ Lua 教程 + + [Lua 基础语法](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Lua-Script/lua-basic.md) + + [luajit 执行文件默认安装路径](#Nginx_base_knowledge) + + [lua中self.__index = self 详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Lua-Script/oop/self__index.md) ++ Redis 教程 + + [Redis 安装](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis/redis-install.md) + + [Redis 配置详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis/redis-config.md) + + [Redis 基础知识](#Redis_base_knowledge) + + [Redis 开发与运维](#Redis-DevOps) + + [Redis执行Lua脚本基本用法](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis/redis-lua.md) ++ Openresty 教程 + + [安装默认配置信息](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-basic.md) + + [ngx_lua APi 方法和常量](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-api.md) + + [ngx_lua 扩展模块学习](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-resty-module.md) + + [lua-resty-upstream-healthcheck使用](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/lua-resty-upstream-healthcheck.md) + + [Openresty与Nginx_RTMP](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-rtmp.md) + + [自己写的一个简单项目lua_project_v0.01](https://github.com/Tinywan/lua_project_v0.01) ++ PHP 教程 + + [PHP脚本](#PHP_base_knowledge) + + [PHP脚本运行Redis](#PHP_Run_Redis) + + [PHP7中php.ini/php-fpm/www.conf的配置,Nginx和PHP-FPM的开机自动启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/PHP/PHP-FPM/config.md) + + [PHP 脚本执行一个Redis 订阅功能,用于监听键过期事件,返回一个回调,API接受改事件](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis-PHP/Php-Run-Redis-psubscribe/nohupRedisNotify.php) ++ Linux 教程 + + [Linux 基础知识](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Linux/linux-basic.md) ++ Shell 教程 + + Shell脚本 + + [编写快速安全Bash脚本的建议](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Shell/write-shell-suggestions.md) + + [shell脚本实现分日志级别记录日志](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_Log.sh) + + [Nginx日志定时备份和删除](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_Nginx_Log_cut.sh) + + [SHELL脚本小技巧](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_script.md) + + [Mysql 自动备份脚本安全加锁机制](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/backup_mysql.sh) ++ 流媒体教程 + + [Nginx配置Rtmp支持Hls的直播和点播功能](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/HLS-live-vod.md) + + [HLS视频直播和点播的Nginx的Location的配置信息(成功)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/HLS-live-vod-locatiuon-config.md) +## Lua-Ngx +![Markdown](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/Nginx-Phase.png) + +## 随意打赏我 + +|支付宝打赏|微信打赏| +|:----:|:----:| +|![image](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/alipay.png)|![image](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/wechat.png)| From f1c112e5b1b8ccd7e2afc7933fa818f01903935e Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 10:25:53 +0800 Subject: [PATCH 038/106] update Readme format --- docs/Nginx/nginx-base-config.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Nginx/nginx-base-config.md b/docs/Nginx/nginx-base-config.md index ce0b955..8c2536e 100644 --- a/docs/Nginx/nginx-base-config.md +++ b/docs/Nginx/nginx-base-config.md @@ -1,7 +1,7 @@ #### [参考地址](https://mp.weixin.qq.com/s/Crj2Xo8-EJpbq40kXronug) #### Nginx 配置文件 nginx.conf 详解 -```javascript +```bash #定义Nginx运行的用户和用户组 user www www; @@ -159,7 +159,7 @@ server ``` #### 常用配置案例 -```html +```bash user nginx nginx; worker_processes 1; From 49208c1d224c1f7e19175e29b3f397b1133ab1a0 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 11:04:44 +0800 Subject: [PATCH 039/106] update Readme format --- docs/Nginx/nginx-high-basic.md | 43 ++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/docs/Nginx/nginx-high-basic.md b/docs/Nginx/nginx-high-basic.md index 51025c3..882ee1d 100644 --- a/docs/Nginx/nginx-high-basic.md +++ b/docs/Nginx/nginx-high-basic.md @@ -1,31 +1,34 @@ -## Nginx高性能WEB服务器详解 -#### 第一章 初探 +# Nginx高性能WEB服务器详解 +## 第一章 初探 + [Nginx 编译安装以及参数详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-2-config.md) + NGINX变量详解 - - [x] [nginx变量使用方法详解笔记(1)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Develop/notes-1.md) - - [x] [nginx变量使用方法详解笔记(2)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Develop/notes-2.md) - - [x] [nginx变量使用方法详解笔记(3)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-2-config.md) + * [nginx变量使用方法详解笔记(1)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Develop/notes-1.md) + * [nginx变量使用方法详解笔记(2)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Develop/notes-2.md) + * [nginx变量使用方法详解笔记(3)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/nginx-2-config.md) + Nginx指令执行顺序 - - [x] [Nginx指令执行命令(01)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Develop/command-order-01.md) -#### 第二章 安装部署 + * [Nginx指令执行命令(01)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Develop/command-order-01.md) + +## 第二章 安装部署 + 启动错误:`Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)`,执行:`sudo fuser -k 80/tcp` + [基于域名、IP的虚拟主机配置](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-2-4-all-config.md) + [完整、标准配置实际示列](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-2-4-basic-config.md) + [日志文件配置与切割](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-2-4-log-cut.md) -+ alias 和 root 在location 下的应用 - - 通过alias 实现别名功能 - ``` - location /live { ++ alias 和 root 在location 下的应用 + + 通过alias 实现别名功能 + + ```bash + location /live { alias /home/tinywan/HLS/; - } - ``` - - curl 请求结果 - ``` - tinywan@tinywan:~/HLS$ cat index.html - alias /home/tinywan/HLS/index.html - tinywan@tinywan:~/HLS$ curl http://127.0.0.1/live/index.html - alias /home/tinywan/HLS/index.html - ``` + } + ``` + + curl 请求结果 + + ```bash + tinywan@tinywan:~/HLS$ cat index.html + alias /home/tinywan/HLS/index.html + tinywan@tinywan:~/HLS$ curl http://127.0.0.1/live/index.html + alias /home/tinywan/HLS/index.html + ``` - 结论: 1. cul 请求 `/live/index.html`,那么Nginx将会在服务器上查找`/home/tinywan/HLS/index.html` 文件 1. 请求的`url` 中的`location`后面的部分会被追加到`alias `指定的目录后面,而`location`后面的`/live`路径将会别自动抛弃 From c8ea9ecaeff6c3b8fe713de2c60c88d8d83c881d Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 11:07:00 +0800 Subject: [PATCH 040/106] update Readme format --- docs/Nginx/nginx-install.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/Nginx/nginx-install.md b/docs/Nginx/nginx-install.md index 01bef3f..eff9015 100644 --- a/docs/Nginx/nginx-install.md +++ b/docs/Nginx/nginx-install.md @@ -1,22 +1,26 @@ -## 在Ubuntu 16.04中如何从源代码编译Nginx +# 在Ubuntu 16.04中如何从源代码编译Nginx + NGINX可用作HTTP / HTTPS服务器,反向代理服务器,邮件代理服务器,负载均衡器,TLS终结器或缓存服务器。它是相当模块化的设计。它具有由社区创建的本机模块和第三方模块。以C编程语言编写,它是一个非常快速和轻便的软件。 -#### 从源头构建NGINX的要求,强制性要求: + +## 从源头构建NGINX的要求,强制性要求: + OpenSSL库版本介于1.0.2 - 1.1.0之间 + Zlib库版本介于1.1.3 - 1.2.11之间 + PCRE库版本在4.4 - 8.40之间 + GCC编译器 -#### 可选要求: + +## 可选要求: + PERL + LIBATOMIC_OPS + LibFD + MaxMind GeoIP + libxml2的 + libxslt -#### 开始之前 + +## 开始之前 + 创建普通用户`sudo`访问。 + 切换到新用户:`su - ` + 更新系统:`sudo apt update && sudo apt upgrade -y` -#### 从源代码构建NGINX + +## 从源代码构建NGINX + 1、NGINX是用C编写的程序,所以我们需要安装C编译器(GCC)。 ```bash From 600bc416a1fb6df6880d00414ba7c6cdcac35589 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 11:09:45 +0800 Subject: [PATCH 041/106] update Readme format 001 --- docs/Nginx/nginx-install.md | 40 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/Nginx/nginx-install.md b/docs/Nginx/nginx-install.md index eff9015..188e531 100644 --- a/docs/Nginx/nginx-install.md +++ b/docs/Nginx/nginx-install.md @@ -1,5 +1,5 @@ # 在Ubuntu 16.04中如何从源代码编译Nginx -+ NGINX可用作HTTP / HTTPS服务器,反向代理服务器,邮件代理服务器,负载均衡器,TLS终结器或缓存服务器。它是相当模块化的设计。它具有由社区创建的本机模块和第三方模块。以C编程语言编写,它是一个非常快速和轻便的软件。 +NGINX可用作HTTP/HTTPS服务器,反向代理服务器,邮件代理服务器,负载均衡器,TLS终结器或缓存服务器。它是相当模块化的设计。它具有由社区创建的本机模块和第三方模块。以C编程语言编写,它是一个非常快速和轻便的软件。 ## 从源头构建NGINX的要求,强制性要求: + OpenSSL库版本介于1.0.2 - 1.1.0之间 @@ -21,17 +21,17 @@ + 更新系统:`sudo apt update && sudo apt upgrade -y` ## 从源代码构建NGINX -+ 1、NGINX是用C编写的程序,所以我们需要安装C编译器(GCC)。 ++ NGINX是用C编写的程序,所以我们需要安装C编译器(GCC)。 ```bash sudo apt install build-essential -y ``` -+ 2、下载最新版本的NGINX源代码并解压缩: ++ 下载最新版本的NGINX源代码并解压缩: ```bash wget https://nginx.org/download/nginx-1.13.1.tar.gz && tar zxvf nginx-1.13.1.tar.gz ``` -+ 3、下载NGINX依赖项的源代码并解压缩 ++ 下载NGINX依赖项的源代码并解压缩 > NGINX依赖于3个库:PCRE,zlib和OpenSSL: ```bash @@ -45,21 +45,21 @@ wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz && tar xzvf openssl-1.1.0f.tar.gz ``` -+ 4、删除所有.tar.gz文件。我们不再需要了 ++ 删除所有.tar.gz文件。我们不再需要了 ```bash wget https://nginx.org/download/nginx-1.13.1.tar.gz && tar zxvf nginx-1.13.1.tar.gz ``` -+ 5、转到NGINX源目录:`` ++ 转到NGINX源目录:`` cd ~/nginx-1.13.1 -+ 6、有关帮助,您可以通过运行以下列出可用的配置开关 ++ 有关帮助,您可以通过运行以下列出可用的配置开关 ./configure --help -+ 7、配置,编译和安装NGINX: ++ 配置,编译和安装NGINX: ./configure --prefix=/usr/share/nginx \ --sbin-path=/usr/sbin/nginx \ @@ -116,12 +116,12 @@ make sudo make install -+ 8、从主目录中删除所有下载的文件,在这种情况下/home/username: ++ 从主目录中删除所有下载的文件,在这种情况下/home/username: cd ~ rm -r nginx-1.13.1/ openssl-1.1.0f/ pcre-8.40/ zlib-1.2.11/ -+ 9、检查NGINX版本和编译时间选项: ++ 检查NGINX版本和编译时间选项: sudo nginx -v && sudo nginx -V @@ -133,18 +133,18 @@ # . . . # . . . -+ 10、检查语法和潜在错误: ++ 检查语法和潜在错误: sudo nginx -t # Will throw this error nginx: [emerg] mkdir() "/var/lib/nginx/body" failed (2: No such file or directory) # Just create directory mkdir -p /var/lib/nginx && sudo nginx -t -+ 11、为NGINX创建systemd单元文件: ++ 为NGINX创建systemd单元文件: sudo vim /etc/systemd/system/nginx.service -+ 12、复制/粘贴以下内容: ++ 复制/粘贴以下内容: > 注意:根据NGINX的编译方式,PID文件和NGINX二进制文件的位置可能不同。 [Unit] @@ -164,30 +164,30 @@ [Install] WantedBy=multi-user.target -+ 13、启动并启用NGINX服务: ++ 启动并启用NGINX服务: sudo systemctl start nginx.service && sudo systemctl enable nginx.service -+ 14、检查NGINX是否在重启后启动: ++ 检查NGINX是否在重启后启动: sudo systemctl is-enabled nginx.service # enabled -+ 15、检查NGINX是否正在运行: ++ 检查NGINX是否正在运行: sudo systemctl status nginx.service ps aux | grep nginx curl -I 127.0.0.1 -+ 16、重新启动Ubuntu VPS以验证NGINX是否自动启动: ++ 重新启动Ubuntu VPS以验证NGINX是否自动启动: sudo shutdown -r now -+ 17、创建UFW NGINX应用程序配置文件: ++ 创建UFW NGINX应用程序配置文件: sudo vim /etc/ufw/applications.d/nginx -+ 18、复制/粘贴以下内容: ++ 复制/粘贴以下内容: [Nginx HTTP] title=Web Server (Nginx, HTTP) @@ -204,7 +204,7 @@ description=Small, but very powerful and efficient web server ports=80,443/tcp -+ 19、现在,验证UFW应用配置文件是否被创建和识别: ++ 现在,验证UFW应用配置文件是否被创建和识别: sudo ufw app list # Available applications: From 81465f7f014d5be31554fc7e22c0b8cf1cbf2399 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 11:12:15 +0800 Subject: [PATCH 042/106] update Readme format 001 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d39eebc..f64a3d0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ ![Author](https://img.shields.io/badge/Author-Tinywan-green.svg) [![Conda](https://img.shields.io/conda/pn/conda-forge/python.svg)]() [![GitHub license](https://img.shields.io/github/license/Tinywan/tinywan-react-app.svg)](https://github.com/Tinywan/tinywan-react-app/blob/master/LICENSE) +# [在线文档](http://github.tinywan.com/lua-nginx-redis/) ## 目录 + Nginx 教程 (Nginx tutorial) + [Nginx编译安装](/Nginx/nginx-install.md) From 8833ed788398e5142d9500061c53a64c428dcb2e Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 11:13:39 +0800 Subject: [PATCH 043/106] update docs/pages --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f64a3d0..0a2aa97 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ +# [在线文档](http://github.tinywan.com/lua-nginx-redis/) ![Author](https://img.shields.io/badge/Author-Tinywan-green.svg) [![Conda](https://img.shields.io/conda/pn/conda-forge/python.svg)]() [![GitHub license](https://img.shields.io/github/license/Tinywan/tinywan-react-app.svg)](https://github.com/Tinywan/tinywan-react-app/blob/master/LICENSE) -# [在线文档](http://github.tinywan.com/lua-nginx-redis/) ## 目录 + Nginx 教程 (Nginx tutorial) + [Nginx编译安装](/Nginx/nginx-install.md) From 94d96323663c40b35165065c96e46366495551e4 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 11:17:53 +0800 Subject: [PATCH 044/106] update pages --- docs/index.md | 112 ++++++++++++++++++++++++++------------------------ 1 file changed, 58 insertions(+), 54 deletions(-) diff --git a/docs/index.md b/docs/index.md index ab275e7..cd2e734 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,63 +2,67 @@ [![Conda](https://img.shields.io/conda/pn/conda-forge/python.svg)]() [![GitHub license](https://img.shields.io/github/license/Tinywan/tinywan-react-app.svg)](https://github.com/Tinywan/tinywan-react-app/blob/master/LICENSE) ## 目录 -+ Nginx 教程 (Nginx tutorial) - + [Nginx编译安装](/Nginx/nginx-install.md) - + [Nginx.conf详解和配置](/Nginx/nginx-base-config.md) - + [Nginx基础知识](/Nginx/nginx-basic.md) - + [Nginx高性能WEB服务器详解](/Nginx/nginx-high-basic.md) - + [Nginx高并发系统内核优化和PHP7配置文件优化](/Nginx/nginx-parameter-config.md) - + [Nginx和PHP-FPM启动脚本](/Nginx/nginx-start-script.md) - + 项目案例 (Project notes) - + [Nginx 同一个IP上配置多个HTTPS主机](/Nginx/more-domain-config.md) - + [Nginx 如何配置一个安全的HTTPS网站服务器](http://www.cnblogs.com/tinywan/p/7542629.html) - + [Nginx 配置启用 HTTP/2](http://www.cnblogs.com/tinywan/p/7860774.html) - + 扩展模块 (Third-party module) - + [nginx-vod-module](http://www.cnblogs.com/tinywan/p/7879559.html) - + [nginx-module-vts](http://www.cnblogs.com/tinywan/p/7872366.html) - + [ngx_cache_purge](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-8-proxy_cache.md) - + [lua-nginx-module](http://www.cnblogs.com/tinywan/p/6538006.html) - + [nginx-rtmp-module](http://www.cnblogs.com/tinywan/p/6639360.html) -+ Lua 教程 - + [Lua 基础语法](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Lua-Script/lua-basic.md) - + [luajit 执行文件默认安装路径](#Nginx_base_knowledge) - + [lua中self.__index = self 详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Lua-Script/oop/self__index.md) -+ Redis 教程 - + [Redis 安装](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis/redis-install.md) - + [Redis 配置详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis/redis-config.md) - + [Redis 基础知识](#Redis_base_knowledge) - + [Redis 开发与运维](#Redis-DevOps) - + [Redis执行Lua脚本基本用法](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis/redis-lua.md) -+ Openresty 教程 - + [安装默认配置信息](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-basic.md) - + [ngx_lua APi 方法和常量](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-api.md) - + [ngx_lua 扩展模块学习](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-resty-module.md) - + [lua-resty-upstream-healthcheck使用](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/lua-resty-upstream-healthcheck.md) - + [Openresty与Nginx_RTMP](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-rtmp.md) - + [自己写的一个简单项目lua_project_v0.01](https://github.com/Tinywan/lua_project_v0.01) -+ PHP 教程 - + [PHP脚本](#PHP_base_knowledge) - + [PHP脚本运行Redis](#PHP_Run_Redis) - + [PHP7中php.ini/php-fpm/www.conf的配置,Nginx和PHP-FPM的开机自动启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/PHP/PHP-FPM/config.md) - + [PHP 脚本执行一个Redis 订阅功能,用于监听键过期事件,返回一个回调,API接受改事件](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis-PHP/Php-Run-Redis-psubscribe/nohupRedisNotify.php) -+ Linux 教程 - + [Linux 基础知识](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Linux/linux-basic.md) -+ Shell 教程 - + Shell脚本 - + [编写快速安全Bash脚本的建议](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Shell/write-shell-suggestions.md) - + [shell脚本实现分日志级别记录日志](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_Log.sh) - + [Nginx日志定时备份和删除](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_Nginx_Log_cut.sh) - + [SHELL脚本小技巧](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_script.md) - + [Mysql 自动备份脚本安全加锁机制](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/backup_mysql.sh) -+ 流媒体教程 - + [Nginx配置Rtmp支持Hls的直播和点播功能](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/HLS-live-vod.md) - + [HLS视频直播和点播的Nginx的Location的配置信息(成功)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/HLS-live-vod-locatiuon-config.md) -## Lua-Ngx +#### Nginx 教程 (Nginx tutorial) ++ [Nginx编译安装](/Nginx/nginx-install.md) ++ [Nginx.conf详解和配置](/Nginx/nginx-base-config.md) ++ [Nginx基础知识](/Nginx/nginx-basic.md) ++ [Nginx高性能WEB服务器详解](/Nginx/nginx-high-basic.md) ++ [Nginx高并发系统内核优化和PHP7配置文件优化](/Nginx/nginx-parameter-config.md) ++ [Nginx和PHP-FPM启动脚本](/Nginx/nginx-start-script.md) ++ 项目案例 (Project notes) + + [Nginx 同一个IP上配置多个HTTPS主机](/Nginx/more-domain-config.md) + + [Nginx 如何配置一个安全的HTTPS网站服务器](http://www.cnblogs.com/tinywan/p/7542629.html) + + [Nginx 配置启用 HTTP/2](http://www.cnblogs.com/tinywan/p/7860774.html) ++ 扩展模块 (Third-party module) + + [nginx-vod-module](http://www.cnblogs.com/tinywan/p/7879559.html) + + [nginx-module-vts](http://www.cnblogs.com/tinywan/p/7872366.html) + + [ngx_cache_purge](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-8-proxy_cache.md) + + [lua-nginx-module](http://www.cnblogs.com/tinywan/p/6538006.html) + + [nginx-rtmp-module](http://www.cnblogs.com/tinywan/p/6639360.html) + +#### Lua 教程 ++ [Lua 基础语法](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Lua-Script/lua-basic.md) ++ [luajit 执行文件默认安装路径](#Nginx_base_knowledge) ++ [lua中self.__index = self 详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Lua-Script/oop/self__index.md) + +#### Redis 教程 ++ [Redis 安装](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis/redis-install.md) ++ [Redis 配置详解](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis/redis-config.md) ++ [Redis 基础知识](#Redis_base_knowledge) ++ [Redis 开发与运维](#Redis-DevOps) ++ [Redis执行Lua脚本基本用法](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis/redis-lua.md) + +#### Openresty 教程 ++ [安装默认配置信息](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-basic.md) ++ [ngx_lua APi 方法和常量](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-api.md) ++ [ngx_lua 扩展模块学习](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-resty-module.md) ++ [lua-resty-upstream-healthcheck使用](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/lua-resty-upstream-healthcheck.md) ++ [Openresty与Nginx_RTMP](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Openresty/openresty-rtmp.md) ++ [自己写的一个简单项目lua_project_v0.01](https://github.com/Tinywan/lua_project_v0.01) + +#### PHP7 教程 ++ [PHP脚本](#PHP_base_knowledge) + + [PHP脚本运行Redis](#PHP_Run_Redis) + + [PHP7中php.ini/php-fpm/www.conf的配置,Nginx和PHP-FPM的开机自动启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/PHP/PHP-FPM/config.md) + + [PHP 脚本执行一个Redis 订阅功能,用于监听键过期事件,返回一个回调,API接受改事件](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis-PHP/Php-Run-Redis-psubscribe/nohupRedisNotify.php) +#### Linux 教程 ++ [Linux 基础知识](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Linux/linux-basic.md) +#### Shell 教程 ++ [编写快速安全Bash脚本的建议](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Shell/write-shell-suggestions.md) ++ [shell脚本实现分日志级别记录日志](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_Log.sh) ++ [Nginx日志定时备份和删除](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_Nginx_Log_cut.sh) ++ [SHELL脚本小技巧](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_script.md) ++ [Mysql 自动备份脚本安全加锁机制](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/backup_mysql.sh) +#### 流媒体教程 ++ [Nginx配置Rtmp支持Hls的直播和点播功能](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/HLS-live-vod.md) ++ [HLS视频直播和点播的Nginx的Location的配置信息(成功)](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/HLS-live-vod-locatiuon-config.md) + +#### Lua-Ngx ![Markdown](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/Nginx-Phase.png) -## 随意打赏我 +#### 打赏 |支付宝打赏|微信打赏| |:----:|:----:| -|![image](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/alipay.png)|![image](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Images/wechat.png)| +|![image2](/Images/alipay.png)|![image1](/Images/wechat.png)| From 1673e662d428f2741a16728867e83e76da03476d Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 11:19:48 +0800 Subject: [PATCH 045/106] Online documentation --- README.md | 2 +- docs/index.md | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0a2aa97..65b863a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# [在线文档](http://github.tinywan.com/lua-nginx-redis/) +# [在线文档(Online documentation)](http://github.tinywan.com/lua-nginx-redis/) ![Author](https://img.shields.io/badge/Author-Tinywan-green.svg) [![Conda](https://img.shields.io/conda/pn/conda-forge/python.svg)]() [![GitHub license](https://img.shields.io/github/license/Tinywan/tinywan-react-app.svg)](https://github.com/Tinywan/tinywan-react-app/blob/master/LICENSE) diff --git a/docs/index.md b/docs/index.md index cd2e734..340297c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -42,12 +42,13 @@ + [自己写的一个简单项目lua_project_v0.01](https://github.com/Tinywan/lua_project_v0.01) #### PHP7 教程 -+ [PHP脚本](#PHP_base_knowledge) - + [PHP脚本运行Redis](#PHP_Run_Redis) - + [PHP7中php.ini/php-fpm/www.conf的配置,Nginx和PHP-FPM的开机自动启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/PHP/PHP-FPM/config.md) - + [PHP 脚本执行一个Redis 订阅功能,用于监听键过期事件,返回一个回调,API接受改事件](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis-PHP/Php-Run-Redis-psubscribe/nohupRedisNotify.php) ++ [PHP脚本运行Redis](#PHP_Run_Redis) ++ [PHP7中php.ini/php-fpm/www.conf的配置,Nginx和PHP-FPM的开机自动启动脚本](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/PHP/PHP-FPM/config.md) ++ [PHP 脚本执行一个Redis 订阅功能,用于监听键过期事件,返回一个回调,API接受改事件](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Redis-PHP/Php-Run-Redis-psubscribe/nohupRedisNotify.php) + #### Linux 教程 + [Linux 基础知识](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Linux/linux-basic.md) + #### Shell 教程 + [编写快速安全Bash脚本的建议](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Shell/write-shell-suggestions.md) + [shell脚本实现分日志级别记录日志](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_Log.sh) From 82c8f8e2850aa5f2e49442ae4dd23bcb15ccb118 Mon Sep 17 00:00:00 2001 From: Tinywan <756684177@qq.com> Date: Wed, 6 Dec 2017 11:21:46 +0800 Subject: [PATCH 046/106] Online documentation --- docs/Images/CDN_proxy_LiveNode_URLStream.png | Bin 0 -> 137505 bytes docs/Images/Nginx+Lua+Local_Redis+Mysql.png | Bin 0 -> 23808 bytes docs/Images/Nginx-Phase.png | Bin 0 -> 87779 bytes ...enresty_lua-resty-upstream-healthcheck.png | Bin 0 -> 108122 bytes docs/Images/URI-URL-Image.jpg | Bin 0 -> 20156 bytes docs/Images/alipay.png | Bin 0 -> 30568 bytes docs/Images/github_good1.png | Bin 0 -> 124625 bytes docs/Images/lua.jpg | Bin 0 -> 38401 bytes docs/Images/nginx-hls-locations.png | Bin 0 -> 2313174 bytes docs/Images/nginx_start_script.png | Bin 0 -> 5122 bytes docs/Images/websocket_lua01.png | Bin 0 -> 35896 bytes docs/Images/wechat.png | Bin 0 -> 13943 bytes docs/index.md | 7 ++++--- 13 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 docs/Images/CDN_proxy_LiveNode_URLStream.png create mode 100644 docs/Images/Nginx+Lua+Local_Redis+Mysql.png create mode 100644 docs/Images/Nginx-Phase.png create mode 100644 docs/Images/Openresty_lua-resty-upstream-healthcheck.png create mode 100644 docs/Images/URI-URL-Image.jpg create mode 100644 docs/Images/alipay.png create mode 100644 docs/Images/github_good1.png create mode 100644 docs/Images/lua.jpg create mode 100644 docs/Images/nginx-hls-locations.png create mode 100644 docs/Images/nginx_start_script.png create mode 100644 docs/Images/websocket_lua01.png create mode 100644 docs/Images/wechat.png diff --git a/docs/Images/CDN_proxy_LiveNode_URLStream.png b/docs/Images/CDN_proxy_LiveNode_URLStream.png new file mode 100644 index 0000000000000000000000000000000000000000..243573769d992cc9405d98638c363bf8a6605288 GIT binary patch literal 137505 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Ƃb4$w+Of249pUt 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 literal 0 HcmV?d00001 diff --git a/docs/Images/Nginx+Lua+Local_Redis+Mysql.png b/docs/Images/Nginx+Lua+Local_Redis+Mysql.png new file mode 100644 index 0000000000000000000000000000000000000000..86091244d243fd3402024c86fe7ca51c224f3f46 GIT binary patch literal 23808 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 LkJAeOunGHbUmuAE literal 0 HcmV?d00001 diff --git a/docs/Images/Nginx-Phase.png b/docs/Images/Nginx-Phase.png new file mode 100644 index 0000000000000000000000000000000000000000..a01e312451b72561c579132e52c2653669ee8076 GIT binary patch literal 87779 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∈0tN74kJ_;c^;c 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 literal 0 HcmV?d00001 diff --git a/docs/Images/Openresty_lua-resty-upstream-healthcheck.png b/docs/Images/Openresty_lua-resty-upstream-healthcheck.png new file mode 100644 index 0000000000000000000000000000000000000000..bdee67f1a5e8a4567b9e7783e095e9f528e862b2 GIT binary patch literal 108122 zcmYg%1yEbv+I34QF2$`tvEXiPC>|uirNyDRyR~R>cbDMqP@DqA-Gf_k2v&*~{nPi} z`+omShM9!qoU_k<_IlP@dz~<4MHy@ia*Suso?(M!L8{N5y?{M?hJ=oWg7^gV!nNz! zvp3JcAaV82nMduYpLO<sN!b_?Fsrtcj5t+0ow6&YU8KF^{Zf?q&Y5vf z@e9wnywk+CNj#Vbyt0KalpL`_uTvLZDNO{)>s|9?e2#=H7VBP3jf@ui3_bSEbN|C6 zLnI0c&nF63-zV)u9Yg7S$JbarT>pFBfIjD-{`mJTmmD53?0^5`!s12MRObEn?da=R zRF7wmc{@%oMp3>sQ;|`;RPf^KHfj9hU!uw1-Sg$-t08Ide_m(QG;}4_ofSWn=f5Jp zNf1=>7Q5TjFg|rI=VlHYO`|Ty?0;W1yq6h7gX2N*`uz+Yp^sPmt`Udmi$kQHX;GtO z|2>=`=@b5M!{rST%KrX-Bw?(7KL+%oeGylPvv&BJ{(tA@MVvc-6NYBI#r^LW&En9= zUY1RRXmyEsLjG_3$nQoZ{NNraEz$qq?^zMQpFJaw!Lv&62|O(Mzl-R^=keDrjQ*Ku z|9{7wLQ4~Y|RdFO|QV)L?6Z!8&X%YK-lo&rNE$4Zrl_RrB z!FK{D&@d#Y@{_ltxDWPhq7z|d{y}H_?@dV#$`PQD_oM30B!%w}i0M#E2V+H>CgV9j zlj;3;x)#vW@{ARXu)23>oZtF)jX%eOx=F8>2lVyk{W~1MWT1SYHd!f1^JeAcWvZ(@ ze$4|~N@K1<)cMxnZuIQ?aL01%wrZ7xms`d*TI2saHi3nNwDR5X&COf#@sGKk4Y&cv z-g%YDvc))<0kjf+4ry52%(dNEY~Hp4CKv~9PDgoBO6$b|i_I>ov&>FwddoPbi4f9a z=2?~!V}3s>;{V<9QGYxhf1oygo7+~^Vu`3;SS#-bE-b7bBff}|Y9Wt|R#0#2rPGUT z$UD^tp12lnbCtk`Ssq~^Vrzt>MivqUM;bv$29^a@#nsTf~Rjy zk52Z>EJHfnEtZ`0u5(CJcvKrc-CYqS7=lPkrjUau%ghZRcy9krx&b-r7)BC zIVR2hZf~=K<~9Gd7$^GSNh?l8s}J@^Lh~_eU6}P!K@(YwR9_ihZW!S_vy)weW^pAa z?fh2P2T29~)sz0=fA9A&8-=*SLuLpNwTOLUS&RO$-xL5$){-ZNWmh?Ib}(?ub+;B* z5#;Zx)LMw-wbs_7T$-2lx9^-v|s$+0!fuJ)k1?m&goz9 zyJB+NFxqS2{dOmjEDU?qR4ToMBc(edS4S^yEv=y^L@ukVgtxVgv9>-PVV#|M}LJ-ZaC^}p9oWl zM(-Dp(wordUc?xP2}-FaSZW%`;gWO0#LDBguX()KRLub|APHG&m*T2*H$BAH}O`1y@&~7SDk-FOw-DU69G>t-SuGU ziQjLW;fRXS_C3A}8F*kRQ9vPZ(F>S)JtX5oM|v{z