首页 > 代码库 > nginx + apache 做端口(转发)

nginx + apache 做端口(转发)

nginx + apache 做端口转发

 
    最近公司需要搭建一个内容管理系统,用的框架是dedecms,没有多考虑,首选的就是apache,因为公司的服务器是centos,所以一通折腾之后安装好了apache,php,以及各种模块及依赖库。      在安装好之后启动apache,发现无法启动,说是80端口被占用,经过netstat -anp | grep 80 之后发现是ngnix占用了该端口。因为这台服务器一直在使用nginx + unicorn 来跑rails项目,所以这个nginx是万万不能停掉的,怎么办?      1、修改apache启动时的默认端口,找到apache的配置文件(httpd.conf),将Listen 80 改为 Listen 8080 保存退出,然后重启apache,这个时候发现apache已经启动了,ok,到此为止,端口冲突问题解决了      2、接下来,访问项目目录:117.79.111.xx:8080,你会发现无法访问到apache的跟路径。      3、配置防火墙,让8080可以让外网进行访问。打开防火墙配置文件/etc/sysconfig/iptables,在这个文件里面你会发现一个关于80端口的配置:-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT  这个是服务器开启的默认端口,允许外网进行访问的,那么如果我们想让8080端口允许外网访问的话,那么我们就在这一句的下面加上-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT,保存退出,然后重启防火墙,这个时候我们在通过117.79.111.xx:8080来访问的话,你会发现已经可以访问apache根路径了,如果反问我们的项目的话,我们要加入项目路径(比如说是dedecms),那么我们就要这样117.79.111.xx:8080/dedecms。      4、我们发现每次访问项目的话,都要使用ip加端口,再加项目目录的形式才能访问,这无疑是危险的,并且是很傻的,接下来我们配置apache文件,使用域名代替ip来实现项目的访问,如下:找到apache配置文件httpd.conf,在文件的最后添加一下内容 
Php代码  
  1. <VirtualHost *:8080>  
  2.   ServerName   cms.xxx.com  
  3.   DocumentRoot /var/www/dedecms  
  4.   <Directory />  
  5.     Options FollowSymLinks  
  6.     AllowOverride None  
  7.   </Directory>  
  8.   <Directory /var/www/dedecms>  
  9.     Options Indexes FollowSymLinks MultiViews  
  10.     AllowOverride None  
  11.     Order allow,deny  
  12.     allow from all  
  13.   </Directory>  
  14.   
  15.   ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/  
  16.   <Directory "/usr/lib/cgi-bin">  
  17.     AllowOverride None  
  18.     Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch  
  19.     Order allow,deny  
  20.     Allow from all  
  21.   </Directory>  
  22.   ErrorLog ${APACHE_LOG_DIR}/zuzher_cms_error.log  
  23.   # Possible values include: debug, info, notice, warn, error, crit,  
  24.   # alert, emerg.  
  25.   LogLevel warn  
  26.   CustomLog ${APACHE_LOG_DIR}/access.log combined  
  27.   Alias /doc/ "/usr/share/doc/"  
  28.   <Directory "/usr/share/doc/">  
  29.     Options Indexes MultiViews FollowSymLinks  
  30.     AllowOverride None  
  31.     Order deny,allow  
  32.     Deny from all  
  33.   </Directory>  
  34. </VirtualHost>  
    保存退出,然后重启apache,访问 http://cms.xxx.com:8080,你会发现我们的项目已经可以通过域名来访问了。      5、虽然到上面为止我们可以通过域名正确的访问项目了,但是问题是,我们每次都要输入8080的端口号才能正确访问,这个着实不爽,要怎么办呢。还记得我刚开始说的,项目中有用nginx + unicorn 来跑rails么,只不过那样是使用nginx 做前端,unicorn做后端,然后通过代理的形式实现nginx 和unicorn之间的通讯。既然unicorn可以,那么apache一定也是可以的,接下来我们就用nginx 做前端,apache做后端,来实现这个端口转发的功能。上面的apache配置文件保持不动,接下来我们编辑nginx配置文件/usl/local/nginx/conf/nginx.conf 
Java代码  
  1. http {  
  2.     include       mime.types;  
  3.     default_type  application/octet-stream;  
  4.   
  5.   
  6.     sendfile        on;  
  7.   
  8.     keepalive_timeout  65;  
  9.   
  10.   
  11.     upstream app1_server {  
  12.   
  13.       server unix:/home/naitnix/workspace/app1/tmp/sockets/unicorn.sock fail_timeout=0;  
  14.   
  15.     }  
  16.   
  17.     upstream cms_server{  
  18.       server 117.79.111.xx:8080;  
  19.     }  
  20.   
  21.   
  22.     include       /usr/local/nginx/conf/services/app1.conf;  
  23.     include       /usr/local/nginx/conf/services/cms.conf;  
  24.       
  25. }  
    上面的app1_server是我们的rails项目,cms_server是我们现在要做的cms的配置。这里我们指定我们服务器的地址和端口号。然后你可以看见我include了两个项目的配置文件,这是为了方便项目管理,我新建了一个servers目录,所有的项目配置信息都放到了这个里面。其中app1.conf是我们的rails的项目配置文件,而cms.conf则是我们这个cms项目要用到的,接下来我们进入这个cms文件,来编辑里面的内容: 
Java代码  
  1. server {  
  2.     listen       80;  
  3.     server_name  cms.xxx.com;  
  4.   
  5.     location / {  
  6.   
  7.       proxy_redirect off;  
  8.   
  9.       proxy_set_header Host $host;  
  10.   
  11.       proxy_set_header X-Forwarded-Host $host;  
  12.   
  13.       proxy_set_header X-Forwarded-Server $host;  
  14.   
  15.       proxy_set_header X-Real-IP $remote_addr;  
  16.   
  17.       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  18.   
  19.       proxy_buffering on;  
  20.   
  21.       proxy_pass http://cms_server;#这里指定上面的cms_server de upstream  
  22.   
  23.     }  
  24.   
  25.     error_page   500 502 503 504  /50x.html;  
  26.     location = /50x.html {  
  27.         root   html;  
  28.     }  
  29.   
  30. }  
    保存,并重启nginx,然后我们访问我们的cms.xxx.com,这个时候你会发现我们不用输入8080端口号就可以访问我们的项目了。这样nginx将请求转发到apache 的8080端口来实现我们访问8080端口的目的。      以上写的比较草率,很多细节地方我没有提到,希望能给各位提供帮助,也希望各位能提宝贵意见,谢谢。      参考文章:      http://www.sqlstudy.com/article/nginx-proxy-apache-configure.html      http://www.imhdr.com/nginx/to-configure-nginx-front-end-apache-backend-server/      http://wiki.octopusinfo.com/index.php/Linux%E6%8A%80%E5%B7%A7:%E7%BD%91%E7%AB%99%E7%AF%87:Nginx_%E8%BD%AC%E5%8F%91%E8%87%B3_Apache