## Nginx服务可接受的信号 ## 信号|作用 -|- TERM或INT|快速停止Nginx服务 QUIT|平缓停止Nginx服务 HUP|使用新的配置文件启动进程,之后平缓停止原有进程,也就是所谓的“平滑重启” USR1|重新打开日志文件,常用于日志切割 USR2|使用新版本的Nginx文件启动服务,之后平缓停止原有Nginx进程,也就是所谓的”平滑升级” WINCH|平缓停止worker process用于Nginx服务器平滑升级 **使用方法** kill -HUP 进程号 或 kill -HUP $(cat /log/nginx.pid) ![nginx][1] 其他的命令一样 : kill -USR2 7472 [scode type="green"] **信号量在linux中很多软件都适用的像php-fpm** [/scode] ```php cat /etc/php-fpm.conf 看到 pid = /var/run/php-fpm/php-fpm.pid php-fpm 启动: /usr/local/php/sbin/php-fpm php-fpm 关闭: kill -INT cat /var/run/php-fpm/php-fpm.pid php-fpm 重启: kill -USR2 cat /var/run/php-fpm/php-fpm.pid ``` ### USR1 ### **是分割备份日志用的 、具体用法是`mv /logs/access.log ./ access2016.6.log`** `touch eccess.log` 然后用命令:kill -USR1 进程号。 **nginx将会写入新的eccess.log中。linux中写入文件不是靠文件名是靠“节点”,所以在mv 之后 access2016.6.log还会被写入访问信息,直到kill -USR1 进程号 之后才会写入新的eccess.log** ## 日志管理 ## **默认的日志格式:main** ```php log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent $request_body "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ...... ``` - `$remote_addr` IP地址 - `$request` 请求方式 - `$status` 状态号 - `$body_bytes_set` 发送的字节 - `$http_referer` 上一个页面来自哪里 - `$http_user_agent` 用户代理/蜘蛛、被转发的请求原始ip。(浏览器和系统、rboot定义的baidu蜘蛛) - `$http_x_forwarded_for`:在经过代理时,代理把你的本来IP加载此头信息中,传输你的原始ip **可以在不同的虚拟主机引入** ```php server{ access_log logs/host.access.log main; ..... } ``` **也可以像mian一样 在http里面自定义。** ## Shell脚本管理切割日志 ## 代码示例 ```bash #!/bin/bash LOGPATH=/usr/local/nginx/logs/access_www.log BASEPATH=/root/bak_log/$(date -d yesterday +%Y%m) if [ ! -d "$BASEPATH" ]; then mkdir $BASEPATH fi bak=$BASEPATH/$(date -d yesterday +%d)_access_www.log mv $LOGPATH $bak touch $LOGPATH kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` ``` **注意写法:if 中间空格啥的,命令行的 date命令也可以这么用** ![date][2] ### shell下的判断示例 ### ```bash #!/bin/sh myPath="/var/log/httpd/" myFile="/var /log/httpd/access.log" #这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 if [ ! -x "$myPath"]; then mkdir "$myPath" fi #这里的-d 参数判断$myPath是否存在 if [ ! -d "$myPath"]; then mkdir "$myPath" fi #这里的-f参数判断$myFile是否存在 if [ ! -f "$myFile" ]; then touch "$myFile" fi #其他参数还有-n,-n是判断一个变量是否是否有值 if [ ! -n "$myVar" ]; then echo "$myVar is empty" exit 0 fi #两个变量判断是否相等 if [ "$var1" = "$var2" ]; then echo '$var1 eq $var2' else echo '$var1 not eq $var2' fi ``` ## location参数匹配 ## 虚拟主机的配置中,location是把url定位到服务的资源上的、而location也是有语法的 ### location的语法 ### **`location [=|~|~\*|^~] patt{ }`** **中括号可以不写任何参数,此时称为一般匹配、也可以写参数。** 大类型一共可以为分3种 - **`location = patt {}` [精准匹配]** - **`location patt {}` [一般匹配]** - **`location ~ patt {}` [正则匹配]** ### 精准匹配 ### 默认html目录只有index.php **如果已经匹配成功,就停止继续向下搜索、并且立即返回结果** [scode type="red"] ```php location = / { root /var/www/html/; index index.html } location / { root html; index index.php } ``` 上面会出现404 Not Found 这种有意思的事情。 这是因为你打www.solo365.cn的时候会被精准匹配到,因为访问 / 就等于访问 www.solo365.cn/index.html,而这时候精准匹配匹配www.solo365.cn/index.html不是正确的。 到了location /一般匹配这里。结果没有index.html所以出现 Not Found这种事情。 [/scode] ### 正则匹配 ### ```php location / { root /usr/local/nginx/html; index index.html index.htm; } location ~ image { root /var/www/image; index index.html; } ``` [scode type="red"]如果我们访问 http://xx.com/image/logo.png 此时, “/” 与”/image/logo.png” 匹配 同时,”image”正则 与”image/logo.png”也能匹配,正则表达式的成果将会使用. 图片真正会访问 /var/www/image/logo.png 。 如果正则匹配成功将会把一般匹配覆盖。** [/scode] ## add_header ## 设置add_header 允许跨域访问。 **语法:`add_header name value [always];`** **作用域:http,server,location,if in location** Access-Control-Allow-Origin ```php location ~ /static{ add_header Access-Control-Allow-Origin http://www.solo365.cn; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; root /opt/app/code; } ``` ```php ...... 发表评论 取消回复 使用cookie技术保留您的个人信息以便您下次快速评论,继续评论表示您已同意该条款 评论 * 私密评论 名称 * 🎲 邮箱 * 地址 发表评论 提交中...