技术标签: Nginx nginx_upload_module
Nginx用于提供高性能的web服务和反向代理服务,支持Linux和Windows。靖哥哥也是刚开始接触Nginx,这里主要记录一下Nginx环境搭建的爬坑过程。
使用nginx之前,你需要对基本的TCP/IP、HTTP协议、HTML有所了解,对Linux操作也要有一定的认识。当然,既然你搜到了这篇文章(靖哥哥的初wen),相信这些知识对你来讲已经不陌生。
如果你是初次接触Nginx,那么建议先体验其Windows版本,掌握Nginx的基本配置和日志切割功能。
Nginx下载地址:nginx: download
建议选择稳定版,带Windows字样的就是目标文件了。
下载以后是一个.zip的压缩包,解压。
nginx是以多进程的方式来工作的。nginx在启动后,会有一个master进程和多个worker进程。
运行根目录下的nginx.exe,控制台一闪而过,就会拉起nginx的master进程和worker进程。
此时,浏览器下输入localhost,即会进入nginx的index.html页面。
这是因为nginx的配置nginx.conf中默认开启的服务监听了设备的80端口,并且在访问本机80端口时,会返回html目录下的index.html。对于服务搭建,最需要了解清楚的就是nginx.conf,网上查一查资料,很多,讲得也比靖哥哥专业,这里我就不在Ctrl+c Ctrl+v了。
快速关闭Nginx服务,cmd:nginx -s stop
高性能的服务通常都是搭建在Linux环境下,安全性也会更高。但是Linux操作复杂,环境搭建耗时。所以这里直入正题,告诉朋友们要做什么,至于为什么要这么做,终归是环境问题。
其实Linux下仅仅是Nginx的环境搭建的话,并不复杂。我这里主要讲如何手动安装,为后一章的ngx_http_upload_module安装做铺垫。
我使用的是Ubuntu16的CVM,先说Nginx的安装:
Nginx的功能是不同的模块组成,其中部分模块会使用pcre、zlib、OpenSSL等三方库,所以要先安装这些库。
开搞之前,最好先获取root权限:su root,然后更新下apt-get的源:
sudo apt-get update
最后建立一个文件夹/data/youname/,并cd到对应目录下。
第一步:安装PCRE的库,PCRE库支持正则匹配,另外nginx rewrite规则依赖于正则匹配。
PCRE库的地址:https://ftp.pcre.org/pub/pcre/
在线安装:
sudo apt-get install libpcre3 libpcre3-dev
——dev是指develop,libpcre3-dev用于PCRE二次开发,这也是编译Nginx所必须使用的。
第二步:安装zlib库,zlib库用于对HTTP包的数据做gzip格式的压缩以减少数据量,当nginx.conf中配置了gzip on时,必须使用zlib。
Git:https://github.com/madler/zlib
在线安装zlib-devel二次开发所需库
apt-get install zlib1g-dev
第三步:安装Openssl库,安全的SSL协议,也是支持MD5、SHA1等散列函数的库。
下载地址:/source/index.html
在线安装:
apt-get install openssl libssl-dev
第四步:安装Nginx,地址:Index of /download/
直接down最新源码包:
wget http://nginx.org/download/nginx-1.15.9.tar.gz
解压:
tar -zxvf nginx-1.15.9.tar.gz
进入解压后的目录:
cd nginx-1.15.9
运行配置:
./configure --prefix=/usr/local/nginx
编译:make,正常情况下不会有error
安装:make install
启动Nginx,-c 指定配置文件,默认是安装根目录下的nginx.conf
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
至此大功告成,查看一下进程吧:
ps -ef | grep nginx
可以看到仍然是两个进程:
找一台电脑,连接你的CVM公网地址,默认80端口,就可以打开服务下的index.html页面了。
以上就是手动编译安装nginx的过程,那么接下来就看看怎么为nginx添加第三方的文件上传模块。
前面有讲过Nginx的服务由各个模块组成,靖哥哥就讲讲如何为Nginx添加一个nginx_upload_module模块。
nginx_upload_module模块用于接受并处理用户上传的文件,网上有很多该模块的配置方法,我这里只讲为Nginx添加该模块的方法。这里需要提一下,文件上传功能涉及webshell安全问题,其实一般不建议直接使用nginx来上传文件,而是通过后端服务来处理文件上传,nginx只为后端服务做一个简单的代理,后端服务先对访问用户进行鉴权,再将上传文件存放在非web目录。
nginx_upload_module模块最初的版本是十几年前的了,但是目前仍然才2.2版本,不清楚后续是否不在更新了,配置起来也有些麻烦。
Git:https://github.com/fdintino/nginx-upload-module
各个版本的下载地址:http://www.grid.net.ru/nginx/upload.en.html
下载模块:
wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
解压:
tar -zxvf nginx_upload_module-2.2.0.tar.gz
警告:本章节剩余内容将会为你挖坑,如果不想在此继续折腾,请直接下载该模块https://github.com/winshining/nginx-upload-module并跳到下一章继续阅读,感谢开源,你只要知道这个模块填平了打补丁、宏定义、手动创建目录的坑即可。
进入模块目录:
cd nginx_upload_module-2.2.0
下载补丁:davromaniak.txt(网上搜一个,就是这个名,要搜不到,恭喜,省事了,直接跳下一章吧)
打补丁:
patch ngx_http_upload_module.c davromaniak.txt
配置编译依赖库:
我用的是Openssl的库,Nginx1.11.2以后的版本NGX_HAVE_OPENSSL_MD5_H等宏被NGX_OPENSSL宏取代,
因此要将ngx_http_upload_module.c宏定义替换如下(最简单的方法,是注释掉兼容项):
这个时候,如果直接配置make,会报错'ngx_http_request_body_save_filter' follows non-static declaration。原因是1.0以上的Nginx已经声明并实现了ngx_http_request_body_save_filte方法。所以注释掉ngx_http_upload_module.c中的声明和实现就好了。
再次confingure和make就会不有错了。
模块下载完成后,需要在configure中加入模块,并重新编译,如果使用指令./configure --prefix=/usr/local/nginx --add-module=../nginx_upload_module-2.2.0,如果提示OpenSSL library is not used
那么make的时候,会报如下错误:
出现这个错误,是因为没有启用NGX_OPENSSL宏。解决的办法是在编译时启用ngx_http_ssl_module,启用NGX_OPENSSL宏:
./configure --prefix=/usr/local/nginx --add-module=../nginx_upload_module-2.2.0 --with-http_ssl_module
最后就能make成功了,建议详细了解一下nginx编译参数说明。
如果你太衰了,还是编译不过,那么就直接下载Openssl源码,指定编译路径吧。
./configure --prefix=/usr/local/nginx --add-module=../nginx_upload_module-2.2.0 --with-openssl=/usr/local/software/openssl-1.0.2r --with-http_ssl_module
最后重启服务:
cd /usr/local/nginx/sbin/nginx/sbin
./nginx -s reload
经过上面的操作,已经完成了nginx_upload_module模块的添加,然而还没对模块进行测试。
nginx_upload_module模块官网的包中带有一个nginx.conf配置文件,参照这个demo,就可以启用文件上传功能了。
简单的改一改存储路径,注意路径的散列序不能为0就行。
将这个配置文件重命名为nginx_upload.conf加载到nginx的conf目录,或者在conf.d中增加一个server配置,
cd到nginx安装路径的sbin目录下,停止nginx原有服务:
./nginx -s stop
启用新的配置服务:
./nginx -c /usr/local/nginx/conf/nginx_upload.conf
将官网的包中的upload.html加载到html目录,访问该页面:http://ip:port/upload.html即可测试文件上传服务。
需要注意upload.html要添加<!DOCTYPE html>声明,否则通过nginx无法访问这个页面。
操作的日志文件名在nginx_upload.conf的error_log配置中,cd logs/中 tail -f error.log可以实时跟踪日志,查看上传状态。
日志中通常会暴露三个问题:1、找不到对应目录。2、没有权限。3、找不到@test。
对于第1 2个问题,最直接的方法是替换成本文第三章红色字体部分的开源模块,
然后rm -rf掉原来安装的nginx,重新configure && make && make install
搞定1 2,文件就能成功上传了,只不过存储的位置,后缀名什么的需要在问题3来解决,各个业务有自己不同的需求,都是需要写一个后处理的程序。如果是使用php来做后处理,可以参考一下我的下一篇博文,点击传送门
主要介绍了nginx的安装使用,以及打第三方文件上传补丁。最后还是提醒一下,文件上传有风险,一定要鉴权并做好访问控制。
第一步:win+r输入regedit打开注册表第二步:进到这个目录下新建项计算机\HKEY_CLASSES_ROOT\Directory\Background\shell我新建的是everything新建字符串值MUIVerb双击编辑数值现在右键已经可以看到新加的项了但是点击的时候会弹出第三步:在刚刚那个项下面新建项command双击command里的默认修改数值为软件的路径然后就可以右键运行everything了,或者右键按a也可以...
Matplotlib(Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。最流行的python底层绘图库,主要做数据可视化图表)导入库 from matplotlib import pyplot as plt1、plt.plot(x,y) 折线图,两个参数表示的分别是x轴和y轴的数据;后面可以添加一个参数用来表示线条的形状;可以添加一个color参数表示线条的颜色;还可以添加一个linewidth指定线条宽度;alpha设置透明程
Node web 框架 - Koa2 刚刚写了一个简单的 Express 流程的实现,来理解 Express 的原理。 相比 Express,Koa2 更加的简单。 1、Koa2 也是通过 use 添加函数来处理请求,不过是一个异步函数,并且传入的是一个上下文 2、Koa2 在处理请求的时候,首先创建一个当前请求相关的上下文 3、传入的异步函数,所以用 awa...
1、导入依赖<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>{$version}</version> <scope>compile</scope></dependency><dependency> &...
目录1.使用临时文件1.1 使用shell的重定向1.2 freopen标准输出到文件2. 使用匿名管道3. 使用popen4. 小结1.使用临时文件1.1 使用shell的重定向首先想到的方法就是将命令输出重定向到一个临时文件,在我们的应用程序中读取这个临时文件,获得外部命令执行结果,代码如下所示: #define CMD_STR_LEN 10...
FPGA基础入门篇(四)——边沿检测电路一、边沿检测边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测。在检测到所需要的边沿后产生一个高电平的脉冲。这在FPGA电路设计中相当的广泛。没有复位的情况下,正常的工作流程如下:(1)D触发器经过时钟clk的触发,输出trigger信号,保存了t0时刻的信号。(2)同时由trigger通过非门输出信号,保留了当前时刻t1的...
http://bbs.openlab.net.cn/forums/threads/167.aspx定义:#include "/usr/include/sys/socket.h"#include "/usr/includ/sys/if_packet.h"pa
简单举例datetime模块from datetime import timedelta,datetimea = timedelta(days=2, hours=6)b = timedelta(hours=4.5)c=a+bprint(c) # 2 days, 10:30:00print(c.seconds) # 37800print(c.second...
安卓的SharedPreferences类可以很简单的进行XML的本地文件存取工作,本人针对此类进行了相应的封装,代码如下:import android.content.Context;import android.content.ContextWrapper;import android.content.SharedPreferences;import android.util.Log
使用docker-compose去部署项目有如下步骤1.打包好的jar包,dist文件2.每个jar包,dist文件对应的dockerFile文件3.docker-compose.yml文件4.使用docker-compose up命令构建并启动容器下面是详细说明1.①jar包的dockerFile文件,每个命令详细解释在上篇文章中②dist文件的dockerFile文件,每个命令详细解释,以及nginx.conf怎么修改在上上篇文章中2.docker-compose.yml文件,注意
本文转载自:http://hi.baidu.com/wuxiaoming1733/blog/item/6c14aeec4631b03027979111.htmlAndroid开发环境搭建捣鼓了一整天,终于把开发环境给弄好了。 一直想在Linux下面做开发,所以这次特别选择在Ubuntu操作系统下做,试用一天感觉现在Ubuntu已经非常成熟了,基本的日常使用都能够满足,关于U
el-select数据过多页面卡顿—懒加载、下拉框可搜索