Ubuntu 12.04使用Apache的ProxyPass配置反向代理

在某些情况下,虽然Apache已经能满足其大多数通用Web服务需求,但其他Web或应用程序服务器更适合某些任务。 幸运的是,很容易配置Apache将某些请求传递到其他Web服务器进程。 这些辅助(或第三)web服务器可以在相同的服务器或单独的节点(可能通过专用网络)上运行。 我们的示例使用lighttpd作为辅助Web服务器,但它们也可以代理HTTP请求到任何Web服务器或应用程序。

激活Proxy模块

按如下内容编辑/etc/apache2/mods-available/proxy.conf:

  1. <IfModule mod_proxy.c>
  2.         #turning ProxyRequests on and allowing proxying from all may allow
  3.         #spammers to use your proxy to send email.
  4.  
  5.         ProxyRequests Off
  6.  
  7.         <Proxy *>
  8.                 AddDefaultCharset off
  9.                 Order deny,allow
  10.                 Allow from all
  11.         </Proxy>
  12.  
  13.         # Enable/disable the handling of HTTP/1.1 "Via:" headers.
  14.         # ("Full" adds the server version; "Block" removes all outgoing Via: headers)
  15.         # Set to one of: Off | On | Full | Block
  16.  
  17.         ProxyVia On
  18. </IfModule>

这将启用代理支持。
下一步,执行如下命令:

  1. a2enmod proxy
  2. a2enmod proxy_http
  3. service apache2 restart

Apache应该能正常重新启动。如果您遇到任何问题,您可以检查/var/log/apache2/下的日志以获取更多信息。

代理一个域名到Lighttpd

我们已经有一个名为“www.firstsite.org”的网站作为正常的虚拟主机在Apache下运行。 我们将使用Apache将对“www.secondsite.org”网站的请求发送到lighttpd,lighttpd运行在端口8080上。 这里是“www.secondsite.org”的配置文件:
/etc/apache2/sites-available/www.secondsite.org:

  1. <VirtualHost *:80>
  2.      ServerAdmin [email protected]
  3.      ServerName secondsite.org
  4.      ServerAlias www.secondsite.org
  5.  
  6.      ProxyPass / http://localhost:8080/
  7.  
  8.      # Uncomment the line below if your site uses SSL.
  9.      #SSLProxyEngine On
  10. </VirtualHost>

ProxyPass指令告诉Apache将此域的所有请求转发到在端口8080上运行的Web服务器。如果我们的目标服务器在另一个服务器上运行,我们可以指定地址。 我们将使用以下命令启用该网站:

  1. a2ensite www.secondsite.org
  2. service apache2 reload

代理指定URL到Lighttpd

如果我们想把http://www.firstsite.org/myapp/的请求转向 lighttpd,我们只需修改其配置文件,如下所示:
/apache2/sites-available/www.firstsite.org:

  1. <VirtualHost *:80>
  2.      ServerAdmin [email protected]
  3.      ServerName firstsite.org
  4.      ServerAlias www.firstsite.org
  5.      DocumentRoot /srv/www/firstsite.org/public_html/
  6.      ErrorLog /srv/www/firstsite.org/logs/error.log
  7.      CustomLog /srv/www/firstsite.org/logs/access.log combined
  8.  
  9.      ProxyPass /myapp http://localhost:8080/
  10. </VirtualHost>

Debian安装Node.js Nginx

Node.js是一个JavaScript平台,可以动态,快速正确响应请求。 JavaScript通常是客户端,浏览器语言如HTML或CSS。 但是,Node.js是一个服务器端的JavaScript平台,与PHP相当。 Node.js经常与其他流行的服务器应用程序(如NGINX或Apache)一起工作。 在本文中,NGINX配置为处理前端,静态文件请求,Node.js配置为处理后端文件请求。

安装配置NGINX

1.安装

  1. apt-get install nginx

2.启动Nginx

  1. service nginx start

3.切换目录到sites-available

  1. cd /etc/nginx/sites-available/

4.新建一个sites-available文件,把example.com替换成你的域名
/etc/nginx/sites-available/example.com:

  1. #Names a server and declares the listening port
  2. server {
  3.   listen 80;
  4.   server_name example.com www.example.com;
  5.  
  6.   #Configures the publicly served root directory
  7.   #Configures the index file to be served
  8.   root /var/www/example.com;
  9.       index index.html index.htm;
  10.  
  11.   #These lines create a bypass for certain pathnames
  12.   #www.example.com/test.js is now routed to port 3000
  13.   #instead of port 80
  14.   location /test.js {
  15.       proxy_pass http://localhost:3000;
  16.       proxy_set_header Host $host;
  17.   }
  18. }

5.切换目录到sites-enabled

  1. cd /etc/nginx/sites-enabled/

6.创建一个软链接指向example sites-available文件

  1. ln -s /etc/nginx/sites-available/example.com

7.删除default软链接

  1. rm default

8.重载nginx配置

  1. service nginx reload

创建目录和HTML Index文件

NGINX现已配置。 但是,example.com server块里涉及的目录和文件需要手动创建。
1.创建/var/www和/var/www/example.com目录

  1. mkdir -p /var/www/example.com

2.切换目录

  1. cd /var/www/example.com

3.创建HTML Index文件
/var/www/example.com/index.html:

  1. <!DOCTYPE html>
  2.   <html>
  3.   <body>
  4.  
  5.   <br>
  6.   <br>
  7.  
  8.   <center>
  9.   <p>
  10.   <b>
  11.   If you have not finished the <a href="https://linode.com/docs/websites/nodejs/nodejs-nginx-debian">guide</a>, the button below will not work.
  12.   </b>
  13.   </p>
  14.   </center>
  15.  
  16.   <center>
  17.   <p>
  18.   The button links to test.js. The test.js request is passed through NGINX and then handled by the Node.js server.
  19.   </p>
  20.   </center>
  21.  
  22.   <center>
  23.   <a href="test.js">
  24.   <button type="button">Go to test.js</button>
  25.   </a>
  26.   </center>
  27.  
  28.   </body>
  29.   </html>

安装Node.js

NGINX现在正在侦听80端口并已能提供服务。 它还配置/test.js请求转到端口3000.接下来的步骤是安装Node.js,然后使用Node.js编写服务器。 新服务器侦听端口3000。
1.安装Node版本管理器

  1. curl https://raw.githubusercontent.com/creationix/nvm/v0.20.0/install.sh | bash

2.关闭并重新打开终端
3.安装Node.js

  1. nvm install 0.10

4.创建一个Node.js服务器
/var/www/example.com/server.js:

  1. //nodejs.org/api for API docs
  2.   //Node.js web server                         
  3.   var http = require("http"),                           //Import Node.js modules
  4.       url = require("url"),                             
  5.       path = require("path"),
  6.       fs = require("fs");
  7.  
  8.   http.createServer(function(request, response) {       //Create server
  9.   var name = url.parse(request.url).pathname;           //Parse URL
  10.   var filename = path.join(process.cwd(), name);        //Create filename
  11.   fs.readFile(filename, "binary", function(err, file) { //Read file
  12.       if(err) {                                         //Tracking Errors
  13.           response.writeHead(500, {"Content-Type": "text/plain"});
  14.           response.write(err + "n");
  15.           response.end();
  16.           return;
  17.       }
  18.       response.writeHead(200);                          //Header request response
  19.       response.write(file, "binary");                   //Sends body response
  20.       response.end();                                   //Signals to server that
  21.    });                                                  //header and body sent
  22.   }).listen(3000);                                      //Listening port
  23.   console.log("Server is listening on port 3000.")      //Terminal output

5.运行一个新的screen会话

  1. screen

6.回车运行Node.js服务器

  1. node server.js

7.Ctrl+a+d退出screen

创建Test.js文件

NGINX目前侦听端口80,并将任何/test.js请求传递到端口3000。Node.js侦听端口3000并对任何请求响应。 接下来,写一个/test.js文件。
1.创建文件
/var/www/example.com/test.js:

  1. <!DOCTYPE html>
  2.   <html>
  3.   <body>
  4.         
  5.   <center>
  6.   <h2>
  7.   Your Node.JS server is working.
  8.   </h2>
  9.   </center>
  10.                 
  11.   <center>
  12.   <p>
  13.   The below button is technically dynamic. You are now using Javascript on both the client-side and the server-side.
  14.   </p>
  15.   </center>
  16.   <br>
  17.         
  18.   <center>
  19.   <button type="button"
  20.   onclick="document.getElementById(‘sample’).innerHTML = Date()">
  21.   Display the date and time.
  22.   </button>
  23.   <p id="sample"></p>
  24.   </center>
  25.         
  26.   </body>
  27.   </html>

2.浏览器输入IP地址或域名测试NGINX服务器。 点击“Go to test.js”按钮测试Node.js服务器是否正常。 在测试页上,“Display the date and time”按钮将执行javascript的客户端代码段,以返回当前时间。
Node.js和NGINX目前已经能一起正常运行。 根据您的需要你可以更新路由把请求转到任何服务器。 Node.js提供了许多API及工具。 使用Node.js,开发人员可以在客户端或服务器端工作时使用JavaScript语言。

Ubuntu 16.04安装Apache Tomcat

Apache Tomcat是Java Servlet和Java Server Pages技术的开源软件实现。 可以使用OpenJDK tomcat运行你的Java应用。

Apache Tomcat安装

从Ubuntu软件库安装Tomcat:

  1. apt-get install tomcat8

您可能还需要安装tomcat8-docs,tomcat8-examples和tomcat8-admin工具,这些工具提供了文档,测试和允许您基于Web的应用程序管理Tomcat。 您可以使用以下命令安装所有这三个:

  1. apt-get install tomcat8-docs tomcat8-examples tomcat8-admin

如果需要启动,停止或重新启动Tomcat,可以使用以下命令:

  1. systemctl start tomcat8
  2. systemctl stop tomcat8
  3. systemctl restart tomcat8

测试并使用Tomcat

可以在浏览器打开http://example.com:8080/来验证tomcat的安装。 注意,Tomcat监听网络端口8080,默认情况下不接受强制HTTPS连接。 默认情况下,Tomcat配置文件位于/var/lib/tomcat8/conf目录中。
要使用tomcat8-admin web应用程序,请将以下行添加到/var/lib/tomcat8/conf/tomcat-users.xml文件的行之前,替换您自己的用户名和密码 。 如果使用Tomcat管理员,请添加manager的“manager-gui”角色和host-manager应用程序的“admin-gui”角色。
如果您不部署Web应用程序,仅需要从命令行运行应用程序,则不应输入这些行,因为这样做可能会使您的服务器遭受未经授权的登录尝试。
/var/lib/tomcat8/conf/tomcat-users.xml:

  1. <role rolename="manager-gui"/>
  2. <role rolename="admin-gui"/>
  3. <user username="username" password="password" roles="manager-gui,admin-gui"/>

重启以生效配置:

  1. systemctl restart tomcat8

Nginx SSL TLS部署最佳实践

本文介绍nginx在提供HTTPS时使用的一些其他配置选项。 虽然这些功能有助于优化nginx的SSL和TLS,但这不是一个完整对加固nginx的介绍。 确保您的服务器安全的最佳方法是不仅需要正确的配置,而且需要始终遵循最佳安全的设置实践。

关闭nginx版本显示

默认情况下,nginx与任何连接到服务器的客户端共享其版本号。 例如,如果没有找到目录,nginx将返回包含其版本号的404错误。 关闭nginx版本显示使得攻击者无法清楚的得到具体版本,因此可以阻止他进行特定于版本的漏洞攻击。
1.要禁用server_tokens,请打开/etc/nginx/nginx.conf文件。 在http块中,附加或取消注释以下行:

  1. server_tokens       off;

2.保存更改并重启nginx

  1. systemctl restart nginx

启用HTTP/2支持

2010年9月,Google发布了适用于Chrome 6所有版本的的SPDY协议.SPDY目前正在逐步淘汰,以支持HTTP/2。 nginx在2016年5月删除了对Chrome中SPDY的支持。仅在nginx 1.8.x或更早版本中支持SPDY,而从1.9.5开始的版本开始支持HTTP/2。 检查你的nginx版本:
nginx -v
HTTP/2是HTTP标准的新版本,替代HTTP/1.1以减少页面加载时间。 传统上,当用户访问网页时,需要建立单独的HTTP连接以加载每个资源(例如HTML,CSS,JavaScript或图像)。 HTTP/2允许在单个连接上并发请求资源。 服务器还会在将资源发送到客户端之前对其进行压缩,这有利用减少的传输带宽。
1.要启用HTTP/2,请打开nginx SSL虚拟主机配置文件。 根据你安装nginx方式,这可能位于/etc/nginx/sites-enabled/default或/etc/nginx/conf.d/example_ssl.conf。 在“SSL配置”中查找listen行。 如果需要,取消注释以下行,并将http2添加到分号前的结尾。
/etc/nginx/conf.d/example_ssl.conf:

  1. listen       443 ssl http2;

2.保存修改并重启nginx

  1. systemctl restart nginx

3.打开https://tools.keycdn.com/http2-test网站,输入域名测试是否正确支持HTTP/2。

重定向HTTP到HTTPS

Google现在对搜索结果中使用HTTPS加密连接的网站进行优先排名,因此将HTTP请求重定向到HTTPS是提高网页排名的一种可能方法。 然而,在遵循这些步骤之前,请务必研究旧版浏览器可能出现的兼容性问题。
1.打开您的HTTP nginx虚拟主机配置文件,可能位于/etc/nginx/conf.d/default.conf,/etc/nginx/nginx.conf或/etc/nginx/sites-enabled/default,具体取决于您安装nginx的方式。 更改example.com以匹配您的服务器的域名或主机名:
/etc/nginx/conf.d/default.conf:

  1. server_name example.com

2.在server_name行下面附加以下行。
/etc/nginx/conf.d/default.conf:

  1. rewrite        ^ https://$server_name$request_uri? permanent;

3.注释掉(放置#在前面)所有其他行,所以你的配置看起来像这样:
/etc/nginx/conf.d/default.conf:

  1. server {
  2.     listen       80;
  3.     server_name  example.com;
  4.     rewrite      ^ https://$server_name$request_uri? permanent;
  5. }

4.保存更改并重启nginx

  1. systemctl restart nginx

OCSP Stapling

创建在线证书状态协议(OCSP)是为了加速操作系统和浏览器用于检查证书吊销的过程。 例如,当您在Windows计算机上使用Internet Explorer或Google Chrome时,Windows默认配置为检查证书吊销。 在OCSP之前,您的操作系统或浏览器将下载证书吊销列表(CRL)。 CRL已经变得非常大,以至于浏览器厂商正在创建自己的CRL并将其分发给用户。
OCSP的问题是,用户在使用由同一供应商或证书颁发机构提供的证书的网站跳转时,证书颁发机构可以跟踪用户这种行为。 为了防止这种情况,可以启用OCSP stapling。
当启用OCSP stapling时,服务器上的nginx将向客户端发出OCSP请求。 从OCSP服务器收到的响应被添加到nginx对用户的响应中。 这消除了用户连接到OCSP服务器以检查服务器证书的撤销状态的需要。
1.打开您的HTTPS nginx虚拟主机配置文件,可能位于/etc/nginx/conf.d/example_ssl.conf或/etc/nginx/sites-enabled/default,具体取决于您如何安装和配置nginx。 在server块中添加以下行:
/etc/nginx/conf.d/example_ssl.conf:

  1. ssl_stapling on;
  2. ssl_stapling_verify on;
  3. ssl_trusted_certificate /etc/ssl/nginx/ca.pem;

2.保存更改并重启nginx

  1. systemctl restart nginx

3.打开https://www.ssllabs.com/ssltest/,检查OCSP stapling是否正确开启。

强制HTTP使用HTTPS(HSTS)

Google Chrome,Mozilla Firefox,Opera和Safari目前支持HSTS标头。 HSTS用于强制浏览器仅使用安全加密连接进行连接。 这意味着您的网站将无法再通过HTTP访问。 当HSTS启用并且有效的HSTS头存储在用户浏览器缓存中时,如果显示由不受信任的证书颁发机构颁发的自签名,过期或SSL证书,则用户将无法访问您的网站。 用户也将无法绕过任何证书警告,除非您的HSTS标头过期或浏览器缓存已清除。
将所有流量从HTTP重定向到HTTPS后,您可能需要允许用户仅使用HTTPS进行连接。 在启用HSTS之前,请确保您了解与旧版浏览器的兼容性的潜在影响。
如果您希望用户能够通过HTTP访问您的网站,请不要按照这些步骤操作!
1.打开您的nginx HTTPS虚拟主机配置文件。 这可能位于/etc/nginx/sites-enabled/default或/etc/nginx/conf.d/example_ssl.conf。 在您的server块中附加以下行:
/etc/nginx/conf.d/example_ssl.conf:

  1. add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

max-age属性以秒为单位设置此标头的到期日期; 在上述配置中,报头将在1年后过期。 您可以将其配置为更长或更短,但对Qualys测试,少于180天的时间被认为太短了。 includeSubdomains参数在所有子域上强制执行HSTS。
2.保存更改并重启nginx

  1. systemctl restart nginx

3.打开https://www.ssllabs.com/ssltest/,测试配置是否生效。

禁用内容嗅探

内容嗅探允许浏览器检查字节流以便“猜测”其内容的文件格式。 它通常用于帮助不能正确识别其Web内容的MIME类型的网站,但它也导致出现了跨站点脚本和其他攻击的漏洞。 要禁用内容嗅探,请在server块中的nginx SSL配置文件中添加以下行:
/etc/nginx/conf.d/example_ssl.conf:

  1. add_header X-Content-Type-Options nosniff;

禁用或限制嵌入

HTTPS响应头X-Frame-Options可以指定页面是否能够在框架,iframe或对象中呈现。 如果未设置,您的网站的内容可能会在clickjacking攻击中嵌入到其他网站的HTML代码中。 要禁用嵌入内容,请将以下行添加到server块中的SSL配置文件中:
/etc/nginx/conf.d/example_ssl.conf:

  1. add_header X-Frame-Options DENY;

如果您希望限制嵌入而不是完全禁用它,则可以用SAMEORIGIN替换DENY。 这将允许您在框架中使用您的页面,只要是在同一网站中。

创建自定义Diffie-Hellman密钥交换

我们使用4096位RSA私钥来签署Diffie-Hellman密钥交换,但是Diffie-Hellman的默认参数只指定1024位,通常使其成为SSL密码套件中最弱的链路。 我们应该为密钥交换生成自己的自定义参数,以提供更高的安全性。
1.切换到certs目录

  1. cd /etc/ssl/certs

2.为TLS握手创建自定义参数。 这里我们将使用4096位密钥来实现高安全性:

  1. openssl dhparam -out dhparam.pem 4096

3.通过将以下行添加到server块中的nginx SSL配置文件中来指定新参数:
/etc/nginx/conf.d/example_ssl.conf:

  1. ssl_dhparam /etc/ssl/certs/dhparam.pem;

4.保存更改并重启nginx

  1. systemctl restart nginx

测试配置

你的/etc/nginx/conf.d/example_ssl.conf现在应该看起来类似于:
/etc/nginx/conf.d/example_ssl.conf:

  1. # HTTPS server
  2. #
  3. server {
  4.     listen       443 ssl http2;
  5.         
  6.     add_header   Strict-Transport-Security "max-age=31536000; includeSubdomains";
  7.     add_header   X-Content-Type-Options nosniff;
  8.     add_header   X-Frame-Options DENY;
  9.         
  10.     server_name  example.com;
  11.  
  12.     ssl_certificate      /etc/ssl/nginx/nginx.crt;
  13.     ssl_certificate_key  /etc/ssl/nginx/server.key;
  14.  
  15.     ssl_session_cache shared:SSL:10m;
  16.     ssl_session_timeout  5m;
  17.  
  18.     ssl_ciphers  "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH !RC4";
  19.     ssl_prefer_server_ciphers   on;
  20.  
  21.     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  22.  
  23.     ssl_stapling on;
  24.     ssl_stapling_verify on;
  25.     ssl_trusted_certificate /etc/nginx/ca.pem;
  26.  
  27.     ssl_dhparam /etc/ssl/certs/dhparam.pem;
  28.  
  29.     location / {
  30.         root   /usr/share/nginx/html;
  31.         index  index.html index.htm;
  32.     }
  33. }

打开https://www.ssllabs.com/ssltest/,测试SSL。

Ubuntu 14.04使用Nginx uWSGI部署Django应用

Django是一个高级的Python Web框架,Django的主要目的是简便、快速的开发数据库驱动的网站。本文介绍了在Ubuntu 14.04上使用uWSGI和nginx部署Django应用程序。

安装nginx, Python工具和uWSGI

1.安装nginx,SQLite Python bindings和管理Python工具所需的系统包:

  1. sudo apt-get install build-essential nginx python-dev python-pip python-sqlite sqlite

2.安装virtualenv和virtualenvwrapper:

  1. sudo pip install virtualenv virtualenvwrapper

virtualenv和virtualenvwrapper是创建隔离的Python环境的工具。 它们有助于更好地管理应用程序依赖性,版本和权限。 要使virtualenvwrapper正常工作,请运行以下命令:

  1. echo "export WORKON_HOME=~/Env" >> ~/.bashrc
  2. echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc

3.在当前会话中激活virtualenvwrapper:

  1. source ~/.bashrc

4.使用pip安装uWSGI:

  1. sudo pip install uwsgi

配置Django应用程序示例

1.确保您在django用户的主目录中并为应用程序创建虚拟环境:

  1. cd /home/django && mkvirtualenv sample

执行此命令后,您的提示将更改为(sample)[email protected]:~$表示您正在使用sample虚拟环境。 要退出虚拟环境,请输入deactivate。
2.安装Django framework

  1. pip install Django

3.创建新的Django应用程序示例,位于/home/django/sample:

  1. django-admin.py startproject sample

4.切换到Django应用程序的目录并初始化SQLite数据库:

  1. cd ~/sample && ./manage.py migrate

5.当使用nginx运行Django时,需要配置Django将所有静态资源放在应用程序的静态文件夹中。 在settings.py中指定其位置:

  1. echo ‘STATIC_ROOT = os.path.join(BASE_DIR, "static/")’ >> sample/settings.py

6.运行以下命令将所有静态资源移动到上述目录中:

  1. ./manage.py collectstatic

7.启动开发服务器以测试示例应用程序:

  1. ./manage.py runserver 0.0.0.0:8080

请在您的浏览器中访问http://example.com:8080,以确认示例应用程序已正确设置并正常工作。 您应该会看到Django测试页。

配置uWSGI

1.创建目录以存放uWSGI配置

  1. sudo mkdir -p /etc/uwsgi/sites

2.创建配置文件sample.ini:
/etc/uwsgi/sites/sample.ini:

  1. [uwsgi]
  2. project = sample
  3. base = /home/django
  4.  
  5. chdir = %(base)/%(project)
  6. home = %(base)/Env/%(project)
  7. module = %(project).wsgi:application
  8.  
  9. master = true
  10. processes = 2
  11.  
  12. socket = %(base)/%(project)/%(project).sock
  13. chmod-socket = 664
  14. vacuum = true

3.为uWSGI创建Upstart job:
/etc/init/uwsgi.conf:

  1. description "uWSGI"
  2. start on runlevel [2345]
  3. stop on runlevel [06]
  4. respawn
  5.  
  6. env UWSGI=/usr/local/bin/uwsgi
  7. env LOGTO=/var/log/uwsgi.log
  8.  
  9. exec $UWSGI –master –emperor /etc/uwsgi/sites –die-on-term –uid django –gid www-data –logto $LOGTO

4.启动uwsgi服务

  1. sudo service uwsgi start

配置Nginx

1.删除默认的nginx站点配置:

  1. sudo rm /etc/nginx/sites-enabled/default

2.为您的Django应用程序创建一个nginx站点配置文件:
/etc/nginx/sites-available/sample:

  1. server {
  2.     listen 80;
  3.     server_name example.com;
  4.  
  5.     location = /favicon.ico { access_log off; log_not_found off; }
  6.     location /static/ {
  7.         root /home/django/sample;
  8.     }
  9.  
  10.     location / {
  11.         include         uwsgi_params;
  12.         uwsgi_pass      unix:/home/django/sample/sample.sock;
  13.     }
  14. }

3.创建指向nginx sites-enabled目录的符号链接以启用站点配置文件:

  1. sudo ln -s /etc/nginx/sites-available/sample /etc/nginx/sites-enabled

4.检查nginx配置并重新启动它:

  1. sudo service nginx configtest && sudo service nginx restart

5.现在,您应该可以通过浏览器输入你的域名或IP地址来访问您的Django应用程序。

Debian 8 (Jessie)安装Nginx StartSSL证书

本文将告诉你如何在Debian Jessie上安装最新的稳定版本的nginx。 它还将部署来自StartSSL的免费SSL证书。 在本文中,我们配置nginx使用强大的服务器端密码套件,并禁用易受攻击的SSLv2和SSLv3协议。

源码编译Nginx

虽然在许多情况下从软件包存储库进行安装nginx已经够用,但此安装方法的HTTP/2不能使所有浏览器兼容。 Google Chrome现在只允许与应用层协议协商(ALPN)的HTTP/2连接,OpenSSL 1.0.2或更高版本中支持此协议。 此版本不包括在默认Debian软件包存储库中,因此您需要手动添加它,并针对较新的OpenSSL编译nginx以启用对HTTP/2的完全支持。
请注意,当使用此方法时,您将负责更新nginx以包括最新的更新。
1.将Debian Backports存储库添加到包管理器检查更新的文件列表中:

  1. echo "deb http://ftp.debian.org/debian jessie-backports main " >> /etc/apt/sources.list.d/backports.list

2.更新可用包的列表:

  1. apt-get update

3.从backports存储库安装最新版本的OpenSSL及其库:

  1. apt-get install -t jessie-backports openssl libssl-dev

4.安装nginx依赖关系:

  1. apt-get install libpcre3-dev build-essential

5.将最新的稳定版本的nginx下载到/opt目录:

  1. cd /opt
  2. wget http://nginx.org/download/nginx-1.11.2.tar.gz

6.解压缩文件,然后切换到新目录:

  1. tar -zxvf nginx-1.*.tar.gz
  2. cd /opt/nginx-1.*

7.配置编译选项。 提供下面的示例以供参考。 根据您的需要,您可能希望添加其他选项,:

  1. ./configure –prefix=/opt/nginx –conf-path=/etc/nginx/nginx.conf –user=nginx –group=nginx –with-debug –with-threads –with-http_ssl_module –with-ipv6 –with-http_v2_module

此步骤完成后,您将看到配置摘要的输出。 一定要记住给定的文件路径,因为你很快就需要它们。
8.使用您在步骤7中指定的选项编译和安装nginx:

  1. make
  2. make install

9.创建nginx系统用户

  1. sudo adduser –system –no-create-home –disabled-login –disabled-password –group nginx

10.创建一个systemd服务脚本来运行nginx:
/lib/systemd/system/nginx.service:

  1. [Unit]
  2. Description=A high performance web server and a reverse proxy server
  3. After=network.target
  4.  
  5. [Service]
  6. Type=forking
  7. PIDFile=/opt/nginx/logs/nginx.pid
  8. ExecStartPre=/opt/nginx/sbin/nginx -t -q -g ‘daemon on; master_process on;’
  9. ExecStart=/opt/nginx/sbin/nginx -g ‘daemon on; master_process on;’
  10. ExecReload=/opt/nginx/sbin/nginx -g ‘daemon on; master_process on;’ -s reload
  11. ExecStop=-/sbin/start-stop-daemon –quiet –stop –retry QUIT/5 –pidfile /opt/nginx/logs/nginx.pid
  12. TimeoutStopSec=5
  13. KillMode=mixed
  14.  
  15. [Install]
  16. WantedBy=multi-user.target

如果使用步骤7中的编译配置选项,则可以完全按照以上的脚本。 但是,如果指定了自己的文件路径,则可能需要调整PIDFile的值以匹配您的PID文件,并且以Exec开头的行中的路径匹配您的nginx二进制文件路径。 这些文件路径包含在步骤7的输出中。
11.为nginx.service加上执行权限

  1. chmod +x /lib/systemd/system/nginx.service

12.启动nginx

  1. systemctl start nginx

或者,您可以设置nginx在启动时自动启动:

  1. systemctl enable nginx

生成私钥和证书签名请求(CSR)

1.创建一个目录来存储您的证书和私钥。 在Debian系统上,用于存储证书和私钥的默认位置在/etc/ssl/中。 在该位置创建一个新的nginx目录,以存储您的证书和nginx的私钥:

  1. mkdir /etc/ssl/nginx

2.切换到新创建的目录:

  1. cd /etc/ssl/nginx

3.生成4096位私有RSA密钥。 大多数证书颁发机构目前要求客户至少使用2048位专用RSA密钥。

  1. openssl genrsa -out server.key 4096

4.生成证书签名请求(CSR)。 在此示例中,server.key是上面创建的RSA私钥文件,server.csr是我们的CSR文件的名称:

  1. openssl req -new -key server.key -out server.csr

部署StartSSL证书

把证书签名请求文件server.csr提交到StartSSL网站,生效后下载证书相关文件,提取出里面的crt文件,并保存到/etc/ssl/nginx/server.crt。

收集其他必需的证书文件

1.确保您仍然在nginx SSL文件所在的目录中:

  1. cd /etc/ssl/nginx

2.下载StartSSL CA证书:

  1. wget http://www.startssl.com/certs/ca.pem

3.将StartSSL中间CA证书附加到该文件,创建统一的CA证书文件:

  1. curl http://www.startssl.com/certs/sub.class1.server.ca.pem >> ca.pem

4.创建包含您的签名证书和Nginx的StartSSL CA证书的单个文件:

  1. cat server.crt ca.pem > nginx.crt

安装StartSSL证书

1.默认情况下,nginx配置为仅在TCP端口80上提供HTTP请求。要使用SSL,您需要配置nginx以在TCP端口443上提供HTTPS请求。打开nginx SSL服务器块示例配置文件并调整配置.
/etc/nginx/conf.d/example_ssl.conf:

  1. # HTTPS server
  2. #
  3. server {
  4.     listen       443 ssl;
  5.     server_name  example.com;
  6.  
  7.     ssl_certificate      /etc/ssl/nginx/nginx.crt;
  8.     ssl_certificate_key  /etc/ssl/nginx/server.key;
  9.  
  10.     ssl_session_cache shared:SSL:10m;
  11.     ssl_session_timeout  5m;
  12.  
  13.     ssl_ciphers  "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH !RC4";
  14.     ssl_prefer_server_ciphers   on;
  15.  
  16.     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  17.  
  18.     location / {
  19.         root   /opt/nginx/html;
  20.         index  index.html index.htm;
  21.     }
  22. }

将server_name的值替换为您的域或子域名称。 请确保ssl_certificate和ssl_certificate_key的值与您创建的证书和私钥的文件路径相匹配。 行ssl_session_cache,ssl_ciphers和ssl_protocols应与上述配置匹配。
根据您安装nginx的方式,默认情况下可能不会创建此文件。 例如,如果从源编译nginx,则需要创建example_ssl.conf文件并将此配置复制到其中。 如果是这种情况,您还需要将以下行添加到主要nginx配置文件中的http块:

  1. include     /etc/nginx/conf.d/*.conf;

2.重启nginx

  1. systemctl restart nginx

Debian 6 (Squeeze)安装Nginx uWSGI

uWSGI服务器提供了一个非FastCGI方法用于使用nginx Web服务器部署Python应用程序。 与nginx结合,uWSGI提供极大的稳定性,灵活性和高性能。 但是,要部署具有uWSGI和nginx的应用程序,必须手动编译包含uwsgi模块的nginx。

安装uWSGI

首先执行以下命令来更新系统并安装uWSGI的依赖关系:

  1. apt-get update
  2. apt-get upgrade
  3. apt-get install build-essential psmisc python-dev libxml2 libxml2-dev python-setuptools

依顺序执行以下命令以下载和编译uWSGI:

  1. cd /opt/
  2. wget http://projects.unbit.it/downloads/uwsgi-0.9.6.5.tar.gz
  3. tar -zxvf uwsgi-0.9.6.5.tar.gz
  4. mv uwsgi-0.9.6.5/ uwsgi/
  5. cd uwsgi/
  6. python setup.py install

执行以下命令以创建系统用户来运行uwsgi进程:

  1. adduser –system –no-create-home –disabled-login –disabled-password –group uwsgi

执行以下命令以设置所需的文件权限:

  1. chown -R uwsgi:uwsgi /opt/uwsgi
  2. touch /var/log/uwsgi.log
  3. chown uwsgi /var/log/uwsgi.log

编译nginx及uWSGI模块

执行以下命令来下载和编译nginx及uwsgi模块。 如果您以前从Debian软件包安装了nginx,请在此时删除它们。

  1. apt-get install libpcre3-dev libssl-dev
  2. cd /opt/
  3. wget http://nginx.org/download/nginx-1.0.0.tar.gz
  4. tar -zxvf nginx-1.0.0.tar.gz
  5. cd /opt/nginx-1.0.0/
  6. ./configure –prefix=/opt/nginx –user=nginx –group=nginx –with-http_ssl_module
  7. make
  8. make install
  9. adduser –system –no-create-home –disabled-login –disabled-password –group nginx
  10. wget -O init-deb.sh http://www.linode.com/docs/assets/682-init-deb.sh
  11. mv init-deb.sh /etc/init.d/nginx
  12. chmod +x /etc/init.d/nginx
  13. /usr/sbin/update-rc.d -f nginx defaults
  14. /etc/init.d/nginx start

配置uWSGI

执行以下命令以下载init脚本来管理uWSGI进程,位于/etc/init.d/uwsgi:

  1. cd /opt/
  2. wget -O init-deb.sh http://www.linode.com/docs/assets/683-uwsgi-init-deb.sh
  3. mv /opt/init-deb.sh /etc/init.d/uwsgi
  4. chmod +x /etc/init.d/uwsgi

创建/etc/default/uwsgi文件用来存放Python应用程序的特定设置。 MODULE指定包含wsgi规范的Python模块的名称。 考虑下面的例子:
/etc/default/uwsgi:

  1. PYTHONPATH=/srv/www/example.com/application
  2. MODULE=wsgi_configuration_module

如果要部署“Hello World”应用程序,请将以下代码插入到/srv/www/example.com/application/wsgi配置module.py文件中:
/srv/www/example.com/application/wsgi_configuration_module.py:

  1. import os
  2. import sys
  3.  
  4. sys.path.append(‘/srv/www/example.com/application’)
  5.  
  6. os.environ[‘PYTHON_EGG_CACHE’] = ‘/srv/www/example.com/.python-egg’
  7.  
  8. def application(environ, start_response):
  9.     status = ‘200 OK’
  10.     output = ‘Hello World!’
  11.  
  12.     response_headers = [(‘Content-type’, ‘text/plain’),
  13.                         (‘Content-Length’, str(len(output)))]
  14.     start_response(status, response_headers)
  15.  
  16.     return [output]

执行以下命令使此初始化脚本可执行,确保WSGI在下一个重新启动后重新启动,并启动服务:

  1. /usr/sbin/update-rc.d -f uwsgi defaults
  2. /etc/init.d/uwsgi start

配置nginx

为uWSGI应用程序的站点创建类似于以下内容的nginx服务器配置:

  1. server {
  2.     listen   80;
  3.     server_name www.example.com example.com;
  4.     access_log /srv/www/example.com/logs/access.log;
  5.     error_log /srv/www/example.com/logs/error.log;
  6.  
  7.     location / {
  8.         include        uwsgi_params;
  9.         uwsgi_pass     127.0.0.1:9001;
  10.     }
  11.  
  12.     location /static {
  13.         root   /srv/www/example.com/public_html/static/;
  14.         index  index.html index.htm;
  15.     }
  16. }

所有以/static结尾的网址请求都会直接从/srv/www/example.com/public_html/static目录提供。 通过执行以下命令重新启动Web服务器:

  1. /etc/init.d/nginx restart

Ubuntu 14.04安装nginx PageSpeed

本文说明如何安装nginx(发音engine-x)与ngx_pagespeed模块。 PageSpeed可帮助您缩小CSS,JavaScript和图片,从HTML中删除空白,并执行许多其他任务。

安装所需的包

Pagespeed需要一些额外的软件包,您应该安装它们才能正常运行。 通过在终端中执行以下命令:

  1. sudo apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev unzip

下载ngx_pagespeed模块

安装必要的软件包后,必须下载模块。 在本文中,最新的ngx_pagespeed版本1.9.32.6。
1.确保您在主目录中:

  1. cd

2.定义将要安装的版本号:

  1. NPS_VERSION=1.9.32.6

3.现在,您需要下载模块的源代码:

  1. wget https://github.com/pagespeed/ngx_pagespeed/archive/release-${NPS_VERSION}-beta.zip

4.使用gunzip命令提取文件:

  1. unzip release-${NPS_VERSION}-beta.zip

5.移动到modules目录:

  1. cd ngx_pagespeed-release-${NPS_VERSION}-beta/

6.下载一些其他文件:

  1. wget https://dl.google.com/dl/page-speed/psol/${NPS_VERSION}.tar.gz

7.使用tar命令提取文件:

  1. tar -xzvf ${NPS_VERSION}.tar.gz

下载并编译Nginx

现在我们已经下载了ngx_pagespeed,我们需要使用ngx_pagespeed模块编译Nginx。 在终端中执行如下命令。
1.您现在需要回到您的主目录:

  1. cd

2.在此命令中,您将定义将使用的Nginx的版本,以便您不必一次又一次地输入它。 在写这篇文章的时候,当前,稳定版本的Nginx是1.8.0:

  1. NGINX_VERSION=1.8.0

3.从其官方网站使用wget下载Nginx源码:

  1. wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz

4.解压nginx压缩包

  1. tar -xvzf nginx-${NGINX_VERSION}.tar.gz

5.解压源码后,进入nginx目录

  1. cd nginx-${NGINX_VERSION}/

6.接下来,使用PageSpeed模块编译Nginx:

  1. ./configure –add-module=$HOME/ngx_pagespeed-release-${NPS_VERSION}-beta

7.准备编译

  1. make

8.执行以下命令,安装Nginx与Pagespeed模块:

  1. sudo make install

配置Nginx ngx_pagespeed

1.Pagespeed需要一个新目录,以便存储压缩的CSS和javascript的缓存:

  1. sudo mkdir /var/ngx_pagespeed_cache

2.您需要更改文件夹的所有权,以便Web服务器可以写入此目录:

  1. sudo chown www-data:www-data /var/ngx_pagespeed_cache

3.你需要添加一些新的代码在Nginx配置文件以激活该模块:

  1. sudo nano /usr/local/nginx/conf/nginx.conf

4.然后,您需要将以下代码添加到要启用PageSpeed模块的server块:
/usr/local/nginx/conf/nginx.conf:

  1. pagespeed on;
  2. pagespeed FileCachePath /var/ngx_pagespeed_cache;
  3. location ~ ".pagespeed.([a-z].)?[a-z]{2}.[^.]{10}.[^.]+" {
  4.  add_header "" "";
  5. }
  6. location ~ "^/pagespeed_static/" { }
  7. location ~ "^/ngx_pagespeed_beacon$" { }

还要确保Nginx作为www-data运行。 在conf文件的顶部,取消user注释并用www-data替换nobody。

启动Nginx

1.已完成配置,启动web服务器

  1. sudo /usr/local/nginx/sbin/nginx

2.停止web服务器

  1. sudo /usr/local/nginx/sbin/nginx -s stop

检查模块是否工作

您已编译并配置模块。 您可能需要在部署应用程序之前检查模块是否正常工作。 在本地计算机(即您的计算机)的终端上执行以下命令:

  1. curl -I website_url_or_IP_adress

你会在响应中看到类似X-Page-Speed:1.9.32.6的东西。 这意味着您已经在您的服务器上成功安装了ngx_pagespeed。

Nginx服务器性能调优

Worker

相关worker设置比较简单,只需要设置正确的数量。

Worker Processes

如果您的站点流量不大,Nginx,数据库和Web应用程序都运行在同一台服务器上。则在/etc/nginx/nginx.conf中,设置worker_processes 1;
如果您的站点流量比较大或者服务器只运行了Nginx,请为每个CPU核心设置一个工作线程:worker_processes auto;
如果你想手动设置,你可以使用grep ^processor /proc/cpuinfo | wc -l来查找服务器的cpu线程数。

Worker Connections

worker_connections选项设置每个worker进程一次可以处理的最大连接数。 默认情况下,worker连接限制为512,但系统可以处理比这值更多的连接。
适当的值可以通过测试得出。 系统的核心限制也可以通过使用ulimit找到:

  1. ulimit -n

输出:

  1. 65536

您还可以设置使用epoll,一个可扩展的I/O事件通知机制来触发事件,确保充分利用I/O性能。
最后,您可以使用multi_accept使worker一次接受所有新连接。
设置如下:

  1. events {
  2.     worker_connections 66536;
  3.     use epoll;
  4.     multi_accept on;
  5. }

HTTP和TCP优化

Keep Alive

Keep alive能减少浏览器重新连接的次数。
keepalive_timeout和keepalive_requests控制保持活动设置。
sendfile优化Nginx提供文件系统的静态文件服务的性能,如logo。
tcp_nodelay允许Nginx使TCP发送多个缓冲区作为单独的数据包。
tcp_nopush通过激活TCP堆栈中的TCP_CORK选项来优化一次向下游发送的数据量。 TCP_CORK阻塞数据,直到分组到达MSS,这等于MTU减去IP报头的40或60字节。
/etc/nginx/nginx.conf

  1. keepalive_timeout 65;
  2. keepalive_requests 100000;
  3. sendfile on;
  4. tcp_nopush on;
  5. tcp_nodelay on;

Buffer Size

调整缓冲区大小可能是有利的。 如果缓冲区大小太低,那么Nginx将写入一个临时文件。 这将导致过多的磁盘I/O。
client_body_buffer_size处理客户端缓冲区大小。 大多数客户端缓冲区都来自POST方法表单提交。 128k通常是此设置的不错选择。
client_max_body_size设置最大body缓冲区大小。 如果请求中的大小超过配置的值,则会将413(请求实体过大)错误返回给客户端。 不过浏览器无法正确显示413错误。 将大小设置为0将禁用对客户机请求正文大小的检查。
client_header_buffer_size处理客户端头大小。 默认情况下,1k通常是一个合理的选择。
large_client_header_buffers设置客户端头的缓冲区的最大数量和大小。 4个报头与4k缓冲区应该足够了。
output_buffers设置用于从磁盘读取响应的缓冲区的数量和大小。 如果可能,客户端数据的传输将被推迟,直到Nginx至少具有要发送的数据的字节数的集合大小。 零值禁止推迟数据传输。
/etc/nginx/nginx.conf:

  1. client_body_buffer_size      128k;
  2. client_max_body_size         10m;
  3. client_header_buffer_size    1k;
  4. large_client_header_buffers  4 4k;
  5. output_buffers               1 32k;
  6. postpone_output              1460;

连接队列

可以更改/etc/sysctl.conf文件中的某些指令,以便为连接和buckets设置Linux队列的大小。 更新net.core.somaxconn和net.ipv4.tcp_max_tw_buckets会更改等待Nginx接受的连接的队列大小。 如果内核日志中有错误消息,请增加该值,直到错误消失。
/etc/sysctl.conf:

  1. net.core.somaxconn = 65536
  2. net.ipv4.tcp_max_tw_buckets = 1440000

可以通过使用net.core.netdev_max_backlog标记设置最大积压量,将数据包缓存在网卡中,然后交给CPU。 有关更改此值的建议,请参阅网卡文档。

超时

超时设置还可以大幅提高性能。
client_body_timeout指令设置服务器等待客户端完成发送body的最大时间。
client_header_timeout指令设置服务器等待客户端完成发送header的最大时间。
sent_timeout指定对客户端的响应超时。 此超时不适用于整个传输,而是仅应用于两个后续的客户端读取操作之间。 因此,如果客户端没有读取任何数据这段时间,那么Nginx关闭连接。
/etc/nginx/nginx.conf:

  1. client_header_timeout  3m;
  2. client_body_timeout    3m;
  3. send_timeout           3m;

静态资源服务

如果您的网站提供静态资源(如CSS/JavaScript/images),Nginx可以缓存这些文件很短的时间。 在配置块中添加这个命令会告诉Nginx缓存1000个文件30秒,不包括在20秒内未被访问的任何文件,只有5倍或更多的文件。 如果你不经常部署,你可以安全地把这些数字调得更高。
/etc/nginx/nginx.conf:

  1. open_file_cache max=1000 inactive=20s;
  2. open_file_cache_valid 30s;
  3. open_file_cache_min_uses 5;
  4. open_file_cache_errors off;

您还可以缓存特定位置的资源。 缓存文件很长时间是有好处的,尤其是如果文件由版本控制系统管理。
/etc/nginx/nginx.conf

  1. location ~* .(woff|eot|ttf|svg|mp4|webm|jpg|jpeg|png|gif|ico|css|js)$ {
  2.     expires 365d;
  3. }

Gzip压缩内容

对于纯文本的内容,Nginx可以使用gzip压缩将这些资源返回给客户端。 现代的网络浏览器都支持gzip压缩的内容,这将减少网络传输的字节数。 下面的列表是可压缩内容类型的“安全”列表; 但是,您只需要启用您在Web应用程序中使用的内容类型。

/etc/nginx/nginx.conf:

  1. gzip on;
  2. gzip_min_length 1000;
  3. gzip_types: text/html application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon;
  4. gzip_disable "MSIE [1-6].";

文件系统优化

临时端口

当Nginx充当代理时,到上游服务器的每个连接使用临时或短暂的端口。
ip_local_port_range定义端口范围值。 常见设置为

  1. net.ipv4.ip_local_port_range 1024 65000。

tcp_fin_timeout指定端口必须处于非活动状态才能重用于其他连接的时间。 默认值通常为60秒,但通常可以安全地减少到30或甚至15秒:

  1. net.ipv4.tcp_fin_timeout 15

最大Backlog Packets设置

net.ipv4.tcp_max_syn_backlog设置保留在Backlog中的最大数据包数量,超过后内核会丢弃。 正常值为net.ipv4.tcp_max_syn_backlog = 3240000。

文件描述符

文件描述符是用于处理诸如连接和打开文件等操作系统资源。 Nginx每个连接最多可以使用两个文件描述符。 例如,如果它是代理,通常有一个文件描述符用于客户端连接,另一个用于连接到代理服务器,不过如果使用HTTP keep alives,这个比率要低得多。 对于需要服务大量连接的系统,可能需要调整这些设置。
sys.fs.file max定义文件描述符的系统范围限制。 nofile定义用户文件描述符限制,在/etc/security/limits.conf文件中设置。
/etc/security/limits.conf:

  1. soft nofile 4096
  2. hard nofile 4096

示例文件

/etc/sysctl.conf:

  1. net.core.somaxconn = 65536
  2. net.ipv4.tcp_max_tw_buckets = 1440000
  3. net.ipv4.ip_local_port_range = 1024 65000
  4. net.ipv4.tcp_fin_timeout = 15
  5. net.ipv4.tcp_window_scaling = 1
  6. net.ipv4.tcp_max_syn_backlog = 3240000

/etc/security/limits.conf:

  1. soft nofile 4096
  2. hard nofile 4096

nginx.conf:

  1. pid /var/run/nginx.pid;
  2. worker_processes  2;
  3.     
  4. events {
  5.     worker_connections   65536;
  6.     use epoll;
  7.     multi_accept on;
  8. }
  9.     
  10. http {
  11.     keepalive_timeout 65;
  12.     keepalive_requests 100000;
  13.     sendfile         on;
  14.     tcp_nopush       on;
  15.     tcp_nodelay      on;
  16.         
  17.     client_body_buffer_size    128k;
  18.     client_max_body_size       10m;
  19.     client_header_buffer_size    1k;
  20.     large_client_header_buffers  4 4k;
  21.     output_buffers   1 32k;
  22.     postpone_output  1460;
  23.         
  24.     client_header_timeout  3m;
  25.     client_body_timeout    3m;
  26.     send_timeout           3m;
  27.         
  28.     open_file_cache max=1000 inactive=20s;
  29.     open_file_cache_valid 30s;
  30.     open_file_cache_min_uses 5;
  31.     open_file_cache_errors off;
  32.         
  33.     gzip on;
  34.     gzip_min_length  1000;
  35.     gzip_buffers     4 4k;
  36.     gzip_types       text/html application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon;
  37.     gzip_disable "MSIE [1-6].";
  38.  
  39.     # [ debug | info | notice | warn | error | crit | alert | emerg ]
  40.     error_log  /var/log/nginx.error_log  warn;
  41.         
  42.     log_format main      ‘$remote_addr – $remote_user [$time_local]  ‘
  43.       ‘"$request" $status $bytes_sent ‘
  44.       ‘"$http_referer" "$http_user_agent" ‘
  45.         ‘"$gzip_ratio"’;
  46.  
  47.     log_format download  ‘$remote_addr – $remote_user [$time_local]  ‘
  48.       ‘"$request" $status $bytes_sent ‘
  49.       ‘"$http_referer" "$http_user_agent" ‘
  50.         ‘"$http_range" "$sent_http_content_range"’;
  51.         
  52.     map $status $loggable {
  53.         ~^[23]  0;
  54.         default 1;
  55.     }
  56.         
  57.     server {
  58.         listen        127.0.0.1;
  59.         server_name   127.0.0.1;
  60.         root         /var/www/html;
  61.         access_log   /var/log/nginx.access_log  main;
  62.             
  63.         location / {
  64.             proxy_pass         http://127.0.0.1/;
  65.             proxy_redirect     off;
  66.             proxy_set_header   Host             $host;
  67.             proxy_set_header   X-Real-IP        $remote_addr;
  68.             proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
  69.             proxy_connect_timeout      90;
  70.             proxy_send_timeout         90;
  71.             proxy_read_timeout         90;
  72.             proxy_buffer_size          4k;
  73.             proxy_buffers              4 32k;
  74.             proxy_busy_buffers_size    64k;
  75.             proxy_temp_file_write_size 64k;
  76.             proxy_temp_path            /etc/nginx/proxy_temp;
  77.         }
  78.             
  79.         location ~* .(woff|eot|ttf|svg|mp4|webm|jpg|jpeg|png|gif|ico|css|js)$ {
  80.             expires 365d;
  81.         }
  82.     }
  83. }

Ubuntu 12.04 (Precise Pangolin)安装Nginx PHP FastCGI

nginx web服务器是一个快速,轻量级的服务器,旨在有效地处理低流量和高流量网站的需求。 虽然通常用于提供静态内容,但它也能够处理动态页面。 本文说明如何在Ubuntu 12.04 LTS(Precise Pangolin)Linux服务器上安装 Nginx PHP FastCGI。

安装所需软件包

执行以下命令更新系统并安装nginx Web服务器,PHP和编译器工具:

  1. apt-get update
  2. apt-get upgrade
  3. apt-get install nginx php5-cli php5-cgi spawn-fcgi psmisc

配置虚拟主机

创建目录

在本指南中,域“example.com”用作示例网站。 您应该在后续的配置步骤中替换您自己的域名。 首先,创建保存内容和日志文件的目录:

  1. mkdir -p /srv/www/www.example.com/public_html
  2. mkdir /srv/www/www.example.com/logs
  3. chown -R www-data:www-data /srv/www/www.example.com

UNIX套接字配置示例

接下来,您需要定义网站的虚拟主机文件。 此示例使用UNIX套接字连接到fcgiwrap。 请务必将“example.com”的所有实例更改为您的域名。
/etc/nginx/sites-available/www.example.com

  1. server {
  2.     server_name www.example.com example.com;
  3.     access_log /srv/www/www.example.com/logs/access.log;
  4.     error_log /srv/www/www.example.com/logs/error.log;
  5.     root /srv/www/www.example.com/public_html;
  6.  
  7.     location / {
  8.         index  index.html index.htm;
  9.     }
  10.  
  11.     location ~ .php$ {
  12.         include /etc/nginx/fastcgi_params;
  13.         fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
  14.         fastcgi_index index.php;
  15.         fastcgi_param SCRIPT_FILENAME /srv/www/www.example.com/public_html$fastcgi_script_name;
  16.     }
  17. }

创建一个名为/usr/bin/php-fastcgi的文件,包含以下内容:

/usr/bin/php-fastcgi

  1. #!/bin/bash
  2.  
  3. FASTCGI_USER=www-data
  4. FASTCGI_GROUP=www-data
  5. SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
  6. PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid
  7. CHILDREN=6
  8. PHP5=/usr/bin/php5-cgi
  9.  
  10. /usr/bin/spawn-fcgi -s $SOCKET -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5

增加执行权限

  1. chmod +x /usr/bin/php-fastcgi

TCP套接字配置示例

或者,您可能希望使用TCP套接字。 如果是这样,请按如下示例修改nginx虚拟主机配置文件。 同样,请确保将“example.com”的所有实例替换为您的域名。
/etc/nginx/sites-available/www.example.com

  1. server {
  2.     server_name www.example.com example.com;
  3.     access_log /srv/www/www.example.com/logs/access.log;
  4.     error_log /srv/www/www.example.com/logs/error.log;
  5.     root /srv/www/www.example.com/public_html;
  6.  
  7.     location / {
  8.         index  index.html index.htm;
  9.     }
  10.  
  11.     location ~ .php$ {
  12.         include /etc/nginx/fastcgi_params;
  13.         fastcgi_pass 127.0.0.1:9000;
  14.         fastcgi_index index.php;
  15.         fastcgi_param SCRIPT_FILENAME /srv/www/www.example.com/public_html$fastcgi_script_name;
  16.     }
  17. }

创建一个名为/usr/bin/php-fastcgi的文件,包含以下内容:

  1. #!/bin/bash
  2.  
  3. FASTCGI_USER=www-data
  4. FASTCGI_GROUP=www-data
  5. ADDRESS=127.0.0.1
  6. PORT=9000
  7. PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid
  8. CHILDREN=6
  9. PHP5=/usr/bin/php5-cgi
  10.  
  11. /usr/bin/spawn-fcgi -a $ADDRESS -p $PORT -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5

增加执行权限:

  1. chmod +x /usr/bin/php-fastcgi

激活启动服务

执行如下命令激活网站

  1. cd /etc/nginx/sites-enabled/
  2. ln -s /etc/nginx/sites-available/www.example.com

创建一个名为/etc/init.d/php-fastcgi的文件,包含以下内容:
/etc/init.d/php-fastcgi:

  1. #!/bin/bash
  2.  
  3. PHP_SCRIPT=/usr/bin/php-fastcgi
  4. FASTCGI_USER=www-data
  5. FASTCGI_GROUP=www-data
  6. PID_DIR=/var/run/php-fastcgi
  7. PID_FILE=/var/run/php-fastcgi/php-fastcgi.pid
  8. RET_VAL=0
  9.  
  10. case "$1" in
  11.     start)
  12.       if [[ ! -d $PID_DIR ]]
  13.       then
  14.         mkdir $PID_DIR
  15.         chown $FASTCGI_USER:$FASTCGI_GROUP $PID_DIR
  16.         chmod 0770 $PID_DIR
  17.       fi
  18.       if [[ -r $PID_FILE ]]
  19.       then
  20.         echo "php-fastcgi already running with PID `cat $PID_FILE`"
  21.         RET_VAL=1
  22.       else
  23.         $PHP_SCRIPT
  24.         RET_VAL=$?
  25.       fi
  26.   ;;
  27.     stop)
  28.       if [[ -r $PID_FILE ]]
  29.       then
  30.         kill `cat $PID_FILE`
  31.         rm $PID_FILE
  32.         RET_VAL=$?
  33.       else
  34.         echo "Could not find PID file $PID_FILE"
  35.         RET_VAL=1
  36.       fi
  37.   ;;
  38.     restart)
  39.       if [[ -r $PID_FILE ]]
  40.       then
  41.         kill `cat $PID_FILE`
  42.         rm $PID_FILE
  43.         RET_VAL=$?
  44.       else
  45.         echo "Could not find PID file $PID_FILE"
  46.       fi
  47.       $PHP_SCRIPT
  48.       RET_VAL=$?
  49.   ;;
  50.     status)
  51.       if [[ -r $PID_FILE ]]
  52.       then
  53.         echo "php-fastcgi running with PID `cat $PID_FILE`"
  54.         RET_VAL=$?
  55.       else
  56.         echo "Could not find PID file $PID_FILE, php-fastcgi does not appear to be running"
  57.       fi
  58.   ;;
  59.     *)
  60.       echo "Usage: php-fastcgi {start|stop|restart|status}"
  61.       RET_VAL=1
  62.   ;;
  63. esac
  64. exit $RET_VAL

启动php-fastcgi和nginx:

  1. chmod +x /etc/init.d/php-fastcgi
  2. update-rc.d php-fastcgi defaults
  3. /etc/init.d/php-fastcgi start
  4. /etc/init.d/nginx start