教你成为全栈工程师(Full Stack Developer) 八-10行代码建起你的网站

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

小插曲1——开发模式与发布模式

我们做c开发或java开发都会提到debug和release,symfony2也是一样有debug和release,区别在于这么几点:

1. debug模式在执行出错时提示到页面上,release没有,这对调试程序非常有帮助

2. debug模式不用cache缓存,release用,开发时用debug可以避免改了代码不生效的奇怪问题

3. debug模式附加了问题分析工具小插件,在页面上可以看到,可以借助它做优化

4. debug模式访问的url一般是http://127.0.0.1/app_dev.php/***,release模式直接就是http://127.0.0.1/***

 

小插曲2——日志目录和cache目录

日志目录一般在/data/httpdir/mywebsite/app/logs/目录下,cache目录一般在/data/httpdir/mywebsite/app/cache下

一般当我们代码升级用debug模式调试ok了之后,需要清理一下cache才能用release模式访问,清理方式有两种:

1.

[root@centos7vm mywebsite]# cd /data/httpdir/mywebsite
[root@centos7vm mywebsite]# php app/console cache:clear

2. 

[root@centos7vm mywebsite]# rm -rf /data/httpdir/mywebsite/app/cache/*

因为这两个目录是会在网站运行过程中写入内容的,所以需要把这两个目录的权限改成:

[root@centos7vm mywebsite]# chmod -R 777 /data/httpdir/mywebsite/app/cache/
[root@centos7vm mywebsite]# chmod -R 777 /data/httpdir/mywebsite/app/logs/

 

小插曲3——外网访问debug模式

debug模式默认只支持本地访问,不支持外部访问的,原因就是安全的考虑啦,那么对于我们在虚拟机里开发又想在宿主机访问(相当于外部访问)怎么才能开启debug模式呢?

修改/data/httpdir/mywebsite/web/app_dev.php文件,注释掉如下几行代码就好啦:

if (isset($_SERVER['HTTP_CLIENT_IP'])
    || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
    || !(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1')) || php_sapi_name() === 'cli-server')
) {
    header('HTTP/1.0 403 Forbidden');
    exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}

下面在宿主机访问虚拟机的ip试一下,比如我的虚拟机ip是172.16.142.130,那么访问效果如下:

 

小插曲4——什么是Bundle

bundle英文释义是捆,也就是把一些内容捆绑在一起的意思,在symfony2中它就相当于一个组件,各种自带的组件也都是以bundle形式组织的,我们自己开发的内容也可以组织成bundle,便于复用。bundle里一般包含MVC的所有内容以及Resource和config

 

做一个静态页面

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

进入到/data/httpdir/mywebsite/app/Resources/views/目录并创建一个blog目录,并在blog里创建list.html.twig文件内容如下:

 

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>MyWebSite</title>
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
<!-- 可选的Bootstrap主题文件(一般不用引入) -->
<link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</head>
<body>
<div class="row bg-primary">
    <div class="col-sm-1 col-xs-1"></div>
    <div class="col-sm-11 col-xs-11"><h1><a href="" style="text-decoration: none;color: white;">MyWebSite</a></h1></div>
</div>
<div class="row jumbotron">
    <div class="col-md-1 col-xs-1"></div>
    <div class="col-md-10 col-xs-10"><h1>Welcome to MyWebSite!</h1></div>
    <div class="col-md-1 col-xs-1"></div>
</div>
</body>
</html>

修改/data/httpdir/mywebsite/app/config/routing.yml文件,添加如下行:

blog_list:
    path:     /bloglist/
    defaults: { _controller: AppBundle:Blog:list }

 

创建/data/httpdir/mywebsite/src/AppBundle/Controller/BlogController.php文件内容如下:

<?php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class BlogController extends Controller
{
    public function listAction(Request $request)
    {
        return $this->render('blog/list.html.twig');
    }
}

下面访问http://172.16.142.130/app_dev.php/bloglist/看下效果

 

 

欣赏一下你的高大上的网站吧

 

讲解一下symfony2里的MVC

 

注:本节内容只包括了MVC里的V和C,下一节会涉及到M的部分

先从app/config/routing.yml说起,这里面定义了网站不同的url路径所对应的controller,比如

blog_list:
    path:     /bloglist/
    defaults: { _controller: AppBundle:Blog:list }

blog_list:表示这个配置组名字叫做blog_list(名字其实无所谓,只要不和其他组起成相同名字就行)

path:网站后面的url路径,比如/bloglist/指的就是http://127.0.0.1/bloglist

defaults:访问bloglist路径时响应你的controller是谁,这里设置的是执行AppBundler下的BlogController的listAction方法

 

接下来就看这个AppBundler下的BlogController(这就是MVC里的C)的listAction方法干了什么,打开src/AppBundle/Controller/BlogController.php文件,方法如下:

    public function listAction(Request $request)
    {
        return $this->render('blog/list.html.twig');
    }

render的含义是显示/渲染/输出,也就是说这个action要用blog/list.html.twig这个模板的内容来返回给你数据展示出来

 

下面继续看blog/list.html.twig(这就是MVC里的V),这是一个静态html文件,具体标签含义可以尽情百度一下,涉及到的一些前端知识后面章节也会详细讲,大体内容就是:展示一个菜单栏和一个大宣传文本

 

留个悬念:为什么这个静态网页一定要以twig作为扩展名呢?预知原因如何,且听下回分解。

教你成为全栈工程师(Full Stack Developer) 七-带你进入神奇的symfony世界

安装symfony2

 

我们默认你使用的是centos7操作系统并已经安装好了php和nginx(如果还没有请回过头看前面几篇)。

首先,我们来安装symfony安装器。假设我们要安装到/usr/local/bin下,那么执行

sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony
sudo chmod a+x /usr/local/bin/symfony

执行一下symfony命令看看是否正常显示帮助信息

下面找到一个放置自己网站的目录,比如/data/httpdir/,创建好目录后,在httpdir下执行如下命令下载并初始化网站目录

[root@centos7vm httpdir]# symfony new mywebsite 2.8

这里的2.8是symfony2的版本,现在已经发布到3了,但一些流行的组件兼容性可能不好,所以依然用最稳定的2.8版

 

《《《《《《《《《《《《《《《《《《《《《《《《《《《

创建mywebsite时你可能会遇到这样的警告

PHP Warning:  date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. blublu...

这是因为你的php.ini文件没有指定时区,修改/etc/php.ini文件,把

;date.timezone =

改成

date.timezone = Asia/Shanghai

注意:要去掉前面的";"

重启php-fpm

[root@centos7vm httpdir]# service php-fpm restart

》》》》》》》》》》》》》》》》》》》》》》》》》》

 

有没有发现在httpdir目录下出现了mywebsite目录?走进去瞧瞧symfony2已经为你做了什么

[root@centos7vm mywebsite]# ls
app  bin  composer.json  composer.lock  README.md  src  vendor  web

web目录是网站的入口,假设你的网站叫做www.lcsays.com,那么www.lcsays.com/test.php一般会通过nginx配置为对应web/test.php文件(当然这都需要你的ngixn配置文件配合,如果你非要配置成web目录的上一级也可以,只不过网站不能用而已,呵呵)。一般会把可以通过url访问的文件放到这里,比如css、js、图片、静态html文件等

app目录是全局应用的运行相关文件(包括入口函数、组件加载、全局配置、log文件、cache文件等),这里面还有一个重要二进制文件console,用来方便我们做自动化操作,后面会讲到

src是你自己开发php代码的地方,一般以组件形式整理,symfony2里叫做bundle,一会再说bundle是什么

vendor是symfony2自带组件放置的地方,也是最庞大的地方,一般不需要我们修改里面的内容,使用里面哪个功能就可以在app目录下的配置文件里配置,不使用也无妨,缺什么组件也可以手工安装组件到vendor下,安装方法马上便知

bin目录里是symfony2提供给我们的一些二进制工具

composer.json是这个网站工程里用到symfony2中组件的配置和版本等信息

 

好!什么都不用改,我们现在去改下nginx的配置,让网站指向web目录,这里需要看一下如何配置nginx实现虚拟主机

nginx.conf如下:

user  nobody;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    client_max_body_size 20M;
    include /etc/nginx/conf.d/*.conf;
}

mywebsite.conf如下:

log_format logformat '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
    listen       80;
    server_name  172.16.142.130;
    index app.php;
    root /data/httpdir/mywebsite/web;
    location / {
        if (!-e $request_filename){
            rewrite ^/(.+)$ /app.php/$1 last;
        }
        client_max_body_size 20M;
    }
    location ~ ^/(app|app_dev)\.php(/|$) {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  HTTPS              off;
        client_max_body_size 20M;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires 1h;
        client_max_body_size 20M;
    }
    access_log /data/httpdir/logs/mywebsite.log logformat;
    error_log /data/httpdir/logs/mywebsite.error_log;
}

因为系统自带的service命令起动服务有些无法理解的现象,所以我们以后都采取直接启动nginx,强制杀掉所有nginx进程后,执行

[root@centos7vm mywebsite]# nginx

以后如果想重启nginx可以用命令

[root@centos7vm mywebsite]# nginx -s restart

其实如果只是改配置,可以调用reload命令

[root@centos7vm mywebsite]# nginx -s reload

 

为了简单,把php-fpm的子进程用户也改到nobody,修改/etc/php-fpm.d/www.conf,把里面的

; RPM: apache Choosed to be able to access some dir as httpd
user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache

改成

; RPM: apache Choosed to be able to access some dir as httpd
user = nobody
; RPM: Keep a group allowed to write in log dir.
group = nobody

因为系统自带的service命令起动服务有些无法理解的现象,所以我们以后都采取直接启动php-fpm,强制杀掉所有php-fpm进程后,执行

[root@centos7vm mywebsite]# php-fpm

以后如果想重启php-fpm可以用命令:

[root@centos7vm mywebsite]# kill -USR2 `cat /var/run/php-fpm/php-fpm.pid`

 

OK,现在可以打开http://127.0.0.1/啦,看到了什么?

 

恭喜你,你已经进入了神奇的symfony2的世界

如何配置nginx实现虚拟主机

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

nginx安装好之后一般会在/etc/nginx/目录下有nginx.conf文件和conf.d目录,这其实已经帮我们预留了虚拟主机要准备的内容。

 

看下nginx.conf文件,里面有这样一行:

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

 

那么也就是说ngixn启动都会自动加载conf.d目录下以.conf结尾的所有配置文件

 

ok,我们直接干掉nginx.conf里面server组的全部内容,只留几句重要内容,像这样:

 

user  nginx;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    client_max_body_size 20M;
    include /etc/nginx/conf.d/*.conf;
}

 

同时在conf.d下创建mywebsite.conf文件,内容如下:

log_format logformat '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
    listen       80;
    server_name  localhost;
    index index.html;
    root /data/httpdir/mywebsite/web;
    access_log /data/httpdir/logs/mywebsite.log logformat;
    error_log /data/httpdir/logs/mywebsite.error_log;
}

创建/data/httpdir/mywebsite/web/index.html文件内容如下:

<html>
<body>
<h1>hello world!</h1>
</body>
</html>

创建/data/httpdir/logs目录,并修改权限:

chmod -R 777 /data/httpdir/logs/

 

执行

[root@centos7vm nginx]# service nginx restart

重启ngxin,如果发现重启不了,很有可能是service有问题,见这个帖子http://www.oschina.net/question/139930_228663

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

所以干脆直接执行ngxin来启动nginx服务就没问题了,如下:

[root@centos7vm nginx]# nginx

可以看到进程已经存在了:

[root@centos7vm nginx]# ps aux|grep nginx
root      12775  0.0  0.1 109552  1980 ?        Ss   07:14   0:00 nginx: master process nginx
nginx     12776  0.0  0.3 109960  3044 ?        S    07:14   0:00 nginx: worker process

这时访问:http://localhost/如下

 

虚拟主机现在刚刚实现了一个站点,让我们再创建一个,复制mywebsite.conf到mywebsite2.conf,内容改成:

log_format logformat2 '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
    listen       80;
    server_name  localhost2;
    index index.html;
    root /data/httpdir/mywebsite2/web;
    access_log /data/httpdir/logs/mywebsite2.log logformat2;
    error_log /data/httpdir/logs/mywebsite2.error_log;
}

 

注意:这里listen端口不变,server_name做了修改,log_format做了修改(不然会认为命名重复),root目录做了修改,日志文件名做了修改

 

为了能让本机识别出localhost2对应的是哪个ip,我们修改/etc/hosts文件,添加一行

127.0.0.1   localhost2

 

同时我们还需要创建网页文件,创建/data/httpdir/mywebsite2/web目录并在web目录下创建index.html文件如下:

<html>
<body>
<h1>HaHa</h1>
</body>
</html>

 

重新加载nginx配置:

[root@centos7vm conf.d]# nginx -s reload

 

这时我们访问http://localhost2/,如下:

重新访问http://localhost/,依然是

这便是虚拟主机,同一个ip同一个端口,不用域名可以访问不同的网站

教你成为全栈工程师(Full Stack Developer) 六-总结php框架的功能

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

什么是php框架?

 

php框架就是把php开发过程中通用而繁琐的部分抽象出来,约定出一些固定的套路来供你配置,这样协作开发的人也更容易相互理解。

 

所有php框架一般都包含以下内容:model、视图(view)、控制器(controller)、路由(router)、工具集、扩展组件。

 

model:就是数据库表的类表达,这个class对应着数据库表结构,比如数据库表里有一列叫做name,那么这个类就有一个成员变量name,当然model可以附加getters和setters以及其他自己实现的方便操作的成员函数。框架抽象出model的目的是让我们像对待内存中的变量一样对待数据库表,这样我们就不用关注数据库了

 

视图:就是展现给用户的部分,通常是网页(html),比如要把某个model的某个成员值展现出来,那么就传给视图来通过html显示出来。当然样式也是在视图里面实现的。为了开发的方便性,视图一般结合着模板使用

 

模板:模板包含三部分内容,一个是视图的继承,一个是传递变量,一个执行逻辑。视图继承就是我们可以写一个base模板,定义好通用的页面布局大框架,并把每个可定制的部分预留出接口来给子类视图实现。传递变量的功能实现了从php到html的数据传递,比如在html里用<h1>{{ name }}</h1>来展示php里的name这个变量的值。执行逻辑就是定义了一些分支、循环等逻辑来动态输出html

 

控制器:控制器是用来实现业务逻辑的部分,控制器可以理解为事件触发时的执行逻辑,比如当你访问某个url(如: https://www.lcsays.com/bloglist/2)可以触发bloglist对应的控制器执行“列出博客列表”的逻辑,那么这个控制会怎么做呢?可能是这样的:它获取blog这个model里的所有数据,并把数据全部传给视图,而视图通过循环逻辑取出每个blog的name展示出来。

 

路由:就是定义了什么pattern的url对应执行哪个控制器逻辑,其实就是一个映射关系。除此之外还有变量传递、路由通配等功能。

 

工具集:除了上面有固定套路的部分之外就是一堆工具集了,这部分不同框架也不太一样,所以用着再说

 

扩展组件:一般框架都会配有一些扩展组件,当然强大的网友会帮你开发各种各样的组件,git上只有你想不到的,没有你找不到的。

 

都有哪些流行的php框架?

 

国外比较流行的php框架有laravel、symfony2、yii2等,国内比较流行的有phalcon、thinkphp、zend framework等。其实所有的php框架不外乎上面讲的几大部分,真正的业务逻辑都是得我们自己来实现。我个人用symfony2有一段时间了,相对比较熟悉,所以后续章节都以symfony2来带大家领略php的美妙。当然这里我也给symfony2打个广告,我当前发文章的博客网站就是用symfony2框架搭建的,功能包括:用户管理、新闻发布、分类管理和多媒体资源管理,自己开发的代码行数不到800行,其余全是用symfony2各种组件修改配置搭起来的,是不是amazing?

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

展示一下我的800行代码的网站效果

首页效果

文章列表页

文章详情页

底部评论(多说)

后台管理首页

后台管理类别管理

文章编辑

多媒体资源管理

用户管理

图片详情

 

教你成为全栈工程师(Full Stack Developer) 五-世界上最好的网站后端语言php

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

环境准备工作

 

打开我们的centos 7虚拟机,确保nginx已经安装好并启动了服务(在前面的教程里有安装和启动方法)。下面我们来安装php-fpm(php和nginx之间的一个桥梁),执行:

[root@centos7vm ~]# yum install php55w-fpm

执行

[root@centos7vm ~]# service php-fpm start

启动php-fpm服务

修改nginx配置来让nginx把php代码转发给php-fpm服务解析,修改文件/etc/nginx/nginx.conf里的server组后如下:

 

       location ~ \.php$ {
            root           /usr/share/nginx/php/;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

执行

[root@centos7vm ~]# service nginx reload

重新加载配置文件

顺便我们看一眼这个配置文件的其他部分来做一些解释:

error_log  /var/log/nginx/error.log
……
access_log  /var/log/nginx/access.log  main;

这些表示http访问日志的存放的地方

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

这一句表示你可以在conf.d目录下创建更多的网站配置文件(虚拟主机),nginx会自动加载进来

listen       80;表示监听http默认的80端口

root         /usr/share/nginx/html表示你所有网页文件存放的地方,nginx只会解析你放在这里的网页

location /.....表示当你访问https://www.lcsays.com/时服务器要怎样处理

location /path.....表示当你访问https://www.lcsays.com/path时服务器要怎样处理

        location ~ \.php$ {
            root           /usr/share/nginx/php/;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

这几行表示当你访问https://www.lcsays.com/*.php时,服务器会把对应找到的php文件转发给本机的9000端口(就是php-fpm监听的端口)来解析,并把解析好的内容发回给你

OK,大功告成,现在可以开始php之旅了

 

一句代码看清楚一切

 

在/usr/share/nginx/php/目录下创建一个php文件:index.php,内容如下:

<?php
phpinfo()
?>

这时打开浏览器访问127.0.0.1/index.php结果如何?

展示了php的信息

事实上这都是phpinfo这一句代码在起作用

 

ps:通过我本机的浏览器看虚拟机的网站为什么访问不了?

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

因为默认情况下centos 7会开启防火墙,导致外部ip无法访问,关闭防火墙方法如下:

[root@centos7vm php]# systemctl stop firewalld.service
[root@centos7vm php]# systemctl disable firewalld.service

 

假设你虚拟机ip地址是172.16.142.130那么在你主机浏览器里访问http://172.16.142.130就可以啦

 

看到这我还是不会写php啊!!

 

下面让我们来看看php的语法有多么的简单,一分钟你就学会了。我们来用php开发这样一个网页,网页显示一组倒数的数字,如果是偶数就把样式做成h1标题,如果是奇数就做成h3,如下:

<?php
$i=10;
for ($i=10; $i > 0; $i=$i-1)
{
    if ($i % 2 == 0)
    {
        echo "<h1>" . $i . "<h1>";
    }
    else
    {
        echo "<h3>" . $i . "<h3>";
    }
}
?>

整个效果是这样子的

 

现在是不是明白了php的工作原理了呢?php其实就是按照普通编程语言的逻辑来动态输出html标签,让他看起来像个静态html文件

 

php支持函数、类吗?

 

支持的,php函数像这样:

<?php
function writeMsg() {
  echo "Hello world!";
}
writeMsg(); // 调用函数
?>

 

php的类像这样:

 

class test
{ 
    var $b;
    function test() { $this->b=5; }
    function addab($c) { return $this->b+$c; }
}
$a = new test(); echo $a->addab(4); // 返回 9

有关php语言的更高级功能可以系统学习php教程,但个人觉得以上内容就足够了,遇到不会的直接百度

如何让mac自动设置wifi网络连接——mac终端脚本设置网络状态

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

我的问题场景

 

我的mac在公司可以接入wifi(慢)和网线(快),在家只能接wifi,所以整体策略就是优先选有线网,没有接线就开无线网。因为mac同事有有线网和无线网的时候会优先选择无线网连接,所以需要一个自动关wifi的脚本来帮我做这件事。

 

我的脚本是这样的

 

#!/bin/bash
# 如果检测到有usb口以太网连上,就自动关掉wifi,如果没有连就自动打开wifi
while true
do
    usbethcount=`networksetup -listallhardwareports|grep "Apple USB Ethernet Adapter"|wc -l`
    wifioffcount=`/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | grep "AirPort: Off" | wc -l`
    if [ $usbethcount -eq 1 ]; then
        # 如果usb有网络连接
        if [ $wifioffcount -ne 1 ]; then
            # 如果wifi开着呢
            networksetup -setairportpower en0 off
            date; echo "turn wifi off"
        fi
    else
        # 如果usb无网络连接
        if [ $wifioffcount -eq 1 ]; then
            # 如果wifi关着呢
            networksetup -setairportpower en0 on
            date; echo "turn wifi on"
        fi
    fi
    sleep 2
done >> /var/log/auto_usb_net.sh.log
exit 0

 

这里面比较重要的是两个命令,来获取当前的网络信息

 

networksetup -listallhardwareports

的执行结果如下:

 

Hardware Port: Apple USB Ethernet Adapter
Device: en4
Ethernet Address: 00:10:00:00:13:8d

Hardware Port: Wi-Fi Device: en0 Ethernet Address: a0:99:9b:0d:67:87

Hardware Port: Bluetooth PAN Device: en3 Ethernet Address: a0:99:9b:0d:67:88

可以看到我通过usb口接了有线网,同事有无线网接口(我这时候是关闭着无线网的),这条命令能看出有关网络的硬件有哪些,但是判断不了状态

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I 

的执行结果有如下两种:

 

关闭了wifi时

AirPort: Off

 

打开了wifi时

     agrCtlRSSI: -60
     agrExtRSSI: 0
    agrCtlNoise: -92
    agrExtNoise: 0
          state: running
        op mode: station
     lastTxRate: 878
        maxRate: 1300
lastAssocStatus: 0
    802.11 auth: open
      link auth: wpa2
          BSSID: 64:f6:9d🆎e8:8f
           SSID: BJHL
            MCS: 7
        channel: 161,80

 

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

那么我就是通过

networksetup -listallhardwareports

来判断网线有没有插入usb,并通过airport -I来判断wifi有没有打开,每隔2秒钟检测一次,时间间隔有点短,但是因为没有变动情况不会真正开关wifi,所以不占用极少资源

 

那么怎么才能开关wifi呢?

 

打开wifi

networksetup -setairportpower en0 on

 

关闭wifi

networksetup -setairportpower en0 off

 

OK,大功告成,再添加一些打印日志信息到/var/log/auto_usb_net.sh.log,就可以查看变化的日志啦!

 

那么这个脚本怎么才能启动呢?

 

手工执行的话直接nohup auto_usb_net.sh &压后台执行就行了

如果想开机自动启动可以百度一下开机自动启动的方法

教你成为全栈工程师(Full Stack Developer) 四-浏览器的那些事

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

浏览器都干了什么

 

用浏览器打开https://www.lcsays.com/,在网页空白处点右键选“显示网页源代码”,如下:

这才是网页的真正内容——一堆标签。浏览器向www.lcsays.com的网站服务器发送请求后,由网站服务器把这一堆标签发回给浏览器,浏览器就是根据这一堆标签的指令“渲染”成漂亮的页面的。

 

让我们换个视角重新看一遍这个过程。以google chrome浏览器为例,打开浏览器,从菜单里找到“开发者工具”(不同浏览器名称不一样),重新输入https://www.lcsays.com/打开,开发者工具中会展示多条链接的请求过程,第一条是www.lcsays.com这条链接,再下面是很多的css、js、jpeg等。点开第一条www.lcsays.com,会展示出这一条请求的详细信息如下:

 

Request URL展示了要请求的链接,Request Method是请求方法:GET(HTTP协议中还有POST、HEAD等方法),Status Code是返回码(200表示正常返回页面),Remote Address是服务器的ip:port(其中的ip就是通过dns服务根据域名获取到的ip地址,port默认都是80端口)

 

再下面是http请求和响应的头部信息,都是一些域和值

 

这整个请求和响应的处理过程是一次HTTP协议的处理过程,这种通信协议就叫HTTP协议,那么这样的服务器也叫http服务器(如nginx、apache等)

 

 

以上都是铺垫,现在开始说干货,对于HTTP协议返回的结果浏览器都会做哪些处理呢?

 

1. 响应头字段的分析和处理

响应头里的字段都告诉了浏览器很多要求,比如Cache-Control字段说明了浏览器要不要把这个页面缓存起来(下一次访问是不是不再请求服务器直接展示),再比如Transfer-Encoding说明了返回结果是不是分片的,详细的可以参考官方HTTP协议

 

2. 标签布局

http服务器返回的结果都是标签的形式,标签主要为了说明页面布局,比如:

<html>

<head>

</head>

<body>

<table>

<tr>

<td>第一行第一列<td><td>第一行第二列<td>

<td>第二行第一列<td><td>第二行第二列<td>

</tr>

</table>

</body>

</html>

这其实就定义了一个2行2列的布局表格,表格里放的不一定是文字,很可能是图片、视频,也可能是另一个表格,也可能是更复杂的内容

标签的特点是每一个标签都是成对出现的(表达开始和结束),标签都是可嵌套的,html、head、body是html网页固定的标签,各种内容都放到body里,专门表示布局的标签有table、div、iframe等,布局形式很丰富,只有你想不到的,没有你做不到的

 

3. 样式渲染

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

浏览网页会看到文字都是有字体、大小、颜色的,图片都是有长度宽度的,元素之间都是有距离、对齐的,这些样式方面的展示就是浏览器样式渲染的功能。

html里有两种表达样式的方式,一种是内嵌到html里,如:

<img width="500" height="200" src="https://www.lcsays.com/uploads/4.jpeg">

或者<img style="width:500px; height:200px;" src="https://www.lcsays.com/uploads/4.jpeg">

 

另一种是剥离出样式文件,如:

<link rel="stylesheet" href="//my.css">

my.css

img {

    width:500px; height:200px;

}

 

4. 链接提取

这里面有两种情形,一种是直接获取链接内容用来展示,一种是识别链接用来响应点击

像类似于

<img src="https://www.lcsays.com/uploads/4.jpeg">

这种标签,就表示要在这里显示一张图片,图片地址是https://www.lcsays.com/uploads/4.jpeg,这是需要浏览器在显示网页的同时再一次发送一个http请求,把图片下载到本地并展示

 

而类似于

<a href="https://www.lcsays.com/">lcsays</a>

这种标签,就表示这是一个超链接,你在浏览器里点“lcsays”就自动跳转到https://www.lcsays.com/,不点的时候浏览器是不会自动获取这个网页的

 

5. javascript渲染

javascript(简称js)和样式一样分为内嵌形式和外挂文件的形式。它是在浏览器加载网页时自动执行的一种脚本,它弥补了网页文件只能静态显示内容的缺陷,可以实现网页内容的动态加载(ajax)、动态修改(如新浪首页出现几秒钟后又自动消失的大广告)、异步事件(定时弹出个窗口)、特殊事件处理(如:注册时输入 用户名密码的合法性校验)等

 

前端框架

 

框架是什么,框架就是前人帮我们做好了大部分工作,我们只需要在此之上稍作修改就能实现强大功能。一般前人都是在开发比较繁琐的时候才会想到抽象出一层框架,前端最繁琐的就是js和样式,那么就这两部分框架最多了,js框架应用广泛的有jquery、angular JS等,样式框架比较知名的是bootstrap。当然还有非常多的控件可以复用,只要你能想到的,基本就有人帮你做了。

 

 

cookies是什么?

 

无论是浏览器使用还是网页开发,经常遇到的一个词就是cookie。cookie是浏览器用来记住你的用户、登陆、浏览等信息的数据。平时你有没有发现过这样的问题:我登陆一个网站后关掉浏览器,明天再打开浏览器能记住登陆状态。这就是cookie在起作用,当你填写账号密码登陆后,服务器返回网页内容同时会带上一串cookie让你的浏览器保存下来,以后每当你再访问这个网站的时候会自动把cookie带在请求里,这样服务器就知道你已经登陆过了,就像是一个令牌一样。在大数据领域,cookie也经常被用来作为服务器端数据统计分析的重要数据基础。

 

浏览器的种类

 

大家常用的浏览器有:IE、chrome、firefox、opera、mozilla、腾讯浏览器、百度浏览器、遨游浏览器、360浏览器、搜狗浏览器等,这些浏览器功能基本上相同,都是对html做渲染和展示,不同的地方在于某些浏览器对某些标签解释方式不太一样,所以在开发网页前端代码时需要做一些兼容性的考虑。

 

浏览器内核

浏览器纵有千万种,内核只有那么几个,因为对网页的渲染是一个非常底层而又繁琐的工作,众多浏览器基本上都是基于三种内核:ie内核(ie、百度浏览器)、火狐内核(mozilla、firefox)、webkit内核(chrome)。火狐和webkit内核都是开源的,所以很多编程语言的基础库里面已经包含了浏览器控件,开发的时候就拿浏览器当做一个简单的控件使用,这是一个很神奇的事情。

 

没有图形界面的浏览器

有一些特殊场景会遇到一些特殊而又有趣的问题:在linux文本界面下(没有图形界面)想要运行有浏览器控件的程序并且希望截个屏保存成图片,怎么破?有这么一个工具叫做xvfb(Xvirtual frame buffer),可以帮你模拟一个图形界面的外壳,可以执行图形界面的程序(虽然我们看不到,但在linux里真的在运行),那么截屏就是编程库里调用一个方法的事情了

 

教你一步步搭建和运行完整的开源搜索引擎

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

一、需要的软件及其版本

1. Centos linux 7

2. hadoop 1.2.1

3. hbase 0.94.27

4. nutch 2.3

5. solr 4.9.1

以上参考下载地址如下:

http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1503-01.iso

https://www.apache.org/dist/hadoop/core/hadoop-1.2.1/hadoop-1.2.1.tar.gz

http://mirror.bit.edu.cn/apache/hbase/hbase-0.94.27/hbase-0.94.27.tar.gz

http://www.apache.org/dyn/closer.cgi/nutch/2.3/apache-nutch-2.3-src.tar.gz

http://archive.apache.org/dist/lucene/solr/4.9.1/solr-4.9.1.tgz

二、系统环境准备

1. 安装linux操作系统(步骤略)

2. 单独新建一个hadoop用户:useradd hadoop

3. 设置密码:passwd hadoop

4. 开启管理员权限:vi /etc/sudoers,增加一行hadoop ALL=(ALL) ALL

5. 确保配置localhost地址映射到127.0.0.1,vi /etc/hosts

6. 设置无密码登陆(百度),至ssh localhost可以实现无密码登陆

7. 确保已经安装java-1.7,并配置好JAVA_HOME环境变量,如:

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.75-2.5.4.2.el7_0.x86_64/

三、安装hadoop 1.2.1

1. 下载hadoop-1.2.1.tar.gz并解压到/usr/local/hadoop,修改目录权限:

sudo chown -R hadoop:hadoop hadoop

2. 创建/data/hadoop-data目录

3. 修改./conf/core-site.xml配置如下:

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/data/hadoop-data/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

4. 修改conf/hadoop-env.sh中的JAVA_HOME配置如下:

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.75-2.5.4.2.el7_0.x86_64/

5. 修改./conf/hdfs-site.xml配置如下:

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

6. 修改./conf/mapred-site.xml配置如下:

<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>localhost:9001</value>
    </property>
</configuration>

7. 配置环境变量如下:

export HADOOP_PREFIX=/usr/local/hadoop/
export PATH=${HADOOP_PREFIX}/bin/:${PATH}

8. 格式化namenode:

hadoop namenode -format

9. 启动hadoop:

start-all.sh

10. 检查hadoop是否正确启动

hadoop fs -ls /

返回:

Found 1 items
drwxr-xr-x   – hadoop supergroup          0 2015-07-31 16:53 /data
hadoop job -list

返回:

0 jobs currently running
JobId State StartTime UserName Priority SchedulingInfo

11. tasktracker状态页面:http://localhost:50060/tasktracker.jsp

12. jobtracker状态页面:http://localhost:50030/jobtracker.jsp

13. datanode状态页面:http://localhost:50075

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

四、安装hbase 0.94.27

1. 下载hbase-0.94.27.tar.gz并解压到/usr/local/hbase,修改目录权限:sudo chown -R hadoop:hadoop hbase

2. 创建目录/data/hbase/zookeeper/

3. 修改./conf/hbase-env.sh中的JAVA_HOME配置如下:

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.75-2.5.4.2.el7_0.x86_64/

并开启:

export HBASE_MANAGES_ZK=true

4. 修改./conf/hbase-site.xml如下:

<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://localhost:9000/hbase</value>
    </property>
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/data/hbase/zookeeper</value>
    </property>
</configuration>

5. 删掉./lib/hadoop-core-1.0.4.jar并从hadoop拷贝:

cp /usr/local/hadoop/hadoop-core-1.2.1.jar ./lib/

6. 启动hbase:

./bin/start-hbase.sh

7. 检验hbase正确启动:执行./bin/hbase shell启动终端并执行list结果如下:

hbase(main):002:0> list
TABLE
0 row(s) in 0.0170 seconds
hbase(main):003:0>

8. hbase的Master状态页面:http://localhost:60010/master-status

五、安装nutch 2.3

1. 下载apache-nutch-2.3-src.tar.gz并解压到/usr/local/nutch,修改目录权限:sudo chown -R hadoop:hadoop nutch

2. 修改./conf/gora.properties增加如下一行:

gora.datastore.default=org.apache.gora.hbase.store.HBaseStore

3. 修改./conf/nutch-site.xml如下:

<configuration>
    <property>
        <name>storage.data.store.class</name>
        <value>org.apache.gora.hbase.store.HBaseStore</value>
        <description>Default class for storing data</description>
    </property>
    <property>
        <name>http.agent.name</name>
        <value>My Nutch Spider</value>
    </property>
    <property>
        <name>plugin.includes</name>
        <value>protocol-httpclient|urlfilter-regex|index-(basic|more)|query-(basic|site|url|lang)|indexer-solr|nutch-extensionpoints|protocol-httpclient|urlfilter-regex|parse-(text|html|msexcel|msword|mspowerpoint|pdf)|summary-basic|scoring-opic|urlnormalizer-(pass|regex|basic)protocol-http|urlfilter-regex|parse-(html|tika|metatags)|index-(basic|anchor|more|metadata)</value>
    </property>
</configuration>

4. 修改./ivy/ivy.xml

将依赖的hadoop-core和hadoop-test的版本由1.2.0改为1.2.1

将gora-hbase依赖解除注释如下:

<dependency org=”org.apache.gora” name=”gora-hbase” rev=”0.5″ conf=”*->default” />

5. 编译:ant runtime(可能耗费很长时间,因为要下包)

六、安装solr 4.9.1

1. 下载solr-4.9.1.tar并解压到/usr/local/solr,修改目录权限:

sudo chown -R hadoop:hadoop solr

2. 进入/usr/local/solr/example,覆盖nutch的schema.xml执行:

cp /usr/local/nutch/runtime/local/conf/schema.xml solr/collection1/conf/schema.xml

3. 启动solr:

java -jar start.jar

4. 访问http://localhost:8983/solr/#/collection1/query查看solr页面

七、启动抓取并测试搜索效果

1. 进到/usr/local/nutch/runtime/local目录,创建myUrls目录并创建seed.txt文件内容为种子url,如:

http://nutch.apache.org/

2. 执行:

./bin/crawl ./myUrls/ TestCrawl http://localhost:8983/solr 2

3. 查询:在http://localhost:8983/solr/#/collection1/query检索可以看到结果

教你成为全栈工程师(Full Stack Developer) 三-网站后端服务器那些事

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

互联网上的机器之间是怎么相互访问的?

 

你打开电脑就能相互访问吗?显然需要先接入互联网,也就是常说的“能上网”(插网线、连wifi),这样至少数据信号有途径传播。那么你怎么知道你要连到哪台电脑呢?通过IP地址(门牌号)。每一个接入互联网的电脑都会有一个ip地址,知道某个机器的ip地址就能通过网络协议连接它跟它通信了。

 

但对于我们来说有一个最大的问题,我们的电脑都是在局域网里的(办公网络、小区宽带都是),在局域网里的电脑比较特殊,是一个局域网的ip地址,事实上整个局域网里只有一台电脑(NAT服务器)是有真正的外网ip的,其他电脑都是通过这个有真正ip地址的特殊的服务器转发网络数据,这就存在一个问题就是从外界无法精确定位到一个局域网的机器,这就像是你可以找到北京市昌平区1024号楼一单元110门牌号的人家,但你找不到北京市某个叫做“主卧”的地方。所以很遗憾,我们的个人电脑做不了网站服务器。

 

怎么样搞到网站服务器呢?

 

传统的做法:申请一个固定ip,自己的电脑用这个ip,走出局域网。如今这个方案已经很难而且非常昂贵了,因为32位ip地址几乎被用光了,64位ip地址还没有普及,租用ip费用昂贵到个人是没办法承受的,所以还是考虑下面的方案吧。

现在流行的方案:云服务器供应商,比如阿里云。其实阿里早就囤积了一大批外网ip地址,阿里云服务器就是一个帮你绑定好外网ip地址的远程机器,7*24小时开机提供服务,并把机器的管理员权限全权交给你,就相当于这是你的电脑了,把网站部署在这台机器上就可以了。费用也是很便宜的(流量不大的小网站每个月70元左右)。您现在看到的www.lcsays.com就是我部署在阿里云服务器上的网站。具体阿里云服务器怎么申请怎么用百度一下你就知道。

 

域名是怎么定位到机器的?

 

域名就是指www.lcsays.com这种网址,我们一般在浏览器只输入网址不输入ip,怎么就能访问到网站内容呢?因为自动做了一次域名解析,也就是浏览器自动根据域名解析成对应的ip。这就是电脑里经常需要调整配置的DNS服务。DNS服务器属于互联网基础建设,接入互联网就能使用,不必担心。那么我们做的网站的域名是什么呢?

 

如何指定我的网站的域名?

 

域名和给小孩子起名不太一样,不可以重名。比如人家叫baidu.com,你不能也叫baidu.com,不然大家访问baidu.com就不知所向了。每个国家有专门的域名注册机构,比如中国的新网和万网,你也要去这两处申请。大家应该经常听说过某某公司重金买域名的案例吧,这就是在数年前有人看到了域名的商机,抢先低价注册短域名,n年后就会有人要高价买,从而赚差价。所以现在已经很难申请到短域名了。不管怎么样,还是得起一个容易记得住的域名,然后去新网或万网提交申请,然后需要拿着各种证件去现场确认审核等,国家备案之后才能批下来,整个过程预计半个月吧。不管是万网还是新网,申请成功之后你都可以登录上去并修改你域名对应的ip地址,修改完之后就大功告成啦,互联网上任何人只要浏览器输入你的域名就自动连接你设定的ip地址啦,搞定!

 

给大家看下我的案例吧

1. 注册并登陆阿里云https://www.aliyun.com/,点开“管理控制台”

查看云服务器:

 

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

登陆阿里云服务器如下:

[root@centos7vm ~]# ssh root@182.92.80.220
root@182.92.80.220's password:
Last login: Sun Apr 10 07:26:16 2016 from 222.129.54.231
Welcome to aliyun Elastic Compute Service!
[root@MYAY ~]# ifconfig |grep inet
        inet 10.162.223.224  netmask 255.255.240.0  broadcast 10.162.223.255
        inet 182.92.80.220  netmask 255.255.252.0  broadcast 182.92.83.255
        inet 127.0.0.1  netmask 255.0.0.0

这里面有三个ip地址,第一个是阿里云局域网内部ip,第二个是外网ip(网站用),第三个是本地回路ip

我的网站服务情况如下:

[root@MYAY ~]# ps aux|grep nginx
root     15743  0.0  0.1  48012  1164 ?        Ss   4月01   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    15744  0.0  0.2  50572  2248 ?        S    4月01   0:08 nginx: worker process
[root@MYAY shareditor2.0]# egrep "listen|server" /etc/nginx/conf.d/shareditor2.0.conf
server {
    listen       80;
    server_name  www.lcsays.com;
[root@MYAY shareditor2.0]# netstat -npal|grep "80 "
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      15743/nginx: master
tcp        0      0 182.92.80.220:42483     110.75.102.62:80        ESTABLISHED 1035/AliYunDun

我的域名备案通过阿里代备案系统https://beian.aliyun.com/管理

我的DNS解析配置如下:

因为配了,所以能解析到:

[root@MYAY ~]# host www.lcsays.com
www.lcsays.com has address 182.92.80.220
[root@MYAY ~]# ping www.lcsays.com
PING www.lcsays.com (182.92.80.220) 56(84) bytes of data.
64 bytes from MYAY (182.92.80.220): icmp_seq=1 ttl=64 time=0.023 ms

有了以上这些服务器相关的知识,就可以把你的网站推向互联网啦!

教你成为全栈工程师(Full Stack Developer) 二-半小时学会网站开发

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

网站是怎么工作的?

打开浏览器输入:www.lcsays.com试一下

这个过程就是:我们用浏览器访问了一个网站。那么到底浏览器和网站分别都做了什么呢?我们再来做一个试验

 

在试验之前我们要安装nc工具(nc是一个网络工具,通过nc命令可以模拟客户端或服务器端程序,非常方便)

[root@centos7vm ~]# yum install nc

 

接着我们来尝试一下nc的网络功能,先打开一个终端输入:

 

[root@centos7vm ~]# nc -l -p 80

 

回车后光标停止了,这条命令的含义是:模拟一个服务端程序监听在80这个tcp端口上,等待客户端连接

 

然后再打开一个终端输入:

[root@centos7vm ~]# nc 127.0.0.1 80

 

回车后光标也停止了,这条命令的含义是:模拟一个客户端通过tcp协议连接127.0.0.1这个ip地址所在的机器(也就是本机)的80端口

 

然后在第二个终端里直接输入hello,如下:

 

[root@centos7vm ~]# nc 127.0.0.1 80
hello

 

这时看第一个终端出现了:

[root@centos7vm ~]# nc -l -p 80
hello

 

如果你这时在第一个终端里输入一些字符,第二个终端里也会看到,这其实就是一个简单的QQ聊天,是不是很神奇

好了,现在你是否理解了nc的功能了呢?

 

言归正传,现在我们就用nc来说明网站是怎么工作的

 

我们重新监听80端口(网站默认使用的是http协议,http协议默认都是80端口,其实也可以选用其他端口比如8080,那么浏览器访问时就要输入www.shareditor:8080)

[root@centos7vm ~]# nc -l -p 80

 

这时我们同浏览器来访问127.0.0.1,如下:

我们发现浏览器一直在转圈圈,但是发现终端上出现了下面一些内容:

 

[root@centos7vm ~]# nc -l -p 80
GET / HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6

这其实就是浏览器给服务器发的请求内容,这时我们手工来给浏览器回个信,直接在请求下面输入:

 

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Connection: close
hello
hi
<html>
<body>
<h1>hello</h1>
</body>
</html>

 

这时回过来看浏览器,是不是这样了?

我们刚才其实就做了一个小网站呢有木有!!!当然我们的网站运行的成本有点大,因为需要人来看着,并时刻敲出要返回的网站内容,想象一下如果同时有1000个人访问我们的网站,我们得敲多长时间,这1000个人会不会疯掉

请尊重原创,转载请注明来源网站www.lcsays.com以及原始链接地址

 

实际上有人已经帮我们做了这个工作,那就是网站服务器程序,比较流行的是nginx和apache(这两个原理区别不大,主要是配置文件写法不同,我个人习惯用nginx),现在我们就来用nginx搭建一个小网站

 

先来安装nginx的1.8版本:

 

[root@centos7vm ~]# yum install nginx18

 

安装好后可以看到系统里多了以下目录和文件:

 

[root@centos7vm ~]# ls /usr/sbin/nginx
/usr/sbin/nginx
[root@centos7vm ~]# ls /etc/nginx/
conf.d  fastcgi.conf  fastcgi.conf.default  fastcgi_params  fastcgi_params.default  koi-utf  koi-win  mime.types  mime.types.default  nginx.conf  nginx.conf.default  scgi_params  scgi_params.default  uwsgi_params  uwsgi_params.default  win-utf
[root@centos7vm ~]# ls /usr/share/nginx/
html
[root@centos7vm ~]# ls /var/log/nginx/

 

这些分别是nginx的可执行文件、配置文件、网页文件目录、运行日志目录

 

不用犹豫,直接来启动nginx

[root@centos7vm ~]# service nginx start
Redirecting to /bin/systemctl start  nginx.service

 

可以看到nginx进程已经启动:

[root@centos7vm ~]# ps aux | grep nginx
root      21238  0.0  0.1 109552  2000 ?        Ss   05:13   0:00 nginx: master process /usr/sbin/nginx
nginx     21239  0.0  0.3 109992  3064 ?        S    05:13   0:00 nginx: worker process
root      21243  0.0  0.0 112660   960 pts/1    R+   05:13   0:00 grep --color=auto nginx

 

这时我们再打开浏览器访问127.0.0.1可以看到下面的效果:

这个页面其实就是nginx帮我们输入了一些文字,返回给浏览器的,这些内容就放在:


[root@centos7vm ~]# cat /usr/share/nginx/html/index.html

 

我们尝试按照我们自己的想法制作一个网页,编辑/usr/share/nginx/html/test.html文件,写入内容如下:

[root@centos7vm ~]# cat /usr/share/nginx/html/test.html
<html>
    <body>
        <h1>hello</h1>
    </body>
</html>

 

这时我们用浏览器访问:127.0.0.1/test.html,效果如下:

现在大功告成,你可以充分发挥你的想象来制作你自己的网站了,具体html语法可以参考网上的html教程,也有很多软件能方便制作漂亮的网页

 

最后留一个悬念,当你制作好你的网站希望其他人能看到的时候,你会发现在我们虚拟机里运行的网站服务是无法让外部互联网上的其他人看到的,这个问题会在下一篇中详细解释