-
Notifications
You must be signed in to change notification settings - Fork 56
/
apache2学习笔记.html
1025 lines (901 loc) · 31.9 KB
/
apache2学习笔记.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="zh">
<head>
<title>apache2学习笔记</title>
<!-- 2015-11-02 17:39 -->
<meta charset="utf-8">
<meta name="generator" content="Org-mode">
<meta name="author" content="万泽(德山书生)">
<meta name="description" content="制作者邮箱:[email protected]"
>
<style type="text/css"> /*
* with_bootstrap.css
*
* Copyright 2015 wanze <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
@import url("http://getbootstrap.com/dist/css/bootstrap.min.css");
/* Sticky footer styles
-------------------------------------------------- */
html {
position: relative;
min-height: 100%;
margin: 0px;
}
body {
/* Margin bottom by footer height */
margin-bottom: 60px;
}
footer {
position: absolute;
bottom: 0;
width: 100%;
/* Set the fixed height of the footer here */
height: 60px;
background-color: #f5f5f5;
}
/* Custom page CSS
-------------------------------------------------- */
/* Not required for template or sticky footer method. */
.container {
width: auto;
max-width: 750px;
padding: 0 15px;
}
.container .text-muted {
margin: 20px 0;
}
/* background-color: #f8f8f8; */
.navbar-default{
background-color: #fff;
}
/*--------------------*/
#content{
margin: 0 auto;
max-width: 750px;
padding: 17px;
line-height:160%;
font-size:16px;
}
h1,h2,h3,h4,h5,h6 {
font-family: 'PT Sans Narrow', sans-serif;
font-weight: 700;
margin-bottom: 1em;
margin-top: 1em;
}
pre{line-height:180%;font-size:90%;}
code,kbd,pre,samp {
font-family: monospace, serif;
}
code{ padding: 2px;}
p{
text-indent:2em;/*段落缩进*/
line-height:180%;/*行间距*/
}
.title{
text-align: center;
}
.org-ol li , .org-ul li , org-dl dt{
margin-top: 0.5em; /*增大li之间的垂直space*/
margin-bottom: 0.5em; /*增大li之间的垂直space*/
}
p.verse{
margin-left: 3%;
text-indent:0em;
}
.right{
margin-left: auto;
margin-right: 0px;
text-align: right;
}
.left{
margin-left: 0px;
margin-right: auto;
text-align: left;
}
.center{
margin-left: auto;
margin-right: auto;
text-align: center;
}
.underline{
text-decoration: underline;
}
video{
width: 750px;
margin-left: auto;
margin-right: auto;
}
figure p{
text-indent:0em;/*段落缩进*/
}
img{
max-width: 700px;
}
figure{
text-align: center;
}
table, th, td
{
margin:0 auto;
min-width:2em;
text-align:center ;
padding: 5px;
}
table{
border-top: 2px solid ;
border-bottom: 2px solid ;
}
thead{
border-bottom: 1px solid ;
}
/* class */
.framed{
max-width:700px;
border:1px solid ;
padding: 1em;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.notecard{
width: 320px;
position:relative;
right: -215px;
padding: 1em;
margin:0 auto;
border: solid 1px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
/*
http://thomasf.github.io/solarized-css/
*/
dfn {
font-style: italic;
}
dd{
margin-left:2em;
}
mark {
background: #ff0;
color: #000;
}
q {
quotes: "\201C" "\201D" "\2018" "\2019";
}
small {
font-size: 80%;
}
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
.tag {
background-color: #eee8d5;
color: #d33682;
padding: 0 0.2em;
}
.todo,
.next,
.done {
color: #fdf6e3;
background-color: #dc322f;
padding: 0 0.2em;
}
.tag {
-webkit-border-radius: 0.35em;
-moz-border-radius: 0.35em;
border-radius: 0.35em;
}
.TODO {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #2aa198;
}
.NEXT {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #268bd2;
}
.ACTIVE {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #268bd2;
}
.DONE {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #859900;
}
.WAITING {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #cb4b16;
}
.HOLD {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #d33682;
}
.NOTE {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #d33682;
}
.CANCELLED {
-webkit-border-radius: 0.2em;
-moz-border-radius: 0.2em;
border-radius: 0.2em;
background-color: #859900;
}
/*
pygmentize -f html -S colorful -a .highlight
*/
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #FF0000; background-color: #FFAAAA } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .o { color: #333333 } /* Operator */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #557799 } /* Comment.Preproc */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #003388; font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #333399; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #6600EE; font-weight: bold } /* Literal.Number */
.highlight .s { background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #0000CC } /* Name.Attribute */
.highlight .nb { color: #007020 } /* Name.Builtin */
.highlight .nc { color: #BB0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #880000; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #FF0000; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066BB; font-weight: bold } /* Name.Function */
.highlight .nl { color: #997700; font-weight: bold } /* Name.Label */
.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #007700 } /* Name.Tag */
.highlight .nv { color: #996633 } /* Name.Variable */
.highlight .ow { color: #000000; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #6600EE; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #6600EE; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #005588; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #4400EE; font-weight: bold } /* Literal.Number.Oct */
.highlight .sb { background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #0044DD } /* Literal.String.Char */
.highlight .sd { color: #DD4422 } /* Literal.String.Doc */
.highlight .s2 { background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #666666; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { background-color: #eeeeee } /* Literal.String.Interpol */
.highlight .sx { color: #DD2200; background-color: #fff0f0 } /* Literal.String.Other */
.highlight .sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #AA6600 } /* Literal.String.Symbol */
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700; font-weight: bold } /* Name.Variable.Global */
.highlight .vi { color: #3333BB } /* Name.Variable.Instance */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
</style>
</head>
<body>
<header class="header">
<nav class="navbar navbar-default navbar-static-top"><div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="http://www.cdwanze.org"><img style="max-width:50px; margin-top: -15px;" src="/templates/images/logo.svg" /></a></div>
<div id="navbar">
<ul class="nav navbar-nav"><li class="active"><a href="http://blog.cdwanze.org">博客</a><li><a href="http://blog.cdwanze.org/about.html">关于</a><li><a href="http://blog.cdwanze.org/donate.html">支持</a></div>
</div>
</nav></header><div id="content">
<h1 class="title">apache2学习笔记</h1>
<nav id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1. 简介</a></li>
<li><a href="#sec-2">2. a2dissite命令</a></li>
<li><a href="#sec-3">3. a2ensite命令</a></li>
<li><a href="#sec-4">4. a2dismod命令</a></li>
<li><a href="#sec-5">5. a2enmod命令</a></li>
<li><a href="#sec-6">6. log文件在那里</a></li>
<li><a href="#sec-7">7. 查看当前apache2的一些环境变量</a></li>
<li><a href="#sec-8">8. 多站点的玩法</a></li>
<li><a href="#sec-9">9. 本地测试用域名支持</a></li>
<li><a href="#sec-10">10. 对应到用户的某个文件夹下</a>
<ul>
<li><a href="#sec-10-1">10.1. 文件夹权限</a></li>
</ul>
</li>
<li><a href="#sec-11">11. 404重定向</a></li>
<li><a href="#sec-12">12. 和flask框架一起</a>
<ul>
<li><a href="#sec-12-1">12.1. 简单的apache2配置</a></li>
<li><a href="#sec-12-2">12.2. Require做了什么</a></li>
<li><a href="#sec-12-3">12.3. what.wsgi文件</a></li>
<li><a href="#sec-12-4">12.4. 更复杂点的配置</a></li>
</ul>
</li>
<li><a href="#sec-13">13. apt-get安装软件包清单</a></li>
<li><a href="#sec-14">14. 参考资料</a></li>
</ul>
</div>
</nav>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1"><span class="section-number-2">1</span> 简介</h2>
<div class="outline-text-2" id="text-1">
<p>
关于apache2 web server的简要介绍请参看 <a href="https://zh.wikipedia.org/wiki/Apache_HTTP_Server">wiki</a> 。目前最广泛使用的apache版本是apache2.4,这是它的 <a href="http://httpd.apache.org/docs/2.4/">官方文档链接</a> 。不过这个官方文档初看了一下似乎并不是怎么好看。
</p>
<p>
本文的环境是ubuntu14.04,其他debian系应该都差不多,rpm系可能除了配置文件在 <code>/etc/http</code> (还是httpd?) 那里其他应该都是很类似的。在ubuntu下配置文件是放在 <code>/etc/apache2</code> 那里的。
</p>
<p>
我们到了 <code>/etc/apache2</code> 那里,可以看到很多配置信息,其中一些配置信息我们一般不会改动,而是通过定制自己的网站配置。比如在 <code>sites-available</code> 这个文件夹里面放着一系列可用的网站apache2配置。其中有一个文件 <code>000-default.conf</code> ,其在本地对应的是localhost:80,而对外是0.0.0.0:80。这里的0.0.0.0具体是外网IP。假设这台服务器的外网IP是100.100.100.100,那么其他电脑输入100.100.100.100:80即访问了这个000-default网站。
</p>
<p>
这里需要额外提一下二级域名和三级域名的区别。严格意义上讲"www.someschool.edu"这样的域名是属于三级域名的,而只有"someschool.edu"这样的形式才是二级域名。并且严格意义上讲,二级域名就是对应的具体的某个外网IP,没有其他任何附加行为了。而三级域名则可能存在其他的跳转操作(包括DNS跳转和网络服务器的行为等)。比如"www.someschool.edu"是一个三级域名,而"blog.someschool.edu"也是一个三级域名,其在外网IP的基础上,DNS跳转行为不同的基础上,apache2还可以根据这些域名的不同来选择不同的行为。具体就是通过 <strong>ServerName</strong> 和 <strong>ServerAlias</strong> 来控制的,这样apache2网络服务器是可以支持一台主机管理多个域名站点的。
</p>
<p>
这里要说的是,在网站上不输入域名,而直接输入某个主机的外网ip地址,那么一般将访问的就是这个 <code>000-default</code> 。这个细节很微妙,总之经过我测试结果就是直接输入外网ip访问的就是这个 <code>000-default</code> 网站,而如果输入 <code>www.someschool.edu</code> ,那么通过DNS,该域名指向的就是那个外网ip,其通过apache2实际上会指向另外一个配置文件。而域名 <code>someschool.edu</code> 这样的域名输入就是等同于直接输入外网ip的行为。当然我们可以禁用这个 <code>000-default</code> 网站,如下所示:
</p>
</div>
</div>
<div id="outline-container-sec-2" class="outline-2">
<h2 id="sec-2"><span class="section-number-2">2</span> a2dissite命令</h2>
<div class="outline-text-2" id="text-2">
<p>
我们运行:
</p>
<pre class="example">
sudo a2dissite
</pre>
<p>
然后程序会提示你一些可用站点选项,这里输入000-default即将其禁用了。
</p>
<p>
这样的话输入 <code>www.someschool.edu</code> 和 <code>someschool.edu</code> 的行为通过 <strong>ServerName</strong> 和 <strong>ServerAlias</strong> 来管理,其行为就完全一样了(通过DNS也是可以做到类似的效果的)。
</p>
</div>
</div>
<div id="outline-container-sec-3" class="outline-2">
<h2 id="sec-3"><span class="section-number-2">3</span> a2ensite命令</h2>
<div class="outline-text-2" id="text-3">
<p>
类似的有 <code>a2ensite</code> 命令,其用于激活一个网站配置文件。
</p>
<p>
我们到 <code>/etc/apache2/sites-available</code> 那里,执行:
</p>
<pre class="example">
sudo cp 000-default.conf test.conf
</pre>
<p>
这里简单就使用原来的配置,然后稍做修改:
</p>
<pre class="example">
DocumentRoot /var/www/test
</pre>
<p>
然后我们还可以继续修改域名控制:
</p>
<pre class="example">
ServerName www.someschool.edu
ServerAlias someschool.edu
</pre>
<p>
这个test文件夹也是放在/var/www里面的,文件夹名是随意的。
</p>
<p>
然后让这个配置文件可用,就是使用a2ensite命令来是这个站点可用的意思:
</p>
<pre class="example">
sudo a2ensite
</pre>
<p>
选择那个test即可
</p>
<p>
然后重启一下apache2服务,当然在/var/www下面需要随便放一个index.html文件,这个就不用多说了。
</p>
<pre class="example">
sudo service apache2 restart
</pre>
<p>
不出意外的话,你在浏览器输入localhost应该能够看到一个简单的页面了吧(这里假设你已经禁用了原000-default网站)。
</p>
<p>
然后我们可以通过浏览器来输入域名的方式来看一下。但这里要说的是,上面的配置
</p>
<pre class="example">
ServerAlias someschool.edu
</pre>
<p>
原意是如果遇到这个域名别名也视作同样是这个网站的意思。但对于二级域名来说并不确切。读者可以尝试一下再通过 <strong>a2ensite</strong> 命令将000-default网站启用,然后:
</p>
<pre class="example">
curl someschool.edu
</pre>
<p>
那么我们会看到这样抓取对应的正是这个000-default网站。
</p>
<p>
我们再看下面这个例子,很明显抓取baidu.com和抓取www.baidu.com响应是不同的。
</p>
<pre class="example">
wanze@wanze-ubuntu64:~$ curl baidu.com
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
wanze@wanze-ubuntu64:~$ curl www.baidu.com
<!DOCTYPE html><html><body><script type="text/javascript">var
......
</pre>
</div>
</div>
<div id="outline-container-sec-4" class="outline-2">
<h2 id="sec-4"><span class="section-number-2">4</span> a2dismod命令</h2>
<div class="outline-text-2" id="text-4">
<p>
我之前安装了suphp和suexec模块,还没设置成功,不想放在那里后来对我这里php文件的解析产生影响了,先用a2dismod命令将这两个模块解除了就显示正常了。 <strong>a2dismod</strong> 命令是禁用apache2的某个模块。
</p>
</div>
</div>
<div id="outline-container-sec-5" class="outline-2">
<h2 id="sec-5"><span class="section-number-2">5</span> a2enmod命令</h2>
<div class="outline-text-2" id="text-5">
<p>
激活apache2的某个模块。
</p>
</div>
</div>
<div id="outline-container-sec-6" class="outline-2">
<h2 id="sec-6"><span class="section-number-2">6</span> log文件在那里</h2>
<div class="outline-text-2" id="text-6">
<p>
在ubuntu下默认的log文件生成路径在 <code>/var/log/apache2</code> 那里。
</p>
</div>
</div>
<div id="outline-container-sec-7" class="outline-2">
<h2 id="sec-7"><span class="section-number-2">7</span> 查看当前apache2的一些环境变量</h2>
<div class="outline-text-2" id="text-7">
<p>
参考了 <a href="http://serverfault.com/questions/558283/apache2-config-variable-is-not-defined">这个网页</a> 。
</p>
<pre class="example">
source /etc/apache2/envvars
apache2 -V
</pre>
<p>
这些环境变量还看不懂。
</p>
</div>
</div>
<div id="outline-container-sec-8" class="outline-2">
<h2 id="sec-8"><span class="section-number-2">8</span> 多站点的玩法</h2>
<div class="outline-text-2" id="text-8">
<p>
apache2管理多站点前面已有所涉及,就是如下通过域名来管理的。
</p>
<pre class="example">
ServerName www.cdwanze.org
</pre>
</div>
</div>
<div id="outline-container-sec-9" class="outline-2">
<h2 id="sec-9"><span class="section-number-2">9</span> 本地测试用域名支持</h2>
<div class="outline-text-2" id="text-9">
<p>
我们如下可以修改系统的 <code>/etc/hosts</code> 文件来支持本地测试的域名支持:
</p>
<pre class="example">
127.0.0.1 cdwanze.org
127.0.0.1 www.cdwanze.org
127.0.0.1 blog.cdwanze.org
</pre>
</div>
</div>
<div id="outline-container-sec-10" class="outline-2">
<h2 id="sec-10"><span class="section-number-2">10</span> 对应到用户的某个文件夹下</h2>
<div class="outline-text-2" id="text-10">
<p>
现在我希望把网站对应的文件夹对应到(我在ubuntu下的)主文件夹下的某个文件夹,这样更方便调试。于是修改了前面的 <code>DocumentRoot</code> 参数,重启apache2服务之后,报错说“/没有权限访问”,
</p>
<p>
其报了这个错误:
</p>
<pre class="example">
403 Forbidden You don't have permission to access / on this server
</pre>
<p>
然后参考了 <a href="http://stackoverflow.com/questions/10873295/error-message-forbidden-you-dont-have-permission-to-access-on-this-server">这个网页</a> ,进行如下设置即可:
</p>
<pre class="example">
<Directory /home/wanze/workspace/cdwanze.org >
Require all granted
</Directory>
</pre>
<p>
这里的:
</p>
<pre class="example">
Require all granted
</pre>
<p>
这种写法只适用于apache2.4或以上版本,不过我想(新用户)现在应该都是用的apache2.4或者以上版本了吧。看上去是给予全部权限的意思。
</p>
</div>
<div id="outline-container-sec-10-1" class="outline-3">
<h3 id="sec-10-1"><span class="section-number-3">10.1</span> 文件夹权限</h3>
<div class="outline-text-3" id="text-10-1">
<p>
实际上上面的说没有权限访问/的错误还可能是你本地文件夹或者文件的权限设置问题<sup><a id="fnr.1" name="fnr.1" class="footref" href="#fn.1">1</a></sup>。
</p>
<p>
一般网站不含可执行文件的推荐设置为644权限:
</p>
<pre class="example">
sudo chmod -R 644 filefolder_name
</pre>
<p>
644权限是 <code>-rw-r--r--</code> ,也就是只有文件所有者才可读可写,其他的都只有读权限,这是一种很安全的权限模式,基本上不用太担心出什么问题。
</p>
<p>
若该文件夹需要支持python脚本或者php等可执行脚本,那么常用的权限是755,也就是 <code>-rwxr-xr-x</code> ,即文件所有者可读可写可执行,群组所有或者其他人可读可执行。设置755权限可能会有点危险,需要进一步用apache2的其他模块,比如suPHP或者wsgi模块的群组用户权限管理来控制。
</p>
</div>
</div>
</div>
<div id="outline-container-sec-11" class="outline-2">
<h2 id="sec-11"><span class="section-number-2">11</span> 404重定向</h2>
<div class="outline-text-2" id="text-11">
<p>
推荐在网站文件夹本地建立一个 <code>.htaccess</code> 文件来管理,参考了 <a href="http://www.jb51.net/article/25476.htm">这个网</a>页 。
</p>
<p>
首先你需要在该网站的apache2配置那里加上这么一行:
</p>
<pre class="example">
<Directory /home/wanze/workspace/cdwanze.org >
AllowOverride All
</Directory>
</pre>
<p>
这里是允许所有重定向的意思。
</p>
<p>
然后在 <code>.htaccess</code> 文件里面加上
</p>
<pre class="example">
ErrorDocument 404 /404.html
</pre>
<p>
也就是如果发生 <strong>404</strong> 错误,则返回 /404.html 这个网页文件。具体在你的网站文件夹目录下面新建一个404.html文件即可。
</p>
<p>
当然了如果你是用的flask框架编写网络服务器,那么其是可以做错误和其他重定向任务的,就不需要这样配置了。这里主要是针对那些php语言编写的网络服务器(apache2是本来就支持解析php文件的,但我不确定用flask框架之下是否还支持解析php文件,但也不关心,没谁这么用吧、、)。
</p>
</div>
</div>
<div id="outline-container-sec-12" class="outline-2">
<h2 id="sec-12"><span class="section-number-2">12</span> 和flask框架一起</h2>
<div class="outline-text-2" id="text-12">
<p>
apache2是支持flask框架编写网络服务器的,更确切的表达是,apache2有一个模块,安装上它apache2就支持wsgi接口了。对于python2,在ubuntu下要安装的是:
</p>
<div class="highlight"><pre>sudo apt-get install libapache2-mod-wsgi
</pre></div>
<p>
对于python3,要安装的是:
</p>
<div class="highlight"><pre>sudo apt-get install libapache2-mod-wsgi-py3
</pre></div>
<p>
默认那个 <code>wsgi</code> 模块安装之后就激活了,你可以通过 <code>a2dismod</code> 来看一下,就是那个 <code>wsgi</code> 模块。 这里参考了 <a href="http://stackoverflow.com/questions/28019310/running-django-python-3-4-on-mod-wsgi-with-apache2">这个网页</a> 。
</p>
<p>
但是等一等,还有一些东西你需要配置,更多细节请参看flask框架官方文档的 <a href="http://flask.pocoo.org/docs/0.10/deploying/mod_wsgi/">这里</a> ,下面简单介绍之。
</p>
</div>
<div id="outline-container-sec-12-1" class="outline-3">
<h3 id="sec-12-1"><span class="section-number-3">12.1</span> 简单的apache2配置</h3>
<div class="outline-text-3" id="text-12-1">
<p>
最简单的配置就是如下所示:
</p>
<pre class="example">
WSGIScriptAlias / /home/wanze/workspace/cdwanze/cdwanze.wsgi
<Directory /home/wanze/workspace/cdwanze >
Require all granted
</Directory>
</pre>
</div>
</div>
<div id="outline-container-sec-12-2" class="outline-3">
<h3 id="sec-12-2"><span class="section-number-3">12.2</span> Require做了什么</h3>
<div class="outline-text-3" id="text-12-2">
<p>
其中 <code>Require all granted</code> 前面我们已谈到,是对访问权限的控制。参看apache2.2到apache2.4的 <a href="http://httpd.apache.org/docs/current/upgrading.html">升级文档</a> ,
原2.2配置:
</p>
<pre class="example">
Order deny,allow
Deny from all
</pre>
<p>
等同于2.4配置:
</p>
<pre class="example">
Require all denied
</pre>
<p>
原2.2配置:
</p>
<pre class="example">
Order allow,deny
Allow from all
</pre>
<p>
等同于2.4配置:
</p>
<pre class="example">
Require all granted
</pre>
<p>
原2.2配置:
</p>
<pre class="example">
Order Deny,Allow
Deny from all
Allow from example.org
</pre>
<p>
等同于2.4配置:
</p>
<pre class="example">
Require host example.org
</pre>
<p>
关于这里Order什么的配置更详细的说明参看 <a href="http://www.fwolf.com/blog/post/191">这个网页</a> 。其第一行就两种写法,逗号之间不能有空格。
</p>
<ol class="org-ol">
<li><code>Order Deny,Allow</code>
</li>
</ol>
<p>
在这个写法后面,后面先写允许谁谁谁访问,然后写禁止谁谁谁访问。如下所示:
</p>
<pre class="example">
Order Deny,Allow
Deny from all
Allow from example.org
</pre>
<p>
这个写法的意思是禁止谁,允许谁,禁止所有只允许example.org访问。
</p>
<ol class="org-ol">
<li><code>Order Allow,Deny</code>
</li>
</ol>
<p>
和上面描述类似,除了先写允许再写禁止。
</p>
<p>
新的apache2.4的 <code>require</code> 语法更多细节请参看apache2官方文档的 <a href="http://httpd.apache.org/docs/2.4/howto/access.html">这里</a> 。接着前面的描述,还有如下表达:
</p>
<p>
允许某个具体的ip地址:
</p>
<pre class="example">
Require ip ip.address
</pre>
<p>
在前面有了,全部都允许、全部都禁止、全部都禁止只允许谁。还有如下,全部都允许只禁止谁:
不允许某个ip地址。
</p>
<pre class="example">
Require all granted
Require not ip 10.252.46.165
</pre>
</div>
</div>
<div id="outline-container-sec-12-3" class="outline-3">
<h3 id="sec-12-3"><span class="section-number-3">12.3</span> what.wsgi文件</h3>
<div class="outline-text-3" id="text-12-3">
<p>
这一行具体设置那个what.wsgi文件在那里,一般就放在flask框架源码第一目录下吧。
</p>
<pre class="example">
WSGIScriptAlias / /home/wanze/workspace/cdwanze/cdwanze.wsgi
</pre>
<p>
然后这个what.wsig文件主要就是说明flask程序app对象在哪里。
</p>
<p>
这里首先把python的搜索路径加上,然后从你的flask主app对象所谓的文件中引入app,然后 <code>as application</code> 。
</p>
<pre class="example">
import sys
sys.path.insert(0, '/home/wanze/workspace/cdwanze')
from cdwanze import app as application
</pre>
</div>
</div>
<div id="outline-container-sec-12-4" class="outline-3">
<h3 id="sec-12-4"><span class="section-number-3">12.4</span> 更复杂点的配置</h3>
<div class="outline-text-3" id="text-12-4">
<p>
flask官方文档给出了更复杂点的配置如下所示:
</p>
<pre class="example">
WSGIDaemonProcess cdwanze user=wanze group=wanze threads=5
WSGIScriptAlias / /home/wanze/workspace/cdwanze/cdwanze.wsgi
<Directory /home/wanze/workspace/cdwanze >
WSGIProcessGroup cdwanze
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
</pre>
<p>
具体其似乎和用户权限管理有关,这里的细节我还不太懂,不过大体就是用户和群组的控制吧,然后还有一个线程控制。这里暂时先就这样了。
</p>
</div>
</div>
</div>
<div id="outline-container-sec-13" class="outline-2">
<h2 id="sec-13"><span class="section-number-2">13</span> apt-get安装软件包清单</h2>
<div class="outline-text-2" id="text-13">
<p>
下面是一些在ubuntu下可以通过apt-get安装的软件包清单信息,你可能用得着的。
</p>
<p>
在ubuntu下安装所谓的LAMP套件是很简单了,实际上用apt-get直接安装也看不出来比用那个套件安装方法复杂多少。
</p>
<pre class="example">
sudo apt-get install tasksel
sudo tasksel install lamp-server
</pre>
<p>
下面是我收集的相关软件安装包信息,主要参考了 <a href="http://bbs.aliyun.com/read/135940.html">这个网页</a> 。当然通常所谓的LAMP套件不需要安装这么多东西,最简单的就是mysql-server,mysql-client,php5,apache2。然后后面这些软件包后面你可能会用到的。
</p>
<dl class="org-dl">
<dt> mysql-server </dt><dd>Mysql服务器核心程序,服务器端主程序。
</dd>
<dt> mysql-client </dt><dd>Mysql客户端,用以通过命令行方式登录管理Mysql服务器。
</dd>
<dt> mysql-common </dt><dd>Mysql核心库文件,包含了运行Mysql必备的基本文件。
</dd>
<dt> php5 </dt><dd>服务器端PHP解释器
</dd>
<dt> php5-cgi </dt><dd>服务器端PHP-CGI解释器
</dd>
<dt> php5-cli </dt><dd>PHP5命令行工具
</dd>
<dt> php5-common </dt><dd>PHP5一些基本文件
</dd>
<dt> php5-fpm </dt><dd>服务器端PHP-FPM程序 这个程序对Nginx处理PHP很重要
</dd>
<dt> php5-gd </dt><dd>PHP5的GD模块 GD是一套开源图像处理库,一般dz生成缩略图或者加水印需要他
</dd>
<dt> php5-imagick </dt><dd>PHP5的ImageMagick模块 DZ支持调用其用以提供比GD跟快以及更高效的图像处理
</dd>
<dt> php5-imap </dt><dd>PHP5的IMAP模块 论坛的邮件发送功能可能需要
</dd>
<dt> php5-ldap </dt><dd>PHP5的LDAP模块 LDAP是一个轻量级目录服务
</dd>
<dt> php5-mcrypt </dt><dd>PHP5的MCrypt模块 主要用途是数据加密,比如phpmyadmin就会要求提供此模块来提供更高的安全性
</dd>
<dt> php5-mysql </dt><dd>PHP5的MySQL模块 如果想让你的网站可以访问数据库,此模块必备
</dd>
<dt> php5-snmp </dt><dd>PHP5的SNMP模块
</dd>
<dt> php5-sqlite </dt><dd>PHP5的SQLite模块 SQLite是一个轻量级的数据库,某些软件可能需要
</dd>
<dt> php5-xmlrpc </dt><dd>PHP5的XML-RPC
</dd>
<dt> apache2 </dt><dd>Apache元包(metapackage不会翻译的飘过)
</dd>
<dt> apache2-mpm-prefork </dt><dd>AApache传统无线程模型
</dd>
<dt> apache2-utils </dt><dd>Web服务器实用工具
</dd>
<dt> apache2.2-bin </dt><dd>Apache公用二进制文件
</dd>
<dt> apache2.2-common </dt><dd>Apache公用文件
</dd>
<dt> libapache2-mod-php5 </dt><dd>服务器端,HTML嵌入式脚本语言(Apache模块)
</dd>
</dl>
<p>
下面继续列出一些相关软件包信息:
</p>
<ul class="org-ul">
<li>php5-curl
</li>
<li>php5-json
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-14" class="outline-2">
<h2 id="sec-14"><span class="section-number-2">14</span> 参考资料</h2>
<div class="outline-text-2" id="text-14">
<ol class="org-ol">