-
归档
- 2024 年 11 月
- 2024 年 9 月
- 2024 年 8 月
- 2024 年 7 月
- 2024 年 1 月
- 2023 年 3 月
- 2023 年 2 月
- 2022 年 12 月
- 2022 年 9 月
- 2021 年 12 月
- 2021 年 11 月
- 2021 年 10 月
- 2021 年 2 月
- 2020 年 12 月
- 2019 年 12 月
- 2019 年 8 月
- 2019 年 7 月
- 2018 年 12 月
- 2018 年 10 月
- 2018 年 9 月
- 2018 年 6 月
- 2018 年 4 月
- 2018 年 3 月
- 2017 年 12 月
- 2017 年 11 月
- 2017 年 10 月
- 2017 年 8 月
- 2017 年 7 月
- 2017 年 5 月
- 2017 年 4 月
- 2017 年 3 月
- 2017 年 2 月
- 2017 年 1 月
- 2016 年 12 月
- 2016 年 11 月
- 2016 年 10 月
- 2016 年 9 月
- 2016 年 8 月
- 2016 年 7 月
- 2016 年 5 月
- 2016 年 4 月
- 2016 年 3 月
- 2016 年 2 月
- 2016 年 1 月
- 2015 年 12 月
- 2015 年 11 月
- 2015 年 9 月
- 2015 年 8 月
- 2015 年 6 月
- 2015 年 5 月
- 2015 年 3 月
- 2015 年 2 月
- 2014 年 12 月
- 2014 年 11 月
- 2014 年 10 月
- 2014 年 9 月
- 2014 年 8 月
- 2014 年 7 月
- 2014 年 5 月
- 2014 年 4 月
- 2014 年 3 月
- 2013 年 5 月
- 2013 年 4 月
- 2013 年 3 月
-
功能
用supervisor守护php-fpm主进程来实现php-fpm的自动重启
最近有个针对php-fpm进程的监护需求,也即:如果php-fpm的master进程意外退出(可能是crash,也可能是被误kill),那么希望master进程能被自动拉起,以免中断服务。
我们知道,supervisor是一个非常强大的进程监控(monitor & control)工具,它理论上可以实现php-fpm master进程的守护需求。因此,我试验了如何用supervisor完成这个需求,结果表明,supervisor确实是神器,只需一个合理的配置文件,它就能解决问题。
下面是我的调研过程及最终实现php-fpm主进程守护功能的配置文件,在此做个记录,也希望能帮助到别人。
1. 安装supervisor
supervisor本身是python实现的,而且是调研阶段,故先创建一个新的virtualenv环境,然后用pip安装好supervisor包。
至此,基本的调研环境搭建完毕。当然,php-fpm和PHP环境以及前端的Nginx是早就ready的。
2. 分析php-fpm.sh脚本
通常编译安装PHP后,php-fpm这个2进制的C程序也会被编译并安装好,典型路径在php_install_path/sbin/目录下。该目录下还有个名为php-fpm.sh的脚本用于控制php-fpm进程的start/stop/restart/reload等动作。
./sbin/php-fpm.sh脚本中,”start”操作启动了php-fpm主进程,其余的操作都是通过向php-fpm master进程发signal实现的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
## code segment in php-fpm.sh case "$1" in start) echo -n "Starting php-fpm " ## 下面这行是关键命令 $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 " done" fi ;; |
从上面是终端输入”./sbin/php-fpm.sh start”时,实际执行的代码,可以看到,php-fpm进程的启动参数是–daemonize $php_opts,而$php_opts的值为”–fpm-config $php_fpm_CONF –pid $php_fpm_PID”。
注意: php-fpm.sh启动php-fpm master进程时,传入了daemonize参数,表明php-fpm master process以守护(daemon)方式启动,而根据supervisor文档的说明,当用supervisor监护进程时,被监护进程不能是守护进程,这是由于守护进程通常会在fork完子进程后就让父进程”结束生命”,也即由supervisor创建的父进程退出,此时,supervisor无法再监护已退出进程创建出来的子进程。关于daemon process的行为,可以参考Linux Daemon Writing HOWTO一文来理解。
根据上面的分析,我们知道,只要supervisor启动php-fpm进程时,后者不以daemon方式启动即可。这需要两个动作来完成(假设已cd至PHP安装目录):
1)编辑./etc/php-fpm.conf,设置daemonize = no,默认是yes
2)在supervisor的配置文件中,设置’command’对php-fpm主进程的调起参数时,不传入–daemonize参数。
3. 实现php-fpm主进程守护功能的supervisor配置文件
上面的分析已经告诉我们应该怎么解决问题了,下面直接上验证可用的配置文件。文件位于php-fpm.conf同级目录下(典型路径为php_install_path/etc/)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
[inet_http_server] ; inet (TCP) server disabled by default port=127.0.0.1:9015 ; (ip_address:port specifier, *:port for all iface) [supervisord] logfile=./var/log/supervisord.log ; (main log file;default $CWD/supervisord.log) logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=2 ; (num of main logfile rotation backups;default 10) loglevel=info ; (log level;default info; others: debug,warn,trace) pidfile=./var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) nodaemon=false ; (start in foreground if true;default false) minfds=1024 ; (min. avail startup file descriptors;default 1024) minprocs=200 ; (min. avail process descriptors;default 200) identifier=sup.php-fpm ; (supervisord identifier, default is 'supervisor') [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=http://127.0.0.1:9015 ; use an http:// url to specify an inet socket [program:php-fpm] command=bash -c "sleep 1 && /usr/sbin/php-fpm --fpm-config /etc/php-fpm.conf --pid /var/run/php-fpm/php-fpm.pid" ; the program (relative uses PATH, can take args) process_name=%(program_name)s ; process_name expr (default %(program_name)s) autostart=true ; start at supervisord start (default: true) autorestart=true ; whether/when to restart (default: unexpected) startretries=5 ; max # of serial start failures (default 3) exitcodes=0,2,70 ; 'expected' exit codes for process (default 0,2) stopsignal=QUIT ; signal used to kill process (default TERM) stopwaitsecs=2 ; max num secs to wait b4 SIGKILL (default 10) stdout_logfile=/var/log/php-fpm/supervisord_out.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 stdout_capture_maxbytes=1MB stderr_logfile=/home/www/logs/supervisord_err.log stderr_logfile_maxbytes=1MB stderr_logfile_backups=10 stderr_capture_maxbytes=1MB |
配置文件结构通过查看supervisor文档很容易就能掌握,有两个配置项需要特别注意:
1) command
它指定了supervisor要监控的进程的启动命令,可以看到,这里我们没有给php-fpm传入daemonize参数,其余参数只是展开了php-fpm.sh中的shell变量而已。
大家已经注意到,command也不是直接调起php-fpm,而是通过bash -c执行了两个命令,而第一个命令是sleep 1。这是由于php-fpm在stop后,其占用的端口通常不能立即释放,此时,supervisor以极快的速度试图重新拉起进程时,可能会由于报如下错误而导致几次retry均失败:
1 2 3 |
## var/log/php-fpm.error.log [18-Jul-2015 21:35:28] ERROR: unable to bind listening socket for address '127.0.0.1:9002': Address already in use (98) [18-Jul-2015 21:35:28] ERROR: FPM initialization failed |
而supervisor目前还不支持delay restart功能,因此,这里只能通过先sleep再启动的略显tricky的方法来解决问题,结果表明,疗效不错且无副作用。
2) autorestart
其文档描述如下:
1 |
May be one of false, unexpected, or true. If false, the process will never be autorestarted. If unexpected, the process will be restart when the program exits with an exit code that is not one of the exit codes associated with this process’ configuration (see exitcodes). If true, the process will be unconditionally restarted when it exits, without regard to its exit code. |
其默认值是unexpected,表示若被监护进程的exit code异常时,supervisor才会重新拉起进程。这里设置为true,表明任何时候进程退出均会被再次拉起。
这样配置好后,在本文第1步搭建好的virtualenv环境中,运行如下命令即可完成supervisor对php-fpm master进程的监护:
1 |
shell> supervisord -c etc/sup.php-fpm.conf |
然后,通过ps x | fgrep fpm可以看到,php-fpm主进程已经被拉起了。
然后,kill掉php-fpm主进程,再次ps x | fgrep fpm可以看到,一个新的php-fpm主进程会被supervisor创建出来。
至此,用supervisor守护php-fpm主进程以实现php-fpm的自动重启的需求已经解决了。
参考资料
mac brew 国内源配置
alias vcpkg=”/Users/icezhang/Desktop/vcpkg-master/vcpkg”
alias python=”/usr/local/bin/python3″
alias idf=’. $HOME/esp/esp-idf/export.sh’
一、自动脚本(全部国内地址)(在终端中复制粘贴回车下面脚本)
苹果电脑 常规安装脚本(推荐 完全体 几分钟安装完成):
1 |
/bin/zsh -c <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)</span>"</span> |
苹果电脑 极速安装脚本(精简版 几秒钟安装完成):
1 |
/bin/zsh -c <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)</span>"</span> speed |
苹果电脑 卸载脚本:
1 |
/bin/zsh -c <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/HomebrewUninstall.sh)</span>"</span> |
Linux电脑 安装脚本:
1 |
rm Homebrew.sh ; wget <span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/gitee.com/cunkai</span><span class="hljs-regexp">/HomebrewCN/raw</span><span class="hljs-regexp">/master/</span>Homebrew.sh ; bash Homebrew.sh |
Linux电脑 卸载脚本:
1 |
rm HomebrewUninstall.sh ; wget <span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/gitee.com/cunkai</span><span class="hljs-regexp">/HomebrewCN/raw</span><span class="hljs-regexp">/master/</span>HomebrewUninstall.sh ; bash HomebrewUninstall.sh |
成功的话,如上图所示。
二、常见错误说明:
Mac 10.11系统版本以下的(包括10.11),brew官方已经停止对这类老系统的支持。
1、first run: git -C xxxxxxx 等类似语句。
有可能废纸篓有之前自己删除的brew文件夹,清空一下。
如果还有这种提示,把报错中提供的解决语句(git -C ….)逐句运行一般就可以解决。
2、如果遇到报错中含有errno 54 / 443 / 的问题:
这种一般切换源以后没有问题,因为都是公益服务器,不稳定性很大。
3、检测到你不是最新系统,需要自动升级Ruby后失败的:
1 |
rm -rf /Users/$(whoami)/Library/Caches/Homebrew/ |
1 |
brew -v |
如果还失败运行下面文章的脚本。
金牛肖马:如何升级Mac os自带的Ruby和Gemzhuanlan.zhihu.com
4、如果报错 command not found : brew
先运行下面命令看是否能出来Homebrew的版本号(结果看倒数3句)
1 |
/usr/local/Homebrew/bin/brew -v |
再运行设置临时PATH的代码:
1 |
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin |
1 |
brew -v |
如果能用就是电脑PATH配置问题,重启终端运行echo $PATH打印出来自己分析一下。
5、如果brew -v没有报错 , brew update出错的:
这种不影响使用,尝试再次运行brew update可能赶上服务器不稳定的一瞬间。
6、brew有一个自检程序,如果有问题自检试试:
1 |
<span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span>brew doctor |
提示http://github.com的地址问题不用在意,因为换成国内地址了,所以警告::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::1
7、Error: Running Homebrew as root is extremely dangerous and no longer supported.
As Homebrew does not drop privileges on installation you would be giving all
build scripts full access to your system.
原因是执行过su命令,把账户切换到了root权限,退出root权限即可。
一般关闭终端重新打开即可,或者输入命令exit回车 或者su – 用户名
8、/usr/local/bin/brew: bad interpreter: /bin/bash^M: no such file or directory
1 |
git <span class="hljs-built_in">config</span> <span class="hljs-comment">--global core.autocrlf</span> |
如果显示true那就运行下面这句话可以解决:
1 |
git config --<span class="hljs-keyword">global</span> core.autocrlf <span class="hljs-built_in">input</span> |
运行完成后,需要重新运行安装脚本。
9、from /usr/local/Homebrew/Library/Homebrew/brew.rb:23:in `<main>’
1 |
brew <span class="hljs-keyword">update</span><span class="hljs-operator">-</span>reset |
10、M1芯片电脑运行which brew如果显示/usr/local/Homebrew/bin/brew
解决方法,运行卸载程序把之前的卸载掉或者手动删除/usr/local目录:
1 |
<span class="hljs-built_in">arch</span> -x86_64 /bin/zsh -c <span class="hljs-string">"<span class="hljs-subst">$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/HomebrewUninstall.sh)</span>"</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
icu4c is keg-only, which means it was not symlinked into /usr/local, because macOS provides libicucore.dylib (but nothing else). If you need to have icu4c first in your PATH, run: echo 'export PATH="/usr/local/opt/icu4c/bin:$PATH"' >> ~/.zshrc echo 'export PATH="/usr/local/opt/icu4c/sbin:$PATH"' >> ~/.zshrc For compilers to find icu4c you may need to set: export LDFLAGS="-L/usr/local/opt/icu4c/lib" export CPPFLAGS="-I/usr/local/opt/icu4c/include" |
记录libreoffice实现office转pdf(适用于windows、linux)
由于目前的工作跟office打交道比较多,所以才有了此篇blog,需求是实现word转换pdf方便页面展示。之前lz采用的是jacob(仅支持windows)进行转换的,但是现在服务器改成linux显然不能用了,于是网上搜罗一圈,最终决定采用LibreOffice。(前提:需要安装jdk环境)
LibreOffice中文官网:https://zh-cn.libreoffice.org/ 下载合适的版本,本文下载的是6.1.6
一:windows下实现office转pdf
安装:直接一键默认安装
环境变量:在path前加入libreoffice安装路径(如:D:\Program Files\LibreOffice\program)
进入dos窗口输入soffice 如果弹出libreoffice界面则表示安装成功
java程序实现转换操作(原理通过cmd调用libreoffice指令)
/** * 利用libreOffice将office文档转换成pdf * @param inputFile 目标文件地址 * @param pdfFile 输出文件夹 * @return */ public static boolean convertOffice2PDF(String inputFile, String pdfFile){ long start = System.currentTimeMillis(); String command; boolean flag; String osName = System.getProperty( "os.name" ); if (osName.contains( "Windows" )) { command = "cmd /c start soffice --headless --invisible --convert-to pdf:writer_pdf_Export " + inputFile + " --outdir " + pdfFile; } else { command = "libreoffice --headless --invisible --convert-to pdf:writer_pdf_Export " + inputFile + " --outdir " + pdfFile; } flag = executeLibreOfficeCommand(command); long end = System.currentTimeMillis(); logger.debug( "用时:{} ms" , end - start); return flag; } /** * 执行command指令 * @param command * @return */ public static boolean executeLibreOfficeCommand(String command) { logger.info( "开始进行转化......." ); Process process; // Process可以控制该子进程的执行或获取该子进程的信息 try { logger.debug( "convertOffice2PDF cmd : {}" , command); process = Runtime.getRuntime().exec(command); // exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。 // 下面两个可以获取输入输出流 // InputStream errorStream = process.getErrorStream(); // InputStream inputStream = process.getInputStream(); } catch (IOException e) { logger.error( " convertOffice2PDF {} error" , command, e); return false ; } int exitStatus = 0 ; try { exitStatus = process.waitFor(); // 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值,返回0表示正常结束 // 第二种接受返回值的方法 int i = process.exitValue(); // 接收执行完毕的返回值 logger.debug( "i----" + i); } catch (InterruptedException e) { logger.error( "InterruptedException convertOffice2PDF {}" , command, e); return false ; } if (exitStatus != 0 ) { logger.error( "convertOffice2PDF cmd exitStatus {}" , exitStatus); } else { logger.debug( "convertOffice2PDF cmd exitStatus {}" , exitStatus); } process.destroy(); // 销毁子进程 logger.info( "转化结束......." ); return true ; } |
二:Linux下实现office转pdf
安装:把下载下来的三个安装包上传到linux,采用 tar -xvf xxxxxx.tar.gz解压即可
然后进入RPMS包下,采用yum localinstall *.rpm安装rpm文件
测试是否安装成功:libreoffice6.1 -help
为了使用libreoffice创建别名
[root @VM ]# alias libreoffice= 'libreoffice6.0' [root @VM ]# alias alias cp= 'cp -i' alias egrep= 'egrep --color=auto' alias fgrep= 'fgrep --color=auto' alias grep= 'grep --color=auto' alias l.= 'ls -d .* --color=auto' alias libreoffice= 'libreoffice6.0' alias ll= 'ls -l --color=auto' alias ls= 'ls --color=auto' |
linux下面命令行测试word转pdf(其参数与windows下的参数大体相同)
命令:libreoffice –convert-to pdf:writer_pdf_Export /usr/lib/files/白头拟稿纸.doc –outdir /usr/lib/files/
关于word转pdf中文乱码问题处理
1:查看fonts目录:cat /etc/fonts/fonts.conf | grep fon
得知字体存放位置:/usr/share/fonts
2: 把Windows下的字体C:\Windows\Fonts下的宋体,即simsun.ttc上传到linux服务器
在fonts下新建Fonts文件 把字体上传到该路径下即可
作者: 不二尘
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
CentOS安装LibreOffice
安装LibreOffice
卸载原有
1 |
yum remove libreoffice-*</code>1 |
下载libreoffice
1 |
yum install -y libreoffice |
安装依赖
1 2 3 |
yum install cairo cups-libs libSM yum install ibus yum install libreoffice-headless |
查看 help
1 |
libreoffice -h |
查看版本
1 2 3 |
libreoffice --version 或者 soffice --version |
转化命令
1 2 3 4 5 |
soffice --headless --convert-to pdf:writer_pdf_Export /1.doc(输入源文件路径) --outdir /(输出路径) soffice --headless --convert-to pdf:writer_pdf_Export /1.doc /(输出路径) 或者 libreoffice --headless --convert-to pdf:writer_pdf_Export /1.doc(输入源文件路径) --outdir /(输出路径) libreoffice --headless --convert-to pdf:writer_pdf_Export /1.doc /(输出路径) |
执行命令后长时间无反应
1 2 |
top 查看进程 kill -9 soffice.bin的PID |
中文转化不理想或者乱码
下载字体链接
Fonts 下载
1 2 3 4 5 6 7 8 9 10 |
拷贝C:\\windows\\Fonts文件夹到linux中/usr/share/fonts mkdir chinese 拷贝 cp Fonts /usr/share/fonts/chinese 修改权限 chmod -R 755 /usr/share/fonts/chinese 汉化 fc-cache -fv 查看安装结果 fc-list | grep chinese |
报错 subprocess.SubprocessError: failed: 0x4c0c
1 |
大概率是你的文件路径或者输出路径错误 |
CentOS7 安装ffmpeg
1、安装EPEL Release
因为安装需要使用其他的repo源,所以需要EPEL支持:
yum install -y epel-release
#如果出现缺少Code提示,可以:
sudo rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
#安装完成之后,可以查看是否安装成功
yum repolist
安装Nux-Dextop源
#导入一个Code
sudo rpm –import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
#安装nux-dextop 源
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
#查看repo源是否安装成功
yum repolist
yum安装ffmpeg:
yum install -y ffmpeg
2、安装完成后检查ffmpeg 版本:
ffmpeg -version
3、如果你想了解更多关于FFmpeg使用方面的资料,可以输入:
ffmpeg -h
4、例子:
使用FFmpeg将mp3转为ogg
ffmpeg -i MLKDream_64kb.mp3 -c:a libvorbis -q:a 4 MLKDream_64kb.ogg
使用FFmpeg将flv转为mp4
ffmpeg -i beeen.flv -y -vcodec copy -acodec copy beeen.mp4
ts格式视频缓存批量下载合并方法
批量下载
1 |
curl -O https://cdn-video.xxxx.com/flim/404228df74[00001-01200].ts |
- 其中中括号[00001-01200]表示连续的数字,因为资源具有序号特点。
批量合并
1 |
copy /b D:\f\*.ts D:\new.ts |
- 路径下所有的.ts文件合并成new.ts
以上代码用txt记事本新建,并修改后缀名为.bat,运行即可实现批量下载和合并
Windows下安装Cisco VPN Client终极解决方法
本文是针对win10下安装Cisco VPN Client出现的问题,编写的全程教程,同时也适用于windows的其它版本,可作为参考,本文以64位安装为例,安装文件如图所示。
这两个文件在WIN10中安装会出错,我直接把解压包放在本文的附件中:
我的系统是win10x64,对应安装文件为64位的,打开之后如图:
我们选择msi文件,打开安装。
但是多半会出现下面的错误:
这时候,网上流传的各种修改注册表的方法不顶用,因为Win10的注册表不同于他们提到的Win7、Win8的传统型,
现在就需要补丁了。
补丁文件也在附件中。
安装了对应版本的补丁,再打开下图中所示的msi文件(注意不是exe,是msi),就可以顺利安装完,进行使用了。
但是,还会有一个小问题,在配置好VPN进行连接的时候出现了“vpn 422 failed to enable virtual adapter”的错误.
这是因为这个安装文件是针对于WindowsXP等低版本的,所以注册表上还需要一点点修改:
进入注册表regedit
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CVirtA找到DisplayName,
x86系统的将值”@oem16.inf,%CVirtA_Desc%;Cisco Systems VPN Adapter”
更改为”Cisco Systems VPN Adapter”;
x64系统的将值 “@oem16.inf,%CVirtA_Desc%;Cisco Systems VPN Adapter for 64-bit Windows”
更改为”Cisco Systems VPN Adapter for 64-bit Windows”;
再次尝试连接,问题解决了。
Nginx Location指令配置及常用全局变量
Nginx Location 指令基础
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
Nginx 中的 Location 指令 是NginxHttpCoreModule中重要指令。Location 指令比较简单,但却是配置 Nginx 过程中不得不去了解的。 Location 指令,是用来为匹配的 URI 进行配置,URI 即语法中的”/uri/”,可以是字符串或正则表达式。但如果要使用正则表达式,则必须指定前缀。 一、基本语法 location [=|~|~*|^~|@] /uri/ { … } 〖=〗 表示精确匹配,如果找到,立即停止搜索并立即处理此请求。 〖~ 〗 表示区分大小写匹配 〖~*〗 表示不区分大小写匹配 〖^~ 〗 表示只匹配字符串,不查询正则表达式。 〖@〗 指定一个命名的location,一般只用于内部重定向请求。 二、匹配过程 首先对字符串进行匹配查询,最确切的匹配将被使用。然后,正则表达式的匹配查询开始,匹配第一个结果后会停止搜索,如果没有找到正则表达式,将使用字符串的搜索结果,如果字符串和正则都匹配,那么正则优先级较高。 三、配置实例 location = / { # 只匹配对 / 目录的查询. [ config A ] } location / { # 匹配以 / 开始的查询,即所有查询都匹配。 [ config B ] } location ^~ /images/ { # 匹配以 /images/ 开始的查询,不再检查正则表达式。 [ config C ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配以gif, jpg, or jpeg结尾的文件,但优先级低于config C。 [ config D ] } 四、全局变量 $args #这个变量等于请求行中的参数。 $content_length #请求头中的Content-length字段。 $content_type #请求头中的Content-Type字段。 $document_root #当前请求在root指令中指定的值。 $host #请求主机头字段,否则为服务器名称。 $http_user_agent #客户端agent信息 $http_cookie #客户端cookie信息 $limit_rate #这个变量可以限制连接速率。 $request_body_file #客户端请求主体信息的临时文件名。 $request_method #客户端请求的动作,通常为GET或POST。 $remote_addr #客户端的IP地址。 $remote_port #客户端的端口。 $remote_user #已经经过Auth Basic Module验证的用户名。 $request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。 $query_string #与$args相同。 $scheme #HTTP方法(如http,https)。 $server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 $server_addr #服务器地址,在完成一次系统调用后可以确定这个值。 $server_name #服务器名称。 $server_port #请求到达服务器的端口号。 $request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。 $uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 $document_uri #与$uri相同。 附录1 $request_uri和$uri区别 $request_uri This variable is equal to the *original* request URI as received from the client including the args. It cannot be modified. Look at $uri for the post-rewrite/altered URI. Does not include host name. Example: “/foo/bar.php?arg=baz” 这个变量等于从客户端发送来的原生请求URI,包括参数。它不可以进行修改。$uri变量反映的是重写后/改变的URI。不包括主机名。例如:”/foo/bar.php?arg=baz” $uri This variable is the current request URI, without any arguments (see $args for those). This variable will reflect any modifications done so far by internal redirects or the index module. Note this may be different from $request_uri, as $request_uri is what was originally sent by the browser before any such modifications. Does not include the protocol or host name. Example: /foo/bar.html 这个变量指当前的请求URI,不包括任何参数(见$args)。这个变量反映任何内部重定向或index模块所做的修改。注意,这和$request_uri不同,因$request_uri是浏览器发起的不做任何修改的原生URI。不包括协议及主机名。例如:”/foo/bar.html” $document_uri The same as $uri. 同$uri. 附录2 #允许客户端请求的最大的单个文件字节数 client_max_body_size 10m; #缓冲区代理缓冲用户端请求的最大字节数 可以理解为先保存到本地再传给用户 client_body_buffer_size 128k; #跟后端服务器连接的超时时间_发起握手等候响应超时时间 proxy_connect_timeout 600; #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队等候处理 proxy_read_timeout 600; #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据 proxy_send_timeout 600; #代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可 proxy_buffer_size 8k; #同上 告诉Nginx保存单个用的几个Buffer 最大用多大空间 proxy_buffers 4 32k; #如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2 proxy_busy_buffers_size 64k; #proxy缓存临时文件的大小 proxy_temp_file_write_size 64k; |
Nginx目录访问
Nginx默认是不允许列出整个目录的。如需此功能,
打开nginx.conf文件,在location server 或 http段中加入
autoindex on;
另外两个参数最好也加上去:
autoindex_exact_size off;
默认为on,显示出文件的确切大小,单位是bytes。
改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。
改为on后,显示的文件时间为文件的服务器时间
1 2 3 4 |
location /images { root /var/www/nginx-default/ibugaocn; autoindex on; } |
隐藏nginx版本信息
server_tokens off;
Windows 下开启FTP服务并创建FTP用户
一、创建用于登入 FTP 的用户。
- 打开计算机管理程序,依次点击左侧本地用户组–>用户,右侧空白处右击点击“新用户”。
- 填写用于登入FTP服务器的新用户信息,如下图所示
- 点击创建完成新用户创建,在新弹出的窗口中点关闭,到此新用户创建完成
二、开启 FTP 服务
- 控制面板中找到程序和功能,在左侧的菜单点击“打开或关闭Windows功能”,在弹窗的窗口中勾选FTP服务、FTP扩展性、IIS管理控制台,只需要勾选途中框起来的3个即可,确定后等待几分钟即可完成,部分设备可能需要重新启动计算机。
三、允许FTP服务通过防火墙(如果你的防火墙已经关闭,无视这一步)
四、创建 FTP 服务
- win + R 运行 InetMgr 打开 Internet 信息服务(IIS)管理器,在左侧的 空白区域右击选择“添加FTP站点…”。
- 录入站点名称,和需要映射FTP服务的文件路径。
- IP地址默认全部未分配即可,端口号默认21,SSL这里选无。
- 因为我要求FTP服务只能通过新建的用户登入,所以身份验证选基本,授权这里指定刚刚创建的用户。
做完以上这些,整个FTP服务就算搭建完成了。
五、验证及排错
- 打开文件浏览器,在地址栏输入 ftp:// 你的 ip 地址。
- 在弹出的窗口中输入创建的用户和密码,点击登录,成功后就可以看到你的 FTP 服务里的文件了。
- 如果出现无法登陆的问题,首先检查你的用户密码是否正确,也有可能是文件权限的问题,文件权限可以按照以下步骤进行处理。
3.1.1 找到 FTP 文件路径,右击属性,添加 FTP 用户的权限
- 如果出现外部不能访问的问题,在不关闭防火墙的环境下可以用以下方式解决。
4.1.1 控制面板–>Windows防火墙–>允许程序或功能通过Windows防火墙–>新窗口中允许运行另一程序”。在浏览中找到“C:\Windows\System32\svchost.exe”,打开并添加。。
4.1.2 此时多了一个多出一项“Windows服务主进程”,勾选后面的两个复选框,完成后确认。