用Nginx 修改头信息,让AJAX跨域正常请求

AJAX从一个域请求另一个域的地址会有跨域的问题,需要在nginx的配置上添加add_header 如下:

第一条add_header:授权从a.com的请求

第二条add_header:当该标志为真时,响应于该请求是否可以被暴露

第三条add_header:指定请求的方法,可以是GET,POST,PUT,DELETE,HEAD

如果想允许来自任何域的请求,可以这样:

如果想配置2-3个域设置为信任,可以这样:

 

发表在 应用工具软件 | 标签为 , , | 留下评论

composer.json 中的各个属性字段详解

1、name

包的名字。由供应方(vendor)名和项目名组成,用 / 分隔。

在发布包的时候需要填。

2、description

对包的一个简短描述,通常是一行的长度。

在发布包的时候需要填。

3、version

包的版本。

格式必须是 X.Y.Z,选择性后缀:-dev、-alphaN、-betaN、-RCN。

4、type

包的类型,默认为 library。

包类型用于定制安装逻辑。如果你的包的安装需要一些特殊的逻辑,你可以定义一个定制的类型。它可以是一个 symfony-bundle 的类型,或者 wordpress-plugin,或者 typo3-module。这些类型将被特定的项目所用,它们将提供安装器来安装这些类型的包。

Composer 支持 3 种类型:

library:默认值。它将复制文件到 vendor 目录。

project:它表示这是个项目,而不是库。比如像 Symfony 标准版这种应用。

metapackage:一个含有依赖的空包,能触发安装,但不包含文件,不会向文件系统写任何东西。

composer-install:为其他的定制类型的包提供安装器的包。

5、keywords

一个与包相关的关键词数组。用于包的搜索和过滤。

可选。

6、homepage

项目的网站 URL。

可选。

7、time

版本发布时间。必须是 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS 格式。

可选。

8、license

包的许可证。可以是字符串或字符串数组。

可选,但强烈建议加上。

9、authors

包的作者。是个对象数组。

每个 author 对象有这些属性:

name:作者名字
email:作者邮箱
homepage:作者网站 URL
role:作者在项目中的角色(如:developer 或 translator)

10、support

各种关于该项目如何获取支持的信息。包含这些属性:

email:获取支持的邮箱
issues:问题跟踪的 URL
forum:论坛的 URL
wiki:Wiki 的 URL
irc:IRC 的频道
source:查看或下载源码的 URL

可选。

11、Package links

依赖包的映射表,由包名映射版本约束。如:

(1)require

列出包所依赖的包。除非这些依赖已经存在,否则这个包不会被安装。

(2)require-dev(root-only)

列出开发这个包(或跑测试等等)所依赖的包。在使用 install 命令时,只有带上 “–dev” 参数才能安装 dev 包。在使用 update 命令时,带上 “–no-dev” 则不更新。

(3)conflict

列出包会和哪些包发生冲突。它们将不被允许和你的包一起安装。如果约束了版本,则只会针对特定的版本。

(4)replace

列出哪些包要被这个包替代。

(5)provide

这个包所推荐的包列表。这个对公共接口最有用,一个包可以依赖一个虚拟的 logger 包,而实现 logger 接口的库可以放到 provide 字段中。

12、suggest

建议一些能让这个包工作的更好或得到增强的包列表。这些信息只在包安装完成时给出,暗示用户可以添加更多包,虽然不是必须要安装的。

格式是,包名映射文字说明,如:

13、autoload

提供给 PHP autoloader 的自动加载映射。

目前支持的有:PSR-0 自动加载规范,classmap 生成器,还有 files。

PSR-0 是比较推荐的,因为它的优秀的扩展性(在添加新的类的适合,不需要重新生成自动加载器)。

(1)PSR-0

在 psr-0 键名下,定义一个命名空间到路径的映射表,相对于包的根目录。注意,这也同样支持 PEAR-style 的没有命名空间的风格。

请注意命名空间的声明得以 \\ 结尾,确保自动加载器正确响应。

PSR-0 的引用可以在安装或更新时生成的文件中查看:
vendor/composer/autoload_namespaces.php

例子:

如果你需要在多个目录里查找同一个前缀的命名空间,你可以用数组,如:

PSR-0 风格并不局限于加载命名空间的声明的东西,也可以用于类这个层级。当库中只有一个在全局命名空间中的类时,这种方式就能用上。比如你有个 PHP 源文件放在项目的根目录,你可以这样声明:

如果你有个目录下全是用命名空间组织的,你可以用空前缀:

(2)Classmap

classmap 的引用可以在安装或更新时生成的文件中查看:
vendor/composer/autoload_classmap.php

类映射表是通过扫描指定的目录或文件下的所有的 .php 和 .inc 文件生成的。

你可以给任何不支持 PSR-0 的库用 classmap 生成器实现自动加载。配置上只要指定类所在的目录或文件即可:

(3)files

如果你确定需要在任何请求中都加载某些文件,你可以使用 files 自动加载机制。对于那些包中有些 PHP 函数但不能自动加载时特别有用。例如:

14、include-path

(将被弃用,它的功能由 autoload 代替。其实就是设置 include_path,可选)

15、target-dir

指定安装目标路径。

如果包的根目录是在命名空间下,自动加载就不正确了,所以才有 target-dir 来解决这个问题。

Symfony 就是个例子。它由很多组件包组成。Yaml 组件是在

命名空间下的,它的根目录是 Yaml 目录。要让自动加载正常工作,我们要确保它不是安装在

,而是在

,这样自动加载器才能从 vendor/symfony/yaml 加载它。
所以要定义 target-dir 如下:

16、minimum-stability(root-only)

定义根据稳定性如何过滤包。默认是 stable,如果你信赖一个 dev 包,你需要指明。

17、prefer-stable(root-only)

如果开启,Composer 会在稳定包和不稳定包中选择前者。

18、repositories(root-only)

定制包的仓库地址。

默认的,Composer 只使用 Packagist 仓库。通过指定仓库地址,你可以从任何地方获取包。

仓库不能递归。你只能将它们添加到主的 composer.json 中。所依赖包中 composer.json 文件中的仓库定义是被忽略的。

支持的仓库的类型有:

(1)composer

composer 仓库通过网络提供 packages.json 文件,它包含一个 composer.json 对象的列表,还有额外的 dist 或 source 信息。packages.json 文件通过 PHP 流加载。

(2)vcs

版本控制系统仓库,如:git、svn、hg。

(3)pear

通过它,你可以导入任何 pear 仓库到你的项目中。

(4)package

如果你依赖一个不支持 composer 的项目,你可以定义一个 package 类型的仓库,然后将 composer.json 对象直接写入。

完整的例子:

19、config(root-only)

针对项目的一些配置。

process-timeout:默认 300 秒,Composer 进程执行超时时间;
use-include-path:默认 false,如果是 true,Composer 自动加载器也会到 PHP 的 include_path 中查找;
preferred-install:默认 auto,设置 Composer 安装方式;
github-protocols:默认 [“git”, “https”],设置与 github 通信协议;
github-oauth:设置 oauth;
vendor-dir:默认 vendor,你可以换成别的;
bin-dir:默认 vendor/bin,如果项目有二进制文件,会链接到这;
cache-dir:默认 $home/cache,存放 Composer 运行时产生的缓存;
cache-files-dir:默认 $cache-dir/files,存放包的 zip 文件;
cache-repo-dir:默认 $cache-dir/repo,存放仓库元数据;
cache-vcs-dir:默认 $cache-dir/vcs,存放 vcs 克隆;
cache-files-ttl:默认六个月,缓存的过期时间;
cache-files-maxsize:默认 300M;
notify-no-install:默认 true,从仓库安装包会有个通知,可以关掉;
discard-changes:默认false,如何处理脏的更新;

20、scripts(root-only)

Composer 允许你在安装进程中安装钩子脚本,钩子是基于事件的;

21、extra

供 scripts 消费的额外数据;

22、bin

指定哪些文件必须被当做二进制文件处理的;

23、archive

设置创建包时的选项,exclude 属性可以设置排除哪些目录,例如:

 

发表在 BS架构后台语言, 应用工具软件 | 标签为 | 留下评论

nginx配置请求直接返回json数据

对于有些服务端接口返回是固定值的json,可通过配置nginx直接返回json,减少程序的加载对资源的占用,减少接口响应时间

记得加default_type application/json ,不然浏览器打开时,是个文件。

发表在 Web前台开发技术, 操作系统相关 | 标签为 , | 留下评论

node.js应用后台守护进程管理器Forever安装和使用实例

我们不可能直接通过node命令来管理远程站点,这样无法保证网站的可持续运行。我们用Forever来解决这个问题,它可以将NodeJS应用以后台守护进程的方式运行,我们还可以将NodeJS应用设成随系统启动而自动运行。

首先,安装Forever:

这样Forever就安装好了,我们可以直接运行Forever命令:

上面命令先查看Forever帮助文件,然后运行app.js,然后停止app.js。我们要让Forever自动运行,先在/etc/init.d目录创建一个文件node,内容如下:

以上代码是我在本地虚拟机的配置,根据实际情况修改相关参数,主要是DEAMON的路径参数,赋予该文件可执行权限,并运行chkconfig添加自动运行:

reboot重启系统,通过浏览器进入网站可发现,该NodeJS已经可自动运行了,剩下的工作,就是好好研究NodeJS、Express和AngularJS,做一个真正属于自己的应用!

 

发表在 Web前台开发技术 | 标签为 , | 留下评论

在Centor 6.x 系统中安装nodejs

按照官网的提示下载Source Code源码包在服务器上进行编译安装时提示

明显g++版本太低,怎么办呢,要重新编译GCC的话得很长时间,而且不一定能成功。

所以可以采用下载编译后的包来解压安装。

步骤如下:

1、到官网下载自己所需要的编译后的压缩包

地址:https://nodejs.org/dist/

931050-20160418185136476-2912926781

像上图中红色框里面的就是已经编译好的文件,选择好对应的linux版本下载即可,简单说就是解压后,在bin文件夹中已经存在node以及npm,如果你进入到对应文件的中执行命令行一点问题都没有,不过不是全局的,所以通过建立软链接的方式将这个设置为全局就好了。

OK,搞定

发表在 应用工具软件, 操作系统相关 | 标签为 , | 留下评论

supervisor配置详解

先说说supervisor是干什么的吧?

supervisor这东西,其实就是用来管理进程的。咱们为什么要用supervisor呢?因为,相对于我们linux传统的进程管理方式来说,它有很多的优势,要不然咱们也不会闲着没事去用supervisor了。

OK,下面来看看supervisor有哪些好处吧。

  1. 简单

    为啥简单呢?因为咱们通常管理linux进程的时候,一般来说都需要自己编写一个能够实现进程start/stop/restart/reload功能的脚本,然后丢到/etc/init.d/下面。这么做有很多不好的地方,第一我们要编写这个脚本,这就很耗时耗力了。第二,当这个进程挂掉的时候,linux不会自动重启它的,想要自动重启的话,我们还要自己写一个监控重启脚本。而,supervisor则可以完美的解决这些问题。好,怎么解决的呢,其实supervisor管理进程,就是通过fork/exec的方式把这些被管理的进程,当作supervisor的子进程来启动。这样的话,我们只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去就OK了。这样就省下了我们如同linux管理进程的时候,自己写控制脚本的麻烦了。第二,被管理进程作为supervisor的子进程,当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,所以当然也就可以对挂掉的子进程进行自动重启了,当然重启还是不重启,也要看你的配置文件里面有木有设置autostart=true了,这是后话。

  2. 精确

    为啥说精确呢?因为linux对进程状态的反馈,有时候不太准确。为啥不准确?这个楼主也不知道啊,官方文档是这么说的,知道的告诉楼主一下吧,感激不尽。而supervisor监控子进程,得到的子进程状态无疑是准确的。

  3. 进程组

    supervisor可以对进程组统一管理,也就是说咱们可以把需要管理的进程写到一个组里面,然后我们把这个组作为一个对象进行管理,如启动,停止,重启等等操作。而linux系统则是没有这种功能的,我们想要停止一个进程,只能一个一个的去停止,要么就自己写个脚本去批量停止。

  4. 集中式管理

    supervisor管理的进程,进程组信息,全部都写在一个ini格式的文件里就OK了。而且,我们管理supervisor的时候的可以在本地进行管理,也可以远程管理,而且supervisor提供了一个web界面,我们可以在web界面上监控,管理进程。 当然了,本地,远程和web管理的时候,需要调用supervisor的xml_rpc接口,这个也是后话。

  5. 有效性

    当supervisor的子进程挂掉的时候,操作系统会直接给supervisor发信号。而其他的一些类似supervisor的工具,则是通过进程的pid文件,来发送信号的,然后定期轮询来重启失败的进程。显然supervisor更加高效。。。至于是哪些类似supervisor工具,这个楼主就不太清楚了,楼主还听说过god,director,但是没用过。有兴趣的朋友可以玩玩

  6. 可扩展性

    supervisor是个开源软件,牛逼点的,可以直接去改软件。不过咱们大多数人还是老老实实研究supervisot提供的接口吧,supervisor主要提供了两个可扩展的功能。一个是event机制,这个就是楼主这两天干的活要用到的东西。再一个是xml_rpc,supervisor的web管理端和远程调用的时候,就要用到它了。

  7. 权限

    大伙都知道linux的进程,特别是侦听在1024端口之下的进程,一般用户大多数情况下,是不能对其进行控制的。想要控制的话,必须要有root权限。而supervisor提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程了。

    不过这功能,用不用就看大伙自己的环境了

  8. 还有一些什么兼容性,稳定性,感觉用处不大,就不扯了。

安装方法请移步至:https://blog.zzstudio.net/system/article_1061.html

启动

以下启动顺序由上到下优先级,依次递减

supervisor组件

  1. supervisord

    supervisord是supervisor的服务端程序。

    干的活:启动supervisor程序自身,启动supervisor管理的子进程,响应来自clients的请求,重启闪退或异常退出的子进程,把子进程的stderr或stdout记录到日志文件中,生成和处理Event

  2. supervisorctl

    这东西还是有点用的,如果说supervisord是supervisor的服务端程序,那么supervisorctl就是client端程序了。supervisorctl有一个类型shell的命令行界面,我们可以利用它来查看子进程状态,启动/停止/重启子进程,获取running子进程的列表等等。。。最牛逼的一点是,supervisorctl不仅可以连接到本机上的supervisord,还可以连接到远程的supervisord,当然在本机上面是通过UNIX socket连接的,远程是通过TCP socket连接的。supervisorctl和supervisord之间的通信,是通过xml_rpc完成的。    相应的配置在[supervisorctl]块里面

  3. Web Server

    Web Server主要可以在界面上管理进程,Web Server其实是通过XML_RPC来实现的,可以向supervisor请求数据,也可以控制supervisor及子进程。配置在[inet_http_server]块里面

  4. XML_RPC接口

    这个就是远程调用的,上面的supervisorctl和Web Server就是它弄的

配置文件详解

 

发表在 应用工具软件, 操作系统相关 | 标签为 | 留下评论

supervisor应用初体验

最近在使用thinkphp5开发时使用了他们提供的队列服务,在文档结尾处看到了supervisor。所以自己布署了一把,把步骤共享出来。

1.安装

宿主机环境:(Centos7)

1475112637-9554-35360-3d52bb0de044d78d

宿主机环境

1475112637-7554-35360-e10c50020df81643

1475112637-2679-35360-3efd1976de43fa03


近期发现python官网好像被墙了,自动安装不成功。

以下提供源码包安装方法:

1、先安装meld3

meld3-1-0-2-tar 可以下载离线包或通过wget下载安装

2、安装supervisor-3.3.1

supervisor-3-3-1-tar

测试安装是否成功:

1475112637-7654-35360-0fa69d64c0541fd4

2.创建配置文件

创建supervisor配置文件目录/etc/supervisor/

1475112637-1600-35360-a35442b3b3322d2f

创建主配文件supervisord.conf

1475112637-2128-35360-57b2b291869440b7

创建项目配置文件目录

1475112638-4826-35360-bdf1528dab7d0811

3.调试

在/home/k1ic/supervisor_simple 目录下创建test.c

1475112639-7075-35360-02ba4cf694e9a6f0

test.c

编译为test #gcc -o test test.c

1475112638-3628-35360-cf151a9c4551a838

gcc -o test test.c

在/etc/supervisor/conf.d 目录下创建 test.ini

1475112639-6758-35360-941fcf9c291e0caf

test.ini

在主配文档中引入test.ini

1475112639-6745-35360-7a827afc1b0a1460

files = ./conf.d/*.ini

启动supervisor

1475112639-5142-35360-69e6e917e6739846

1475112639-7665-35360-b03469800dce2f08

查看supervisord.log发现program test已启动

1475112639-8720-35360-5078fcc82a70ca05

用 supervisorctl 查看已经被监控的program(注:直接用 #supervisorctl 会提示:http://localhost:9001 refused connection

1475112640-9820-35360-56c63f5d75495aa4

增加一例监控php脚本

创建skud.ini

1475112640-4767-35360-a3dbfb53f038b47e

skud.ini

1475112640-1884-35360-727cca0530107c8d

[program:skuld]

在/home/k1ic/supervisor_simple目录下创建skuld.php

1475112640-9043-35360-6b747b9cd5bf02e2

skuld.php

重启监控服务

1475112641-9957-35360-e97398ee02681218

reload

1475112641-5074-35360-c8322a7f66809846

pstree

================分割线================

这才是重点^^

0. supervisor 比较适合监控业务应用,且只能监控前台程序,php fork方式实现的daemon不能用它监控,否则supervisor> status 会提示:BACKOFF Exited too quickly (process log may have details)

1475112641-9104-35360-e05f53999df42586

BACKOFF Exited too quickly (process log may have details)

1475112641-2249-35360-dd9a1b44b39d19e5

cat supervisord.log

1.每次修改配置文件后需进入supervisorctl,执行reload, 改动部分才能生效

1475112641-9173-35360-8aaf0b1f7e40807b

reload

2.两个命令

supervisord : supervisor的服务器端部分,用于supervisor启动

supervisorctl:启动supervisor的命令行窗口,在该命令行中可执行start、stop、status、reload等操作。

3.web管理界面

将supervisord.conf中[inet_http_server]部分做相应配置,在supervisorctl中reload即可启动web管理界面

1475112641-3115-35360-55d5439d676f0474

[inet_http_server]

1475112642-6830-35360-a95a906d7d1fa4d4

http://127.0.0.1:9001/?message=Page%20refreshed%20at%20Tue%20Sep%2029%2016%3A20%3A40%202015

相关阅读:

python之supervisord启动脚本

参考文献:

Supervisor的安装与使用入门

http://fukun.org/archives/07102224.html

 

按需讲解之Supervisor

http://www.cnblogs.com/yjf512/archive/2012/03/05/2380496.html

 

supervisord entered FATAL state, too many start retries too quickly错误处理

http://beginman.cn/linux/2015/09/25/error-about-supervisord/

 

Supervisor监控PHP进程

http://www.phpddt.com/php/supervisor.html

 

关于进程监控及自动启动

http://www.vimer.cn/2013/07/%E5%85%B3%E4%BA%8E%E8%BF%9B%E7%A8%8B%E7%9B%91%E6%8E%A7%E5%8F%8A%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8.html

 

Supervisor学习

http://beginman.cn/linux/2015/04/06/Supervisor/

 

通过进程模型进行扩展

http://12factor.net/zh_cn/concurrency

发表在 应用工具软件, 操作系统相关 | 标签为 | 一条评论

windows下如何使用符号链接

经常用linux环境的朋友一定知道ln命令的作用。它可以将一个目录或文件以链接的形式创建到另一个位置。

那么我们经常用的windows有没有类型的命令呢?

今天在网上无意看到了这个命令

在CMD命令行输入mklink /?,能获得以下帮助:

使用方法如下:

mklink /d “Temp” “F:\SystemCache\Temp”

即可。

 

发表在 操作系统相关 | 标签为 , | 一条评论

利用@media screen实现网页布局的自适应

优点:无需插件和手机主题,对移动设备友好,能够适应各种窗口大小。只需在CSS中添加@media screen属性,根据浏览器宽度判断并输出不同的长宽值

1280分辨率以上(大于1200px)

1100分辨率(大于960px,小于1199px)

880分辨率(大于768px,小于959px)

720分辨率(大于480px,小于767px)

440分辨率以下(小于479px)

 

发表在 Web前台开发技术 | 标签为 , | 留下评论

使用PHP导入和导出CSV文件

项目开发中,很多时候要将外部CSV文件导入到数据库中或者将数据导出为CSV文件,那么具体该如何实现呢?本文将使用PHP并结合mysql,实现了CSV格式数据的导入和导出功能。
我们先准备mysql数据表,假设项目中有一张记录学生信息的表student,并有id,name,sex,age分别记录学生的姓名、性别、年龄等信息。

我们还需要一个html交互页面,放置导入表单和导出按钮。

选择好本地csv文件后,点击导入,提交到do.php?action=import处理,而点击导出按钮则请求地址do.php?action=export进行数据导出处理。

1.导入CSV

do.php需要根据get过来的参数,分别处理导入和导出过程,php结构如下:

导入CSV处理流程:校验csv文件合法性(本文忽略)->打开读入并解析csv文件中的字段->循环获取各字段值->批量添加到数据表中->完成。

注意php自带的fgetcsv函数可以轻松处理csv,使用该函数可以从文件指针中读入一行并解析CSV字段。下面的函数将csv文件字段解析并以数组的形式返回。

此外在导入到数据库中时,我们采用的是批量插入而不是一条条插入的,因此在构建SQL语句时,要稍作处理,见代码。

2.导出CSV

我们知道csv文件是由逗号分割符组成的纯文本文件,你可以用excel打开,效果跟xls表个一样。

导出CSV处理流程:读取学生信息表->循环记录构建逗号分隔的字段信息->设置header信息->导出文件(下载)到本地

要将数据导出到本地即下在,需要修改header信息,代码如下:

注意导入和导出的过程中,因为我们使用的是统一UTF-8编码,遇到中文字符一定要记得转码,否则可能会出现中文乱码的情况。

发表在 BS架构后台语言 | 标签为 , | 留下评论