nginx编程开发(nginx编程语言)
nginx编程语言
我负责过QQ秀和Qzone的运维,也在QQ秀做过开发,当时我所在的部门,如果用java作为开发语言的话以当时服务器的数量是不足以支撑数亿用户的服务的。
要知道,与淘宝不同,腾讯许多业务是免费使用的,例如qzone的许多功能都可以免费使用包括心情,日志,相册,服务器要承担这些亿级的有大量高密集的碎片化请求,如果用java来支撑,经济上是不划算是一方面,响应速度方面用户体验也非常不好。
再来看淘宝,与qzone发个心情,日志相比淘宝用户在淘宝上的行为最终要触发商品交易的,说通俗点就是淘宝用户的行为大都是跟钱相关,而且淘宝要不断迭代更新的同时确保程序逻辑的严谨,Java综合来说是个非常好的选择。
对于高效处理这些高密集的用户请求,c是一个非常好方案,非常适合腾讯的用户场景;淘宝也不是不用c,像淘宝的图片服务器,也是属于海量的高密集用户请求服务,淘宝在这里使用淘宝技术团队修改过的nginx,我们都知道nginx就是c开发的,类似的场景在淘宝的服务架构里应该还有很多这样的例子,阿里也雇佣了不少c的工程师,Linux内核工程师。
nginx脚本语言
CGI的英文全称为Common Gateway Interface(公共网关接口),是Nginx和动态脚本程序的桥梁,Nginx通过FastCGI接口将动态请求发送给FastCGI,FastCGI中的Wrapper进程生成一个线程,将请求交给脚本解释程序执行,然后通过原来的socket将解释执行后的结果原路返回给Nginx,之后Nginx将结果交给客户端。 Nginx是通过套接字文件socket来将动态请求发送给wrapper,使用的是Tcp协议。wrapper通过CGI接口来接受请求。这样web服务器和解释程序之间完全可以独立开发,这样避免了解释程序直接调用服务器的接口而导致的出错和崩溃以及安全性问题。而且可以使Nginx专心处理静态页面请求和转发动态请求,而将脚本解释器安装在另一台服务器,使服务器的压力得到分摊。 CGI是作为PHP程序的补丁开发的,安装PHP首先安装其所依赖的库,之后在编译配置参数时加入对CGI的支持--enable-fpm --enable-cgi等选项。编译PHP的扩展模块,需要用到php中的phpize工具用来生成模块编译时的configure文件,如果运行phpize时无法生成configure文件,原因有:没有安装autoconf软件包。 php-fpm进程的配置文件为/usr/local/php/etc/php-fpm.conf 可以对php-fpm进行相应的配置。 Nginx配置支持fastcgi: location ~ \.php${ root html; fastcgi_pass unix:/tmp/fastcgi.soke //通过套接字文件和cgi建立联系,该文件在php-fpm.conf中设置 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME html$SCRIPT_FILE_NAME;设置参数 include fastcgi_params; //导入fastcgi参数配置文件,该文件在nginx安装时自动生成。 }
nginx语法
linux 中更改用户权限和用户组的命令实例;
增加权限给当前用户 chmod +wx filename
chmod -R 777 /upload
用户组 chgrp -R foldname zdz
chown -R 所有者用户名.组名 文件夹名称
例如:chown -R zdz.nginx KooBox
语法:chmod [who] [+ | - | =] [mode] 文件名
命令中各选项的含义为
u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
操作符号可以是:
+ 添加某个权限。
- 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r 可读。
w 可写。
x 可执行。
X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t 保存程序的文本到交换设备上。
u 与文件属主拥有一样的权限。
g 与和文件属主同组的用户拥有一样的权限。
o 与其他用户拥有一样的权限。
nginx 编程
区别有以下几点:
1、二者最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程 。nginx处理静态文件好,耗费内存少.但无疑apache仍然是目前的主流,有很多丰富的特性.所以还需要搭配着来.当然如果能确定nginx就适合需求,那么使用nginx会是更经济的方式。
2、nginx的负载能力比apache高很多。最新的服务器也改用nginx了。而且nginx改完配置能-t测试一下配置有没 有问题。
3、apache重启的时候发现配置出错了,会很崩溃,改的时候都会非常小心翼翼现在看有好多集群站,前端nginx抗并发,后端apache集群, 配合的也不错。
4、nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向。
5、从经验来看,nginx是很不错的前端服务器,负载性能很好,nginx,用webbench模拟10000个静态文件请求毫不吃力。 apache对php等语言的支持很好,此外apache有强大的支持网络,发展时间相对nginx更久,bug少但是apache有先天不支持多核心处理负载鸡肋的缺点,建议使用nginx做前端,后端用apache。大型网站建议用nginx自代的集群功能。
6、大部分情况下nginx都优于APACHE,比如说静态文件处理、PHP-CGI的支持、反向代理功能、前端 Cache、维持连接等等。在Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数 飙升,从而拒绝服务的现象。
7、Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache吧!
8、一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。
以上就是我的回答,希望可以帮助题主。
nginx 代码
第一种:Nginx自己的错误页面
Nginx访问一个静态的html 页面,当这个页面没有的时候,Nginx抛出404,那么如何返回给客户端404呢?
看下面的配置,这种情况下不需要修改任何参数,就能实现这个功能。
server {
listen 80;
server_name www.test.com;
root /var/www/test;
index index.html index.htm;
location / {
}
# 定义错误页面码,如果出现相应的错误页面码,转发到那里。
error_page 404 403 500 502 503 504 /404.html;
# 承接上面的location。
location = /404.html {
# 放错误页面的目录路径。
root /usr/share/nginx/html;
}
}
第二种:反向代理的错误页面
如果后台Tomcat处理报错抛出404,想把这个状态叫Nginx反馈给客户端或者重定向到某个连接,配置如下:
upstream www {
server 192.168.1.201:7777 weight=20 max_fails=2 fail_timeout=30s;
ip_hash;
}
server {
listen 80;
server_name www.test.com;
root /var/www/test;
index index.html index.htm;
location / {
if ($request_uri ~* ‘^/$’) {
rewrite .* http://www.test.com/index.html redirect;
}
# 关键参数:这个变量开启后,我们才能自定义错误页面,当后端返回404,nginx拦截错误定义错误页面
proxy_intercept_errors on;
proxy_pass http://www;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-FOR $proxy_add_x_forwarded_for;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
}
第三种:Nginx解析php代码的错误页面
如果后端是php解析的,需要加一个变量
在http段中加一个变量
fastcgi_intercept_errors on就可以了。
指定一个错误页面:
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
指定一个url地址:
error_page 404 /404.html;
error_page 404 = http://www.test.com/error.html;
nginx 开发语言
如果使用PHP语言,最少需要开启NGINX,MySQL,PHP,如果使用缓存服务,还需要开启Redis,memcached等。
如果是使用Java语言,最少需要开启Java运行环境,Tomcat服务,MySQL等。
nginx 编译
刚安装的时候就是没有,其实在启动 nginx 时自动生成的 里面存放的是 当前 nginx 住进程的 ID 号;
所以在配置文件中指定pid
pid /usr/local/webserver/nginx/nginx.pid;
哇这个事情 搞了我好长时间,我以为我装的用问题;
nginx的结束重启一般是通过下面命令来实现的:
kill -QUIT 26000
其中26000是nginx的主进程号。
每次都需要通过ps命令来查询nginx的主进程号,非常麻烦。 在《实战nginx:取代Apache的高性能Web服务器》一书中提到了使用pid文件的方法,不巧的是给的命令漏了些东西,这里给出完整的指令。
pid文件就是一个纯文本文件,里面记录的是进程的pid号。
下面是一个pid文件的内容::26032
nginx的默认pid文件
nginx使用了pid文件来记录master process的pid号,如果编译时没有指定,那它的路径就是:
<prefix/logs/nginx.pid
其中<prefix是nginx的安装路径。
如果你想修改默认的pid文件路径,可以在编译时加入配置。参数如下::
./configure –-pid-path=/data/test/ngx.pid
指定后,默认的pid文件路径就更改为::
/data/test/ngx.pid
如果指定只是路径,没有pid的文件名,那么pid的文件名还是nginx.pid
通过配置文件修改pid
除了使用默认值和通过编译时修改外,还可以通过在nginx的配置文件中修改。如下:
pid /data/test/nginx.pid;
这里修改的值只对使用该配置文件的nginx有效。
用PID文件停止Nginx
假设pid文件路径为/data/logs/nginx.pid
kill –QUIT `cat /data/logs/nginx.pid`
用pid文件重新加载配置文件
本网站文章仅供交流学习 ,不作为商用, 版权归属原作者,部分文章推送时未能及时与原作者取得联系,若来源标注错误或侵犯到您的权益烦请告知,我们将立即删除.